编辑文本控制器更新小部件值而不调用 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/StreamBuilderFuture/FutureBuilder...等相同的结果。

【讨论】:

以上是关于编辑文本控制器更新小部件值而不调用 setState() - Flutter的主要内容,如果未能解决你的问题,请参考以下文章

在颤振中从父小部件调用 setState 不会更新状态

调用 setState 时,我的有状态小部件不会更新其状态

我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类

Flutter - setState 不更新内部有状态小部件

颤振:如何更新文本小部件值

从无状态小部件调用有状态小部件的 setState