Flutter未调用setState为何可更新类变量并获取TextFormField最新值
核心原因:你混淆了setState的作用
setState的唯一作用是通知Flutter框架重绘当前组件,它和你更新State类里的变量没有任何关系。- Dart的变量赋值是同步执行的,你在
onChanged回调里执行_currentPassword = val的那一刻,这个类变量的值就已经更新了,后续直接打印当然能拿到最新值。
为什么这个场景不需要调用setState也能正常工作?
你用的TextFormField本身是自带内部状态的StatefulWidget,它自己会维护输入文本的渲染逻辑,不需要你通过外部的_currentPassword变量控制它的显示。你这里只是把输入值同步到自己的类变量里做存储,全程不需要你的ResetPasswordPage重新执行build方法渲染新内容,当然不需要调用setState。
什么情况下你就必须调用setState?
如果你的页面上有其他UI元素依赖_currentPassword的值做展示,比如你需要实时显示密码长度,修改代码如下:
@override Widget build(BuildContext context) { return Column( children: [ TextFormField( onChanged: (val) => { _currentPassword = val, // 只有需要刷新依赖_currentPassword的UI时,才需要调用setState setState(() {}), onChanged() }, ), // 新增的依赖_currentPassword的UI Text('密码长度:${_currentPassword.length}') ], ); }
这时候如果你赋值之后不调用setState,Flutter不会重新执行build方法,那个展示密码长度的Text就永远不会更新,这时候才需要用setState触发重绘。
内容的提问来源于stack exchange,提问作者Manas
相关产品推荐
相关产品推荐

