flutter - Flutter: Pageview builder : 有效地激活和停用监听器
问题描述
我在 Pageviewbuilder 的帮助下创建了一个无限的页面列表。
body: PageStorage(
bucket: bucket,
child: PageView.builder(
scrollDirection: Axis.vertical,
physics: ClampingScrollPhysics(),
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Page(index: index, controller: controller);
}),
));
控制器设置为:
controller = PageController(
viewportFraction: 1.0,
);
为页面获取数据的监听器分别在上述页面小部件的 initState() 和 dispose() 中附加/分离:
void initState() {
super.initState();
print('Init State of Page ${widget.index} called..');
//--- Listener activate ---
}
void dispose() {
super.dispose();
//--- Listener Deactivate ---
}
虽然这没有问题,但有两个观察结果:
- 当用户从 Page-1 到 Page-2 进行最轻微的滚动时,即使在下一页进入视图之前以及当释放滚动,Page-2 的 dispose() 被滚动。
- 滚动方向设置为垂直。但是,在 Page-2 中,如果用户尝试水平滚动,则会出现轻微的抖动,从而导致 Page-1 的构建启动。
我打算实现的目标:
- 只有当 Page-1 的滚动超过 Page-1 的 50% 时,才会调用 Page-2 的 init State。
- 在各个页面上激活和停用侦听器的正确方法。
任何输入都会非常有帮助。谢谢你。
解决方案
要侦听 PageView 上的页面更改,您可以使用PageView.onPageChanged(int)
- 每当视口中显示的页面发生更改时调用,如docs中所述。
PageView.builder(
onPageChanged: (int page){
// Do something
},
scrollDirection: Axis.vertical,
physics: ClampingScrollPhysics(),
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Page(index: index, controller: controller);
},
),
推荐阅读
- javascript - 如何检查用户是否可以接受 DM
- python - 更 Pythonic 的 If-Else-Pass 编写方式
- reactjs - 如何正确地将参数传递给 useCallback() 钩子?
- chatbot - 我们可以在 headful 模式和(或)Selenium Grid 下运行 BotiumCLI-WebdriverIO 吗?如果是,我们如何修改 Botium.json 来实现这一点?
- google-maps-sdk-ios - 谷歌地图崩溃
iOS Swift,-[GMSTileDataCache loadTileForTileCoords:dataVersion:completionHandler:] - android - 服务通知文本使用系统语言
- teradata - Teradata 无法将日期字符串转换为数值
- http - 在 httputil 反向代理中设置请求正文
- python - Pandas - 如何按照定义的步骤删除行?
- python-3.x - 两个数据框之间的列差异