gpt4 book ai didi

flutter - 如果 ChangeNotifier 用提供程序包(类似于 BlocListener)通知,如何 "do"一些东西?

转载 作者:行者123 更新时间:2023-12-03 03:38:00 25 4
gpt4 key购买 nike

我要什么

我有一个简单的模型。该模型来自 ChangeNotifier .如果ChangeNotifier电话notifyListeners()我想“做”一些事情,比如显示一个 SnackBar 或 Dialog。我为模型提供了 Provider打包到我的小部件树。

它可以与什么相提并论?

我用了 flutter_bloc包之前。这个包提供了 BlocListener。使用 BlocListener 我可以对状态变化“做”一些事情。示例代码:

BlocListener<BlocA, BlocAState>(
listener: (context, state) {
// do stuff here based on BlocA's state
},
child: Container(),
)

在上面的例子中, child 不会重建,但我仍然可以根据状态做一些事情。

有什么可与提供程序包相媲美的吗?我在包的文档中读到 ListenableProvider 会给予更多的自由来做“动画”之类的事情。但是我不知道我是否可以以某种方式使用此 Provider 在通知上显示 snackbar 。

编辑:我在 Twitter 上询问了 Provider 的作者 Remi。由于字符数很少,他告诉我我可以使用 didChangeDependencies 来处理这种行为。

最佳答案

请谨慎使用didChangeDependencies为了这。只有少数情况didChangeDepdnencies可以用于此,和 https://github.com/flutter/flutter/pull/49527即使在那些中也会使它变得不可能。

基本问题是didChangeDepdnencies有时(或者,在 #49527 之后,总是)在树被锁定以防止状态更改的点被调用。在拉取请求之前,它只对以下调用是安全的:

  • 不是第一次(从构建范围内调用)
  • 不是元素被停用并最终卸载的时间,因此不再位于树中的有效位置(在拉取请求之后将不再发生此调用)。

  • 一个更安全的方法是:

    @override
    void didChangeDependencies() {
    super.didChangeDependencies();
    if (Provider.of(context).whatever == someCondition) {
    SchedulerBinding.instance.addPostFrameCallback(() {
    // show modal or dialog
    });
    }
    }

    这段代码使用起来更安全,因为它保证在树中状态可以安全更改的点上运行,而不是只在没有帧回调的一些非常特定的场景中工作。

    可能有比这更优雅的解决方案(例如直接在您的 ChangeNotifier 的 notifyListeners 上添加回调,假设它仅在树处于可变状态时触发)。

    关于flutter - 如果 ChangeNotifier 用提供程序包(类似于 BlocListener)通知,如何 "do"一些东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59400368/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com