提供程序-滚动时重建选择器

时间:2020-09-30 00:21:12

标签: flutter dart flutter-dependencies

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

enter image description here

它的build方法没有问题,仅在值更改时调用它。 但是,当我使用Devtools或android studio跟踪小部件的重建时,这表明无论是在列表中还是在其他支持滚动的小部件中滚动时,Selector都可以自我重建。

enter image description here

是的,直到值更改,选择器才调用build方法,但这是正常现象吗?

使用Devtools: enter image description here

如您所见,其他(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方法(因此,它对于子代和选择器的构建方法中的窗口小部件。)

但是,这是正常的吗?以及原因,其他选择器甚至都没有收听滚动方向。

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

1 个答案:

答案 0 :(得分:0)

我知道发生了什么。 我正在为提供程序使用1个类,该类包含我使用notifyListeners的许多方法所需要的所有值,但是我认为,如果我为每个拥有的值使用Selector,则可以使用1个提供程序类,因此任何需要重建的内容都将在重建时使用需要它。

这种方法的问题在于,每次notifyListeners调用时,每个选择器都会得到通知并自行重建(在我的情况下,当检测到任何滚动时),但是如果值保持不变,则选择器不会调用生成器。

解决方法是使某些条件在调用notifyListeners之前检查旧值和新值,这在我的情况下是非常有效的,当我按预期滚动到仅1时,这减少了重建的障碍,但是其他情况同一类中的选择器也会重建(我猜是因为它们都在同一类中,所以每个notifyListeners调用都会影响它们)。

最后,如果您遇到类似的问题,则最好使用ProxyProvider或任何允许您使用多个供应商的方法,除了更好的项目体系结构和处理的好处之外,更好地控制状态

感谢RémiRousselet Riverpod,它比ProxyProvider更好,而且我正在使用它,而且它很棒,因此,如果要使用ProxyProvider,请考虑使用Riverpod。