Flutter路由统一管理

Flutter路由统一管理

如何更好的管理Fluter的路由?就需要自己去创建一个专门用于管理路由的文件。

Flutter管理路由的初级用法

在MaterialApp中的实现属性里面可以看到一个routes,routes的定义如下:

final Map<String, WidgetBuilder> routes;

只要遵循Map实现一个routes就可以管理自己的路由配置。

现在动手去实现一个自定义的routes:

var routes = {
	'/':(context)=>MyApp(),
	'/testlogin':(context)=>Login(),//登陆
	'/testregiest':(context)=>Regiest()//注册
};

然后将自己定义的routes赋值给MaterialApp中的routes属性:

Widget build(BuildContext context) {
return MaterialApp(
  routes: routes,//将自己定义好的routes赋值
  supportedLocales: [//设置支持的语言
    const Locale('en'),
    const Locale('zh'),
  ],
  locale: const Locale('zh'),//设置当前语言环境
  localeResolutionCallback: (Locale locale, Iterable<Locale> supportedLocales) {
        return locale;
      },
    );
  }

这样子设置完之后,就可以直接使用 Navigator.of(context).pushNamed(’/login’) 来跳转页面。

这样子自定好之后,就涉及到需要给跳转的页面传值,传值可以使用pushNamed中的arguments;

Navigator.of(context).pushNamed('/login',arguments: {}); arguments可以填写需要传入的参数。

使用arguments这种方法传进去的值,可以在跳转页面中build方法里面通过ModalRoute.of(context).settings.arguments

class _TestLoginState extends State<TestLogin>{
  @override
  Widget build(BuildContext context) {
    var arguments = ModalRoute.of(context).settings.arguments;//获取传入的值
    // TODO: implement build
    return Scaffold(
      body: Container(
        child: Text('test login'),
      ),
    );
  }
}

Flutter路由传值的高级用法

上面一种传值方式固然可行,但是实在build方法中,可能会导致多次赋值,用起来不太美观。

下面介绍另外一种页面之间传值方式,使用MaterialApp中的onGenerateRoute

重写一下onGenerateRoute,下面来看看具体怎么实现:


1、定义一个routes路由字典:

var routes = {
  '/':(context)=>MyApp(),
  '/login':(context,{arguments})=>TestLogin(arguments: arguments,),//登陆,定义route的时候就定义好跳转到当前页面需要接受参数
};

2、在同一个文件中实现onGenerateRoute方法

var onGenerateRoute=(RouteSettings settings) {
  // 具体处理
  final String name = settings.name;
  final Function pageContentBuilder = routes[name];
  if (pageContentBuilder != null) {
    if (settings.arguments != null) {
      final Route route = MaterialPageRoute(
          settings: settings,
          builder: (context) =>
              pageContentBuilder(context, arguments: settings.arguments));
      return route;
    }else{
      final Route route = MaterialPageRoute(
          settings: settings,
          builder: (context) =>
              pageContentBuilder(context));
      return route;
    }
  }
};

3、在MaterialApp如何初始化

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',//设置初始化路由
      onGenerateRoute: onGenerateRoute,//自定义实现的onGenerateRoute
      supportedLocales: [
        const Locale('en'),
        const Locale('zh'),
      ],
      locale: const Locale('zh'),
      localeResolutionCallback: (Locale locale, Iterable<Locale> supportedLocales) {
//        print("change language");
        return locale;
      },
    );
  }
}

4、具体使用跳转

Navigator.of(context).pushNamed('/login',arguments: {}); arguments可以填写需要传入的参数。

5、“/login”如何接受数据

class TestLogin extends StatefulWidget{
  final Map arguments;
  //通过这种方法进行数据传递
  const TestLogin({Key key, this.arguments}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _TestLoginState();
  }
}

class _TestLoginState extends State<TestLogin>{
  @override
  Widget build(BuildContext context) {
//    var arguments = ModalRoute.of(context).settings.arguments;//获取传入的值
    // TODO: implement build
    return Scaffold(
      body: Container(
        child: Text('test login'),
      ),
    );
  }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

songhai11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值