是否有可能调用setState()其他部件尤其是小部件(嵌入在其它部件)的onPressed()方法,所以只能 是 小部件是重绘?
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, ); } }