在 deactivate() 中调用 notifyListeners() 会导致错误 - Flutter

Posted

技术标签:

【中文标题】在 deactivate() 中调用 notifyListeners() 会导致错误 - Flutter【英文标题】:Calling notifyListeners() causes errors when called in deactivate() - Flutter 【发布时间】:2021-02-20 16:51:27 【问题描述】:

我已阅读与此问题相关的所有问题,但没有一个问题与我的相似。

我有两个页面:主页和设置页面。在主页上,我用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() 调用build() Widgets 监听它的方法。但是当我离开设置页面时,我没有看到任何小部件的 build() 方法被调用。我该怎么办?

一般来说,有没有办法在我离开页面时拨打notifyListeners()

【问题讨论】:

【参考方案1】:

这可能是你覆盖了错误的函数:

当小部件暂时停用时调用 deactivate 尝试使用"dispose, which is called after deactivate if the widget is removed from the tree permanently"

一般来说,我建议您看一下导航,也许在您要路由到页面的位置上的一个简单的"onPopPage" 可能就是您要查找的内容。

【讨论】:

好吧,dispose() 给出了同样的错误,我不知道如何实现onPopPage 我分析了导航,发现我必须更改更多内容才能使其正常工作。它现在有效,没有你,这是不可能的。我会奖励你,但不会接受答案,因为它真的没有回答我的问题。希望你能理解。

以上是关于在 deactivate() 中调用 notifyListeners() 会导致错误 - Flutter的主要内容,如果未能解决你的问题,请参考以下文章

为什么wait和notify方法要在同步块中调用?

在持有互斥锁的同时调用 notify_one()/notify_all() 是不好的做法吗?

Java线程的wait(), notify()和notifyAll()

在 XE3 中使用自动更新进行实时绑定(无需像在 XE2 中那样调用 Notify())

java的notify方法为啥也要同步

(转)为什么wait(),notify()和notifyAll()必须在同步块或同步方法中调用