【问题标题】:Provider - Selector rebuild when scrolling提供者 - 滚动时选择器重建
【发布时间】:2021-01-15 15:18:19
【问题描述】:

我正在使用如下所示的 Selector 小部件

它的构建方法没有问题,只有在值发生变化时才调用它。 但是,当我使用 Devtools 或 android studio 跟踪小部件重建时,它显示选择器在我滚动时会自行重建,无论是在列表中还是在任何其他支持滚动的小部件中。

是的,选择器在值更改之前没有调用构建方法,但这是正常的吗?

使用开发工具:

正如您所看到的其他 (2) 选择器不一定是触发器,但它们是。

对不起,我的英语不好,如果你不明白我可以在评论部分用另一种方式解释,并提前感谢。

编辑:

我想我知道为什么选择器正在重建它自己,因为我使用提供程序类作为侦听器来使用 changenotifier 滚动控制器方向。 这里的代码 在提供者类中:

bool isHideHomeScreenTabBar = false;

void hideShowTabBar(ScrollDirection scrollDirection) {
  isHideHomeScreenTabBar = scrollDirection == ScrollDirection.reverse;
  notifyListeners();
}

在我的主屏幕中:

_scrollController.addListener(() {
 Provider.of<AppProvider>(context, listen: false).hideShowTabBar(
 _scrollController.position.userScrollDirection);
});

所以基本上提供者在我每次滚动时都会触发 changenotifier,并且选择器会收到通知并重建它自己,但如果值没有改变,选择器将不会触发构建方法(所以它对孩子和选择器的 build 方法中的小部件)。

但即便如此这正常吗?为什么,其他选择器甚至没有监听滚动方向。

无论如何,我找到了一种替代方法(使用动画控制器),但如果有人能解释这里发生的事情,那就太好了,至少对我来说很重要,因为我可能会使用另一种状态管理。

【问题讨论】:

  • 我可以知道你想通过这个实现什么吗?所以我们可以对此有更好的了解。
  • 根据滚动控制器方向隐藏小部件。
  • 你能显示更多代码吗?请复制并粘贴整个代码。我看不到包装选择器的小部件
  • 你能检查一下 Selector 的父节点是否正在重建吗?也许你的itemBuilder 本身又被调用了
  • 选择器的父级是一列,您可以看到它没有重建,因为它正在重建,然后您会在上面的屏幕截图中看到选择器的子级也在重建。我回家后会编辑问题。

标签: flutter dart flutter-dependencies


【解决方案1】:

我知道发生了什么。 我正在为提供程序使用 1 个类,其中包含我需要的所有值以及使用 notifyListeners 的许多方法,但是我认为如果我对我拥有的每个值都使用 Selector,那么使用 1 个提供程序类是可以的,因此任何需要重建的东西只会在它重建时重建需要它。

这种方法的问题在于,每个 notifyListeners 调用都会通知每个选择器并自行重建它(在我的情况下,当检测到任何滚动时),但如果值未更改,则选择器不会调用构建器。

修复方法是在调用 notifyListeners 之前设置一些条件来检查旧值和新值,这在我的情况下是完美的,当我按预期滚动到 1 时,这会减少重建的麻烦,但是另一个同一个类中的选择器也会重建(我猜是因为它们都在同一个类中,所以每个 notifyListeners 都调用它们)。

最后,如果您遇到类似的问题,最好使用 ProxyProvider 或任何让您使用多个提供程序的方式,除了更好的项目架构和处置它的好处之外,更好地控制状态.

感谢 Rémi Rousselet Riverpod,它比 ProxyProvider 好得多,我正在使用它,它很棒,所以如果你想使用 ProxyProvider,请考虑 Riverpod。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多