Flutter报错:build期间调用setState()/markNeedsBuild()求助
解决Flutter中
setState() or markNeedsBuild() called during build异常 这个错误的核心原因是:TextEditingController在初始化并设置初始值后,会立即发送值变化通知,而此时你的ValueListenableBuilder正处于组件构建流程中,触发的重建请求和当前正在执行的构建流程冲突,导致框架抛出断言错误。
直接有效的解决方案
把TextEditingController的初始化逻辑移到initState方法中,避免在组件构建阶段触发控制器的通知:
class UserAddAddressState extends State<UserAddAddress> { late TextEditingController controllerName; String autocompletePlace = "null"; final _formKey = GlobalKey<FormState>(); @override void initState() { super.initState(); // 在initState中初始化控制器并设置初始值,此时组件还未进入build流程 controllerName = TextEditingController( text: widget.getInformations["nameAddress"], ); } @override void dispose() { // 务必销毁控制器,避免内存泄漏 controllerName.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, body: Container( padding: EdgeInsets.all(defaultMainMargin), child: Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ TitleDefault(content: "Adresse"), SizedBox(height: defaultMainMargin), TextFormFieldDefault( label: "Name", minLength: 1, controller: controllerName, // 移除这里的initialValue,因为控制器已经通过text参数设置了初始值 ), SizedBox(height: defaultMainMargin), ButtonLikeFormFieldDefault( onPressed: () => widget.selectAddress(controllerName.text), content: widget.getInformations["address"], ), ValueListenableBuilder( valueListenable: controllerName, builder: (BuildContext context, TextEditingValue value, Widget? child) { return Container(); }, ), ], ), ), )); } }
为什么这样能解决问题
initState是组件生命周期中最早的方法之一,此时组件还未进入build流程,设置控制器初始值后发送的通知,不会触发正在进行的构建操作。- 当组件进入build阶段时,
ValueListenableBuilder会监听已经初始化完成的控制器,后续的输入变化通知会在正常的流程中处理,不会和构建流程冲突。
内容的提问来源于stack exchange,提问作者Milaethe
相关产品推荐
相关产品推荐

