繁体   English   中英

每当在 TextFormField Flutter 中触发验证 function 时,如何重建小部件?

[英]How to rebuild a widget whenever the validation function is triggered in TextFormField Flutter?

我收到以下错误消息:

══╡基金会图书馆捕获的例外╞═════════════════════════════════════════ ═══════════════ 在为 ErrorTextNotifier 调度通知时抛出以下断言:在构建期间调用了 setState() 或 markNeedsBuild()。 此 _InheritedProviderScope<ValidityNotifier?> 小部件无法标记为需要构建,因为框架已经在构建小部件的过程中。 仅当其祖先之一当前正在构建时,才可以在构建阶段将小部件标记为需要构建。 这个例外是允许的,因为框架在子部件之前构建父部件,这意味着总是会构建一个脏的后代部件。 否则,框架可能不会在此构建阶段访问此小部件。 调用 setState() 或 markNeedsBuild() 的小部件是:_InheritedProviderScope<ValidityNotifier?> 进行违规调用时当前正在构建的小部件是:这是我的代码(我不得不省略一堆代码)TextFormField


 @override
 Widget build(BuildContext context) {
   return ChangeNotifierProvider(
     create: (_) => ValidityNotifier(),
     child: Builder(builder: (context) {
       return Column(
         children: [
           TextFormField(
             autovalidateMode: AutovalidateMode.onUserInteraction,
             validator: (str) {
               var validity = //custom validity function
               Provider.of<ValidityNotifier>(context, listen: false).setValidity(validity);
               return null;
             },
           ),
           Consumer<ValidityNotifier>(builder: (context, model, child) {
             if (model.isValid) {
               return Text("Custom Validity Message")
             }
             return const SizedBox.shrink();
           }),
         ],
       );
     }),
   );
 }
}

class ValidityNotifier extends ChangeNotifier {
 bool _isValid = false;

 bool get isValid => _isValid;

 void setValidity(bool isValid) {
   _isValid=isValid;
   notifyListeners();
 }
}

我希望每次调用验证 function 时更改 state,我考虑过向 TextEditingController 添加一个侦听器,但每次输入时都会触发重建。

正如错误消息所说,您正在运行并发构建。 当您调用setValidity由于notifyListeners而触发重建时, Flutter 已经在构建TextFormField的过程中。

您可以使用后帧回调,在这种情况下, setValidity方法调用将仅在当前构建完成后运行。

代替:

Provider.of<ValidityNotifier>(context, listen: false).setValidity(validity);

尝试这个:

WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  Provider.of<ValidityNotifier>(context, listen: false)
      .setValidity(validity);
});

TextFormField 内部

autovalidateMode: AutovalidateMode.onUserInteraction,
validator: (value) => value!.isEmpty ? "Your special string here" : null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM