编辑文本控制器更新小部件值而不调用 setState() - Flutter
Posted
技术标签:
【中文标题】编辑文本控制器更新小部件值而不调用 setState() - Flutter【英文标题】:EditingTextController updates widget value without calling setState() - Flutter 【发布时间】:2019-09-27 21:35:23 【问题描述】:这可能不是技术问题,但是,我读到,每当您想更改 StatefullWidget 状态时,都需要调用 setState() 函数。我对 EditText() 小部件进行了测试,并使用 EditingTextController 作为小部件控制器,我从用户定义的函数中调用了 controller.text = "some text"
,而没有调用 setState()
函数和EditText() 的值更改为 some text !
我想知道这是怎么做到的?我阅读了文档,它说EditingTextController
将更改小部件的值,但我们已经知道为了更改
State Full Widget 状态需要调用setState()
【问题讨论】:
【参考方案1】:这是真的。但是要更改 Flutter 中的状态,您还有其他选择,setState(() );
只是其中之一。另一种选择是创建Notifier -> listener
,然后将监听器设置为监听通知器,就像这样TextFormField(controller: _controller,...)
所以通知器(控制器)上的任何更新都会通知监听器(TextFormField)进行自我更新。强>
例如:
//...
final _controller = TextEditingController();
//...
child: TextFormField(
controller: _controller,
decoration: InputDecoration(border: OutlineInputBorder()),
),
在这个例子中:
_controller:是一个 ChangeNotifier。 TextFormField:是这个 ChangeNotifier(_controller) 的监听器。一旦你调用这个_controller.text=..
,_controller(被认为是ChangeNotifier see this。)“将通知这个TextEditingController的所有监听器他们需要update",所以它会给你与使用setState(() );
或Stream/StreamBuilder
或Future/FutureBuilder
...等相同的结果。
【讨论】:
以上是关于编辑文本控制器更新小部件值而不调用 setState() - Flutter的主要内容,如果未能解决你的问题,请参考以下文章
我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类