如何在TextFormField Flutter中触发验证函数时重建一个小部件?

58wvjzkj  于 2023-01-27  发布在  Flutter
关注(0)|答案(2)|浏览(153)

我收到以下错误消息:
由基础库捕获的异常在为ErrorTextNotifier调度通知时引发了以下Assert:设置状态()或标记需要构建()。无法将此_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();
 }
}

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

vjrehmav

vjrehmav1#

正如错误消息所示,您有并发构建正在运行。当您调用setValidity时,由于notifyListeners而触发重建,Flutter已经在构建TextFormField的过程中。
您可以使用post frame callback,在这种情况下,setValidity方法调用将仅在当前构建完成后运行。
取代:

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

试试这个:

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

8cdiaqws2#

在文本表单字段内部

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

相关问题