Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 从页面视图容器小部件外部导航到页面视图中的页面_Flutter - Fatal编程技术网

Flutter 从页面视图容器小部件外部导航到页面视图中的页面

Flutter 从页面视图容器小部件外部导航到页面视图中的页面,flutter,Flutter,我在主页的pageView中有3个页面(PageA、PageB和PageC)。我可以使用PageController轻松地在页面之间切换。这3个页面也连接到BottomNavigationBar。我也可以通过它在页面之间切换 现在,我有一个问题: 如何从主页之外的页面转到PageView中的PageB或PageC页面 举个例子: 我去PageA 从那里我进入一个页面 在PageQ中,我点击PageB的第二个底部NavBarItem。从这里我被困住了 如果我尝试导航到主页,屏幕上会显示PageA作

我在主页的pageView中有3个页面(PageA、PageB和PageC)。我可以使用PageController轻松地在页面之间切换。这3个页面也连接到BottomNavigationBar。我也可以通过它在页面之间切换

现在,我有一个问题: 如何从主页之外的页面转到PageView中的PageB或PageC页面

举个例子:

  • 我去PageA
  • 从那里我进入一个页面
  • 在PageQ中,我点击PageB的第二个底部NavBarItem。从这里我被困住了
  • 如果我尝试导航到主页,屏幕上会显示PageA作为初始页面

     return Scaffold(
          body: PageView(
            controller: controller.pageController,
            children: [
              PageA(),
              PageB(),
              PageB(),
            ],
            onPageChanged: controller.slidePage,
          ),
          bottomNavigationBar: BottomNavbar(),
        );
    

    一种方法是传递控制器,这可能是个坏主意。更好的方法是使用
    Navigator
    您甚至可以坚持使用
    PageView
    并将一个值传递给构造函数以设置初始页面,但一定要考虑重新设计。您可能不需要
    PageView
    ,也许使用单独的页面和
    Navigator
    导航更好。如果我没记错的话,如果您需要连续的步骤,页面视图可能会很有用,但不要局限于此。

    如果您试图实现成功的底部导航栏,您可以尝试以下方法:

    import 'package:convex_bottom_bar/convex_bottom_bar.dart';
    import 'package:flutter/material.dart';
    
    import 'presentation/screens/cart.dart';
    import 'presentation/screens/home.dart';
    import 'presentation/screens/order.dart';
    
    
    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
    
      int page = 0;
      final _order = PageA();
      final _home = Pageb();
      final _cart = Pageq();
      Widget _showPage = PageA();
      Widget _pageChooser(page) {
        switch (page) {
          case 0:
            return Pageq();
            break;
          case 1:
            return Pageb();
            break;
          case 2:
            return Pageq();
            break;
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar( 
            elevation: 10.0,
            backgroundColor: Colors.pink[100],
            title: Image.asset("images/logo.png",scale: 14.0,),
            centerTitle: true,
          ),
          bottomNavigationBar: BottomNavigationBar(
            elevation: 0.0,
            items: [
               BottomNavigationBarItem(
                    label:"PageQ",
                    icon:Icon(Icons.home)
                ),
                  BottomNavigationBarItem(
                    label:"PageB",
                    icon:Icon(Icons.ac_unit)
                ),
                  BottomNavigationBarItem(
                    label:"PageA",
                    icon:Icon(Icons.favorite)
                ),
            ],
             onTap: (index) async {
                  setState(() {
                    _showPage = _pageChooser(index);
                  });
                },
          ),
    
          
          body: _showPage,
        );
      }
    }
    
    
    import'package:凸面_-bottom_-bar/凸面_-bottom_-bar.dart';
    进口“包装:颤振/材料.省道”;
    导入“演示/屏幕/购物车.省道”;
    导入“演示/屏幕/主页.dart”;
    导入“演示/屏幕/订单.dart”;
    类主页扩展了StatefulWidget{
    @凌驾
    _HomePageState createState()=>\u HomePageState();
    }
    类_HomePageState扩展状态{
    int page=0;
    最终订单=PageA();
    final_home=Pageb();
    最终_cart=Pageq();
    小部件_showPage=PageA();
    小部件_页面选择器(页面){
    交换机(第页){
    案例0:
    返回Pageq();
    打破
    案例1:
    返回Pageb();
    打破
    案例2:
    返回Pageq();
    打破
    }
    }
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    appBar:appBar(
    标高:10.0,
    背景颜色:颜色。粉红色[100],
    标题:Image.asset(“images/logo.png”,比例:14.0,),
    标题:对,
    ),
    底部导航栏:底部导航栏(
    标高:0.0,
    项目:[
    底部导航气压计(
    标签:“PageQ”,
    图标:图标(Icons.home)
    ),
    底部导航气压计(
    标签:“PageB”,
    图标:图标(Icons.ac_单位)
    ),
    底部导航气压计(
    标签:“PageA”,
    图标:图标(Icons.favorite)
    ),
    ],
    onTap:(索引)异步{
    设置状态(){
    _showPage=\u页面选择器(索引);
    });
    },
    ),
    正文:_showPage,
    );
    }
    }
    
    这是一个逻辑问题,而不是技术问题。仍在回答,以便任何面临此类问题的人都能从中振作起来

    PageView类按预期工作。当您从页面视图中不存在的其他页面导航时,请使用
    popintil
    而不是
    push
    。因为
    push
    将创建一个新的主页,而不是现有的主页

      void redirectTo(int selectedPageIndex) async {
        if (Get.currentRoute != Routes.HOME) {
          Navigator.popUntil(Get.context, ModalRoute.withName(Routes.HOME));
        }
        pageController.jumpToPage(selectedPageIndex);
      }
    

    只要弹出,直到你回到主页,然后跳转到所需的索引

    谢谢你的回答。在这种情况下,我无法滑动到下一个屏幕&每次都会重新绘制底部导航栏。在页面之间重新绘制时,底部导航栏上可以看到一个急动。所以,我想让它永久存在。滑动页面需要页面浏览。谢谢,兄弟!这不是因为我需要,而是我想。就像在Whatsapp应用程序中一样,我想使用PageView和Navbar,而不需要重新绘制它。