由父级重新渲染时,将条形条创建为单独的小部件并在Flutter中保持滚动位置

时间:2020-09-05 22:47:53

标签: flutter flutter-sliver flutter-widget

我有一个名为TopBar的小部件。初始化后,此小部件将开始侦听滚动。

  @override
  void initState() {
    super.initState();
    _scrollController = new ScrollController();
    _scrollController.addListener(() => setState(() {}));
  }

TobBar小部件在其子参数中将一系列小部件作为重音,然后(大约)返回以下小部件树:

-CustomScrollView
---SliverAppBar
---SliverList(children widget that were accepted as a parameter).

我有另一个无状态的小部件,称为SettingsPage。此页面使用TopBar小部件,并将几个容器传递到TopBar中,如下所示:

TopBar(key: UniqueKey(), children: listOfWidgetsFromSettingsPage)

结果,我有一个带有条形条和一些可滚动内容的页面。

当传递给TopBar的一个子项由于SettingsPage的模型更改而发生更改时,会发生此问题。当其中一个子项发生更改时,整个TopBar小部件将重新呈现,从而使滚动控制器重新初始化回到其原始起始位置,因此,如果在滚动中更改了一个子项,则滚动将返回到顶部页面。

我找到了一种解决方案:保存滚动位置,然后将此位置传递到TopBar小部件中以保持重新渲染时的位置。

但是,我感觉到此问题的发生是因为我没有遵循有关滚动条以及如何“部件化”的最佳实践。之所以将其制成单独的小部件,是因为我正在进行一些花哨的滚动操作,因此该小部件有很多特定的逻辑,我希望远离其他页面视图。建议使用什么方法来解决此问题?

0 个答案:

没有答案