使用 PageView 保持状态的 BottomNaviationBar 中 GoogleMap 小部件的滚动问题

问题描述

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView(
        children: _children,controller: pageController,onPageChanged: onPageChanged,),bottomNavigationBar: BottomNavigationBar(
        onTap: onTabTapped,backgroundColor: Colors.grey[100],currentIndex: _currentIndex,items: [
          BottomNavigationBarItem(
            icon: new Icon(Icons.navigation),label: 'Track',BottomNavigationBarItem(
            icon: new Icon(Icons.settings),label: 'Settings',BottomNavigationBarItem(
            icon: Icon(Icons.person),label: 'Profile',)
        ],);
  }

  void onTabTapped(int value) {
    pageController.jumpToPage(value);
  }

  void onPageChanged(int index) {
    setState(() {
      _currentIndex = index;
    });
  }

嗨,我已经在下面的代码图像中附加了我的简单 Flutter 应用程序的有状态小部件的构建方法。我正在使用底部导航栏,并希望我的小部件在底部页面之间切换时保留在树中。因此,我与页面控制器和页面主体一起实现了 AutomaticKeepAliveMixin 以使状态持久化。现在我的问题是,

  1. 我的第一页是一个显示跟踪信息的谷歌地图小部件。由于页面浏览,当我尝试通过向目的地方向滑动来查看地图上的不同位置时,有时在地图上从右向左滑动会导致页面查看触发页面切换
  2. 如果我删除 pageview 以使地图按预期工作,状态的持久性就会消失,因为根据文档,我应该将脚手架的主体包裹在一个 PageView 小部件中,以便 AutomaticKeepAliveMixin 工作。

My app screenshot

现在我的问题是如何实现两者兼而有之?我被困住了。我曾尝试实现其他状态持久化技术,如索引堆栈和 pagekeystorage,但没有成功:( 任何帮助将不胜感激!谢谢!

垂直滚动有效,但是当我尝试在我的地图中横向滚动时,页面视图优先并且只是滚动到新页面,如下所示:

Issue GIF

解决方法

PageView 有一个物理属性,您可以使用它来控制它如何滚动以响应用户在其上滑动。如果您分配了 NeverScrollableScrollPhysics(),它将无法滚动。