flutter - 如何在 PageView 中动态禁用垂直滑动
问题描述
我想找到一种方法来更新物理参数以PageView
从子小部件中禁用父级中的滑动动作。
我riverpod
用于更新子小部件中的状态,当它构建时知道我应该何时传递NeverScrollableScrollPhysics
给physics
父小部件中的参数。但问题是这种方法导致我的子小部件递归重建,因为这使得PageView
重建更新物理参数。所以我真的不知道在这里做什么。
我有这个构建 PageView 的父 Widget:
Widget build(BuildContext context) {
final _navBar = useProvider(bottomNavigationBarProvider);
return PageView(
physics: navBar.isSwipeBlocked ? const NeverScrollableScrollPhysics() : null,
controller: pageController,
onPageChanged: onPageChanged,
children: [
Beamer(
key: const Key('feed-tab'),
routerDelegate: BeamerDelegate(locationBuilder: (state) => FeedLocation(state)),
),
]
)
}
以及更新状态变量的子 Widget:
Widget build(BuildContext context) {
final _navBar = useProvider(bottomNavigationBarProvider.notifier);
useEffect(() {
Future.microtask(() => _navBar.blockSwipe());
}, []);
return Container(...);
}
因此,当FeedLocation
加载时,它会更新_navBar
以尝试禁用滚动行为。但正如我所提到的,这会导致父级重建并FeedLocation
再次构建,然后是递归状态..
这个想法是能够去FeedLocation
,禁用滚动,然后当返回时,再次启用它,但我没有看到解决方案。
我想我已经使用 Riverpod做了这个人建议的https://github.com/flutter/flutter/issues/37510#issuecomment-738051469
而且我想我的情况与来自同一线程的这些人类似https://github.com/flutter/flutter/issues/37510#issuecomment-864416592
有没有人能够看到解决方案或我做错了什么?
解决方案
您应该替换null
为辅助 ScrollPhysicsPageScrollPhysics()
并确保setState(() {});
在更新isSwipeBlocked
变量时添加。
推荐阅读
- python-3.x - 有人可以解释一下python中的广播分配是什么吗?
- angular - MatSnackBar panelClass 无法从服务中工作
- python - Jupyter 自动完成功能仅适用于导入的单元格
- android - API 应该以 JSON 格式返回数据,但不显示在布局中
- bash - 如何在包含 JSON 的文件中使用 bash 脚本返回字段的最后一次出现
- c# - UITextField 提示时键盘不显示
- javascript - 使用函数 getElementsByTagName 获取具有动态 ID 的元素的问题 - NightwatchJS
- python-3.x - FeatureTools GroupBy 问题不包括实体
- mysql - macOS Mojave 中的 Laravel 连接错误?
- python - 检查 Series 标签不存在于单独的 DataFrame 中