我收到以下错误消息:
由基础库捕获的异常在为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添加一个侦听器,但每次输入时都会触发重建。
2条答案
按热度按时间vjrehmav1#
正如错误消息所示,您有并发构建正在运行。当您调用
setValidity
时,由于notifyListeners
而触发重建,Flutter已经在构建TextFormField
的过程中。您可以使用post frame callback,在这种情况下,
setValidity
方法调用将仅在当前构建完成后运行。取代:
试试这个:
8cdiaqws2#
在文本表单字段内部