【问题标题】:How to ensure dispose() will be called before new widget's initState()?如何确保在新小部件的 initState() 之前调用 dispose()?
【发布时间】:2021-08-16 20:45:57
【问题描述】:

我想在每次创建和处理小部件时使用几个函数。但是在我导航到下一页(另一个小部件)后,我希望应该首先调用前一个小部件的 dispose()。之后,调用下一个小部件的initState()。但它不是那样工作的。我导航到下一页并调用该页面的initState()。在调用之前的小部件的dispose() 之后。

如何确保前一个小部件的 dispose() 先于下一个小部件的 initState() 被调用?或者如果没有dispose(),我如何实现相同的行为?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    当您从小部件 A 导航到 B 时,第一个只会在转换完成后完全 dispose()。这意味着在两者之间,A 和 B 都在被渲染,因此,第一个还没有处理,第二个已经启动 - 这是有道理的,否则你将无法在转换时同时看到两者.

    因此,您应该确保小部件 B 的逻辑不依赖于处理小部件 A 并解耦它们之间的依赖关系。

    也许通过提供您的用例,我可以根据您的需要用更好的方法更新我的答案。

    基于 cmets 编辑:

    您可以将呼叫转移到:

    @override
    void deactivate() {
      super.deactivate();
      Wakelock.disable();
    }
    

    【讨论】:

    • 感谢您的回答。我的应用正在显示视频,我想在视频期间保持设备唤醒。因此,我在initState() 中使用Wakelock.enable() 并且它正在工作。用户导航到其他地方后,我需要使用Wakelock.disable() 禁用唤醒锁。在我的特殊情况下,用户可以跳到下一个视频。而且因为我使用相同的小部件来显示视频,所以每次我导航到下一个视频时,在 initState() 中我调用 Wakelock.enable() 并且完全没问题。但我也想使用dispose(),因为要使用Wakelock.disable()
    • 如果有办法确保我在下一个小部件调用其initState() Wakelock.enable() 之前调用Wakelock.disable()。反之亦然不合适,因为第一个 initState() 调用 Wakelock.enable() 而前一个小部件的 dispose() 将调用 Wakelock.disable()。这不是预期的。
    • 是的,您可以将该呼叫移至deactivate() 而不是dispose(),因为它将立即被调用。我已经相应地更新了我的答案。
    • 不幸的是,deactivate() 在下一个小部件的initState() 之后仍然被调用
    • 好吧,你是对的。您需要另一种方法,将导航观察者添加到小部件的状态。从那里,您可以覆盖将告诉您何时推送或弹出另一个小部件的方法。
    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 2021-02-17
    • 2020-06-07
    • 2019-11-24
    • 2021-04-14
    • 2021-10-28
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多