Flutter 提供程序-滚动时重新生成选择器

Flutter 提供程序-滚动时重新生成选择器,flutter,dart,flutter-dependencies,Flutter,Dart,Flutter Dependencies,我正在使用选择器小部件,如下所示 它的构建方法没有问题,只在值更改时调用它。 但是,当我使用Devtools或androidstudio跟踪widget rebuild时,无论是在列表中还是在支持滚动的任何其他widget中,选择器都会在滚动时自动重建 是的,选择器直到值更改才调用build方法,但这正常吗 使用Devtools: 正如您所见,其他(2)选择器不一定是触发器,但它们确实是 对不起,我的英语不好,如果您不理解我的意思,我可以在评论部分用另一种方式解释,并提前表示感谢 编辑:

我正在使用选择器小部件,如下所示

它的构建方法没有问题,只在值更改时调用它。 但是,当我使用Devtools或androidstudio跟踪widget rebuild时,无论是在列表中还是在支持滚动的任何其他widget中,选择器都会在滚动时自动重建

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

使用Devtools:

正如您所见,其他(2)选择器不一定是触发器,但它们确实是

对不起,我的英语不好,如果您不理解我的意思,我可以在评论部分用另一种方式解释,并提前表示感谢

编辑:

我想我知道为什么选择器正在重建它自己,因为我使用provider类作为监听器来滚动控制器方向和changeinnotifier。 这是密码 在提供程序类中:

bool isHideHomeScreenTabBar = false;

void hideShowTabBar(ScrollDirection scrollDirection) {
  isHideHomeScreenTabBar = scrollDirection == ScrollDirection.reverse;
  notifyListeners();
}
在我的主屏幕中:

_scrollController.addListener(() {
 Provider.of<AppProvider>(context, listen: false).hideShowTabBar(
 _scrollController.position.userScrollDirection);
});
\u scrollController.addListener(){
Provider.of(context,listen:false).hideshowtabar(
_scrollController.position.userScrollDirection);
});
因此,基本上,提供者触发器changenotifier与我所做的每一个滚动和选择器得到通知,并重建它的自我,但如果该值没有改变,选择器将不会触发构建方法(因此它适用于选择器的构建方法中的子项和小部件)

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

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

我知道发生了什么。 我使用1个类作为提供程序,其中包含许多使用notifyListeners的方法所需的所有值,但是,如果我对每个值都使用选择器,则可以使用1个提供程序类,这样需要重建的任何对象都只能在需要时重建

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

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

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


由于Remi-RouSeleRippod,它比PROXYOVER更好,我使用它,它很棒,所以如果你想使用PROXIOPLAGER,请考虑Riverpod。我可以知道你想通过这个实现什么吗?所以我们可以更好地了解这一点。根据滚动控制器的方向隐藏一个小部件。你能显示更多代码吗?复制并粘贴整个代码。我看不到包裹选择器的窗口小部件,或者您是否可以检查选择器的父级是否正在重建?可能您的

itemsbuilder
本身被再次调用。选择器的父级是一列,您可以看到它没有重建,因为它正在重建,然后您可以在上面的屏幕截图中看到选择器的子项也正在重建。我回家后会编辑问题。