我已经阅读了与此问题相关的所有问题,但它们都与我的问题不相似。
我有两个页面:主页和设置页面。在主页中,我用Consumer
收听提供商的更改。在设置页面中,我不听取更改:
class _SettingsState extends State<Settings> {
StatesProvider states;
@override
void initState() {
states = Provider.of<StatesProvider>(context, listen: false);
super.initState();
}
@override
Widget build(BuildContext context) {
return myUi();
}
@override
void deactivate() {
states.changeSettings(settings); //just a dummy function, doesn't do anything
states.finishSetting();
super.deactivate();
}
}
我删掉了不必要的代码。我在上面的代码中试图做的是更改一些应用程序设置,并在离开设置页面时应用它们。
finishSetting()
方法:
finishSetting() {
notifyListeners();
}
错误:
The following assertion was thrown while dispatching notifications for StatesProvider:
setState() or markNeedsBuild() called during build.
我知道notifyListeners()
调用了Widgets的build()
方法来监听它。但当我离开设置页面时,我没有看到任何小部件的build()
方法被调用。我该怎么办?
一般来说,当我离开页面时,有没有方法调用notifyListeners()
?
这可能是您覆盖了错误的函数:
当小部件被暂时停用时,调用- deactivate
- 尝试使用";dispose,如果小部件被永久地从树中移除则在去激活之后调用"dispose">
总的来说,我建议你看看导航,也许是一个简单的";onPopPage";在你路由到你的页面的地方可能就是你想要的。