美文网首页
【Flutter】 携带参数跳转页面与返回以及获取跨多个页面的返

【Flutter】 携带参数跳转页面与返回以及获取跨多个页面的返

作者: Piemon_Jay | 来源:发表于2022-09-14 10:57 被阅读0次

    本篇转载于
    https://blog.csdn.net/ww897532167/article/details/125680502

    1 匿名方式 实现页面跳转与返回

    1.1 跳转下一页

    Android风格

    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => const Page1()),
    );
    

    iOS风格

    Navigator.push(
      context,
      CupertinoPageRoute(builder: (context) => const Page1()),
    );
    

    从下到上弹出页面

    Navigator.push(
       context,
       MaterialPageRoute(
         builder: (context) => const Page1(),
         // 全屏弹窗效果,从下往上出现
         fullscreenDialog: true,
       ),
     );
    

    1.2 返回上一页

    Navigator.of(context).pop()
    

    1.3 传参跳转下一页并获取返回值

    传参跳转下一页,并获取返回值

    final result = await Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => const Page1(param: 'param'),
      ),
    );
    print(result);
    

    携带参数返回上一页

    Navigator.of(context).pop('result value');
    

    2 路由的方式 实现页面跳转与返回

    2.1 路由配置

    在MaterialApp或CupertinoApp中配置路由名称和页面的对应关系:

    initialRoute
    onGenerateRoute
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData(primaryColor: Colors.red),
          // 默认展示的页面路由
          initialRoute: "/",
          onGenerateRoute: (settings) {
            final routeName = settings.name;
            dynamic arguments = settings.arguments;
    
            switch (routeName) {
              case "/":
                return CupertinoPageRoute(builder: (context) => const RootPage());
              case "/page1":
                // 可接收参数
                String? param = arguments as String?;
                return CupertinoPageRoute(
                    builder: (context) => Page1(param: param));
              default:
                return CupertinoPageRoute(
                  builder: (_) => Scaffold(
                    body: Center(
                      child: Text('UnknownScreen $routeName'),
                    ),
                  ),
                );
            }
          },
        );
      }
    }
    

    2.2 携带参数跳转页面 并获取返回值

    普通跳转

    Navigator.pushNamed(context, '/page1');
    

    传参

    Navigator.pushNamed(context, '/page1',arguments: 'param');
    

    获取返回值

    var result = await Navigator.pushNamed(context, '/page1', arguments: 'param');
    

    2.3 跳转或返回指定页面并清空栈

    销毁当前页面并跳转新的页面

    Navigator.popAndPushNamed(context, '/page2');
    

    返回指定页面

    // 返回指定页面
    Navigator.popUntil(context, (route) => route.settings.name == '/');
    // 返回根页面
    Navigator.popUntil(context, (route) => route.isFirst);
    

    跳转至某页面,并销毁之前的页面

    Navigator.pushNamedAndRemoveUntil(
                          context, '/page2', (route) => route.settings.name == '/');
    

    3 返回指定页面(跨多个页面)并传递返回值

    配置路由时 添加一个参数 Map()

     switch (routeName) {
       case "/":
         return CupertinoPageRoute(
           settings: RouteSettings(
             name: "/",
             arguments: Map(), //用于 popUntil 返回传值
           ),
           builder: (context) => const RootPage(),
         );
       ...
     }
    

    返回指定页面 ’/’

     Navigator.popUntil(context, (route) {
       if (route.settings.name == '/') {
         (route.settings.arguments as Map)['result'] = '返回值';
         return true;
       } else {
         return false;
       }
     });
    

    ‘/’ 页面 获取返回值

     await Navigator.of(context).pushNamed('/page2');
     if (mounted) {
       final arguments =
           ModalRoute.of(context)?.settings.arguments as Map;
       final result = arguments['result'];
     }
    

    相关文章

      网友评论

          本文标题:【Flutter】 携带参数跳转页面与返回以及获取跨多个页面的返

          本文链接:https://www.haomeiwen.com/subject/jmbkortx.html