Flutter 小部件停用后,如何捕获ChangeNotifier中的错误?
我在Flutter 小部件停用后,如何捕获ChangeNotifier中的错误?,flutter,dart,flutter-provider,Flutter,Dart,Flutter Provider,我在模型中有代码执行。我向提供商提供型号。但是,如果在完成执行之前处置了模型,则会出现错误: E/flatter(26180):[错误:flatter/lib/ui/ui\u dart\u state.cc(148)] 未处理的异常:在释放后使用了模型。E/颤振 (26180):一旦对模型调用了dispose(),它就不能再 被使用 例如,如果用户按“后退”按钮,则Model将被释放,因此Navigator.pop()。这是因为Model是此小部件的唯一作用域 但这意味着我无法捕捉到模型中的错误
模型中有代码执行。我向提供商提供型号
。但是,如果在完成执行之前处置了模型
,则会出现错误:
E/flatter(26180):[错误:flatter/lib/ui/ui\u dart\u state.cc(148)]
未处理的异常:在释放后使用了模型。E/颤振
(26180):一旦对模型调用了dispose(),它就不能再
被使用
例如,如果用户按“后退”按钮,则Model
将被释放,因此Navigator.pop()
。这是因为Model
是此小部件的唯一作用域
但这意味着我无法捕捉到模型中的错误
我的代码:
class Model extends ChangeNotifier {
bool error = false;
func() {
try {
await execute();
error = false
} catch {
error = true;
print(e.toString());
}
}
}
class ExampleWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (context) => Model(),
child: Consumer<Model>(builder: (context, model, _) {
return FloatingActionButton(
child: model.error ? Icon(Icons.error) : Icon(Icons.check),
onPressed: () {
model.func();
}
);
…
类模型扩展了ChangeNotifier{
布尔误差=假;
func(){
试一试{
等待执行();
错误=错误
}抓住{
错误=真;
打印(如toString());
}
}
}
类ExampleWidget扩展了无状态Widget{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
生成器:(上下文)=>Model(),
子项:使用者(生成器:(上下文、模型、3;){
返回浮动操作按钮(
子项:model.error?图标(Icons.error):图标(Icons.check),
已按下:(){
model.func();
}
);
…
如何在dispose之后捕获模型中的错误?我也遇到了同样的问题
发生此错误的原因是,在调用dispose()
之后,您使用了一个ChangeNotifier
方法,通常是notifyListeners()
(我假设您正在调用该方法,但不包括粘贴的代码)。顺便说一句,这是一个断言错误,因此仅在调试版本中
要消除此错误,可以在使用自己的标志调用notifyListeners()
之前检查对象是否已被释放:
class Model extends ChangeNotifier {
bool error = false;
bool isDisposed = false;
func() {
try {
await execute();
error = false
} catch {
error = true;
print(e.toString());
}
if (!isDisposed) {
notifyListeners();
}
}
@override
void dispose() {
isDisposed = true;
super.dispose();
}
}
你昨天已经发布了这个问题,并将其与我的答案一起删除。即使我提供了一个aswer,你怎么能够删除它?@CreativeCreatorMormaybeno我以前没有发布错误的问题。更具体地说,你的答案是错误的。即使检查挂载?
有状态小部件仍然会得到错误,小部件被停用。我希望有了更多的代码,每个人都能更清楚地看到为什么我不能捕获错误并打印到控制台我不确定我的问题是否完全相同,但我的代码中有一些未使用的“notifiyListeners”,并导致我收到此错误…删除解决了它!!!