Flutter-从其他小部件调用setState()

是否有可能调用setState()其他部件尤其是小部件(嵌入在其它部件)的onPressed()方法,所以只能 小部件是重绘?

我想单击按钮,然后查看“ MyTextWidget”的状态进行更改。布局的其余部分相同,没有任何更改,因此不应重写。

这是我的代码:

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return new MaterialApp(

title: 'Timer',

theme: new ThemeData(

primaryColor: Colors.grey.shade800,

),

home: new MyHomePage(),

);

}

}

class MyHomePage extends StatelessWidget {

int _seconds = 1;

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text("title"),

),

body: Column(

mainAxisAlignment: MainAxisAlignment.spaceAround,

children: <Widget>[

MyTextWidget(), //just update this widget

Divider(),

Row(

mainAxisAlignment: MainAxisAlignment.spaceAround,

children: <Widget>[

IconButton(

icon: Icon(Icons.add_circle),

onPressed: _addPressed,

iconSize: 150.0,

),

IconButton(

icon: Icon(Icons.remove_circle),

onPressed: ()=> print("to be implemented"),

iconSize: 150.0,

),

],

)

],

),

);

}

void _addPressed() {

//somehow call _updateSeconds()

}

}

这是我要更新的全状态MyTextWidget。

class MyTextWidget extends StatefulWidget{

@override

_MyTextWidgetState createState() => _MyTextWidgetState();

}

class _MyTextWidgetState extends State<MyTextWidget> {

int secondsToDisplay = 0;

void _updateSeconds(int newSeconds) {

setState(() {

secondsToDisplay = newSeconds;

});

}

@override

Widget build(BuildContext context) {

return Text(

secondsToDisplay.toString(),

textScaleFactor: 5.0,

);

}

}

我想要实现的目标似乎很简单,但我无法弄清楚。想象一下,如果“

MyTextWidget”埋在巨大的布局树中,并且每次我想对其进行更新时,都需要重新绘制整个树。

回答:

这是使用流的可能解决方案:

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {

@override

Widget build(BuildContext context) {

return new MaterialApp(

title: 'Timer',

theme: new ThemeData(

primaryColor: Colors.grey.shade800,

),

home: new MyHomePage(),

);

}

}

class MyHomePage extends StatelessWidget {

StreamController<int> _controller = StreamController<int>();

int _seconds = 1;

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

title: Text("title"),

),

body: Column(

mainAxisAlignment: MainAxisAlignment.spaceAround,

children: <Widget>[

MyTextWidget(stream: _controller.stream), //just update this widget

Divider(),

Row(

mainAxisAlignment: MainAxisAlignment.spaceAround,

children: <Widget>[

IconButton(

icon: Icon(Icons.add_circle),

onPressed: _addPressed,

iconSize: 150.0,

),

IconButton(

icon: Icon(Icons.remove_circle),

onPressed: ()=> _controller.add(_seconds++),

iconSize: 150.0,

),

],

)

],

),

);

}

void _addPressed() {

//somehow call _updateSeconds()

}

}

class MyTextWidget extends StatefulWidget{

final Stream<int> stream;

MyTextWidget({this.stream});

@override

_MyTextWidgetState createState() => _MyTextWidgetState();

}

class _MyTextWidgetState extends State<MyTextWidget> {

int secondsToDisplay = 0;

void _updateSeconds(int newSeconds) {

setState(() {

secondsToDisplay = newSeconds;

});

}

@override

void initState() {

super.initState();

widget.stream.listen((seconds) {

_updateSeconds(seconds);

});

}

@override

Widget build(BuildContext context) {

return Text(

secondsToDisplay.toString(),

textScaleFactor: 5.0,

);

}

}

以上是 Flutter-从其他小部件调用setState() 的全部内容, 来源链接: utcz.com/qa/424465.html

回到顶部