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