首页 > 解决方案 > 如何在 PageView 中动态禁用垂直滑动

问题描述

我想找到一种方法来更新物理参数以PageView从子小部件中禁用父级中的滑动动作。

riverpod用于更新子小部件中的状态,当它构建时知道我应该何时传递NeverScrollableScrollPhysicsphysics父小部件中的参数。但问题是这种方法导致我的子小部件递归重建,因为这使得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

有没有人能够看到解决方案或我做错了什么?

标签: flutter

解决方案


您应该替换null为辅助 ScrollPhysicsPageScrollPhysics()并确保setState(() {});在更新isSwipeBlocked变量时添加。


推荐阅读