美文网首页
flutter pushname使用和多参数传递

flutter pushname使用和多参数传递

作者: 心旷则神怡 | 来源:发表于2022-04-26 16:50 被阅读0次

    配置routes参数

    final routes = {
      '/': (context) => HomePage(),//根视图
      '/takePage': (context, {arguments}) => TakephotoPage(specModel: arguments,),
      '/EditPhotoPage': (context, {arguments}) => EditPhotoPage(params: arguments,),
    };
    
    // 路由拦截器,只有在MaterialApp的routes属性没有赋值的情况下,才会每次创建页面都触发
    // 如果指定了routes属性,那只有routes中查不到的时候才会触发
    Route<dynamic> onGenerateRoute(RouteSettings settings) {
      String? routeName = settings.name;
    
      // 控制台输出当前拦截的路由名称,方便清晰的理解路由创建流畅
      print('当前访问路由名:$routeName');
    
      // 为了避免报错,将在命名路由列表查不到的都指向首页(根页)
      if (!routes.containsKey(routeName)) routeName = '/';
    
      // 获取页名对应的类
      final Function pageContentBuilder = routes[routeName] as Function;
    
      if (settings.arguments != null) {
    
        // 如果带有参数,则调用该类的时候,需要将参数传递过去
        return MaterialPageRoute(
          builder: (context) => pageContentBuilder(context, arguments: settings.arguments),
    
          // 这一行是命名路由顺畅应用的关键,否则新创建的页面压入路由栈的将不是自己定义的名字
          // 主要是使用 settings.name 的作用,为新创建的页面命名
          settings: settings,
        );
      } else {
    
        // 如果没有带参数,则调用该类的时候,不需要传递参数
        return MaterialPageRoute(
          builder: (context) => pageContentBuilder(context),
          settings: settings,
        );
      }
    }
    

    main函数:

    void main() {
      runApp(const MYApp());
    }
    
    class MYApp extends StatelessWidget {
      const MYApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return const MaterialApp(
          home: MainPage(),
          onGenerateRoute: onGenerateRoute,
        );
      }
    }
    

    使用

    单参数

    Navigator.pushNamed(context, '/takePage', arguments:"参数");
    

    多参数

    String temp = json.encode({
            'file':cropedFile,
            'specModel':widget.specModel,
          });
    Navigator.pushNamed(context, '/EditPhotoPage', arguments: temp);
    
    //在下一个页面解码
      String params;
    //然后赋值
      Map<String, dynamic> data = json.decode(widget.params);
    
    

    参考了:Flutter命名路由及传参的深度实践与解读

    相关文章

      网友评论

          本文标题:flutter pushname使用和多参数传递

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