【发布时间】:2020-05-19 03:33:48
【问题描述】:
当我尝试调用 State dispose 方法中的方法时,如下所示。
@override
void dispose() {
Provider.of<AppProvider>(context, listen: false).close();
super.dispose();
}
我知道了。
The following assertion was thrown while finalizing the widget tree:
Looking up a deactivated widget's ancestor is unsafe.
At this point the state of the widget's element tree is no longer stable.
To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
When the exception was thrown, this was the stack
#0 Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure>
package:flutter/…/widgets/framework.dart:3508
#1 Element._debugCheckStateIsActiveForAncestorLookup
package:flutter/…/widgets/framework.dart:3522
#2 Element.getElementForInheritedWidgetOfExactType
package:flutter/…/widgets/framework.dart:3588
#3 Provider.of
package:provider/src/provider.dart:219
#4 _MySecondPageState.dispose
package:test_space/main.dart:138
...
这是我的示例 AppProvider
class AppProvider {
close() {}
}
我用 AppProvider 包装了 MaterialApp
return Provider<AppProvider>(
create: (_) => AppProvider(),
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomeScreen(),
},
),
);
我不知道该怎么做To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
我目前正在使用provider: ^4.0.2。
我以前也是这样做的,在 dispose() 中使用 Provider.of(context),之前没有这个例外。这是因为新的颤振版本吗? 另外,我意识到有 deactivate() 方法,我应该使用 deactivate() 方法而不是 dispose() 方法吗?
[更新]
AppProvider _appProvider;
@override
void didChangeDependencies() {
_appProvider = Provider.of<AppProvider>(context, listen: false);
super.didChangeDependencies();
}
@override
void dispose() {
_appProvider.close();
super.dispose();
}
I could also use deactivate in a certain case
@override
void deactivate() {
Provider.of<AppProvider>(context, listen: false)
.close();
super.deactivate();
}
【问题讨论】:
标签: flutter dart flutter-layout