[英]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.