提供者 - 滚动时选择器重建

4
我正在使用如下所示的选择器小部件:

enter image description here

它的构建方法没有问题,只有在值发生变化时才调用它。但是当我使用 Devtools 或者 Android Studio 来跟踪小部件重建时,它显示在滚动列表或任何其他支持滚动的小部件中滚动时 Selector 本身将重建。

enter image description here

是的,Selector 直到值改变才会调用构建方法,但这正常吗?
使用 Devtools: enter image description here 如您所见,其他 (2) 个选择器没有被触发,但它们仍然被重建了。
如果你没有理解我的话,我可以在评论区另外解释一遍。
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触发,选择器被通知并重新构建自己,但如果值没有改变,选择器不会触发构建方法(因此对于选择器的子级和构建方法中的小部件来说可以正常工作)。

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

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


请问您想通过这个实现什么目标?这样我们可以更好地了解。 - Sanket Vekariya
根据滚动控制器的方向隐藏小部件。 - Mohammed Alfateh
你能展示更多的代码吗?请复制粘贴整个代码。我看不到小部件包装选择器。 - CoderUni
选择器的父级是一列,正如您所看到的,它没有重建,因为如果它正在重建,那么您将在上面的屏幕截图中看到选择器的子项也在重建。我回家后会编辑问题。 - Mohammed Alfateh
重建可能不是由选择器引起的,而是由上面的某些其他依赖项更改引起的,例如size - Pavel
显示剩余3条评论
1个回答

0

我知道发生了什么事情。 我使用一个包含我需要的所有值和许多使用notifyListeners方法的方法的提供程序的类,但是我认为如果我为每个值使用Selector,那么只要需要重建的内容就会重建,因此使用1个提供程序类是可以的。

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

解决方法是在调用notifyListeners之前检查旧值和新值的某些条件,这在我的情况下非常有效,它将重建发生的减少到只有1个,因为它的预期,但是同一类中的其他选择器也会重建(我猜这是因为它们都在同一个类中,因此每个notifyListeners调用都会影响它们)。

最后,如果您遇到类似的问题,最好使用ProxyProvider或任何允许您使用多个提供程序的方式,除了更好的项目架构和处理外,还可以更好地控制状态。

感谢Rémi Rousselet Riverpod,它比ProxyProvider好得多,我正在使用它,它非常棒,因此如果您想使用ProxyProvider,请考虑Riverpod。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接