Flutter 路由管理

创建命名路由配置文件
$filename('route.dart')
final Map routes = {
  '/home': (context) => const HomeWidget(),
  '/signUp': (context) => const SignUp(),
  '/signIn': (context) => const SignIn(),
  ...
};

// 使用
$filename(main.dart)
...
@override
Widget build(BuildContext context) {
  return MaterialApp(
    routes: {...routes},
    home: ifWidget(context),
  );
}
...

路由跳转

push 将设置的router信息推送到Navigator上,实现页面跳转

Navigator.of(context).push(
  MaterailPageRoute(builder:(context){
    return HomeWidget();
  }
));
// 或
Navigator.push(
 context,
  MaterailPageRoute(
    builder: (context) => const SignUp()
  )
);

pop 导航到新页面,或者返回到上个页面

Navigator.pop(context);

canPop 判断是否可以导航到新页面

Navigator.canPop(context);

maybePop 可能会导航到新页面

Navigator.of(context).maybePop();

popAndPushNamed 指定一个路由路径,并导航到新页面

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

popUntil 反复执行pop 直到该函数的参数predicate返回true为止(一直 pop 到指定的页面)

Navigator.popUntil(context, ModalRoute.withName('/signIn'));

pushAndRemoveUntil 将给定路由推送到Navigator,删除先前的路由,直到该函数的参数predicate返回true为止

Navigator.pushAndRemoveUntil(
  context,
  MaterialPageRoute(builder: (context) => const SignIn()),
  (route) => route == null,
);

pushNamed 将命名路由推送到Navigator

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

pushNamedAndRemoveUntil 将命名路由推送到Navigator,删除先前的路由,直到该函数的参数predicate返回true为止

Navigator.pushNamedAndRemoveUntil(context, '/signIn', ModalRoute.withName('/signUp'));

pushReplacementNamed 这个也是替换路由操作。推送一个命名路由到Navigator,新路由完成动画之后处理上一个路由

Navigator.pushReplacementNamed(context, '/signIn');

removeRoute 从Navigator中删除路由,同时执行Route.dispose操作

// 路由栈移除功能,例如可以通过ModalRoute.of(context)获取当前页面路由。
// 如果和Navigator.of(context).pop()做比较的话就是通过该方法可以移除指定路由,只要拿到对应路由对象就能将其在栈中移除。
// 而Navigator.of(context).pop()则只能移除当前路由页面。
Navigator.of(context).removeRoute(ModalRoute.of(context));

removeRouteBelow 从Navigator中删除路由,同时执行Route.dispose操作,要替换的路由是传入参数anchorRouter里面的路由

// 同样是路由栈移除功能,根据输入页面路由移除该锚点路由的上一个页面路由。 例如路由栈为[1,2,3,4],执行removeRouteBelow(3)后路由栈变为[1,3,4]
Navigator.of(context).removeRouteBelow(ModalRoute.of(context));

replace 将Navigator中的路由替换成一个新路由。

Navigator.of(context).replace(
  oldRoute: UserNavigatorObserver.history[UserNavigatorObserver.history.length - 2],
  newRoute: MaterialPageRoute(
    builder: (_) => const SignIn(),
  ),
);

路由传参

以命名路由跳转时

Navigator.of(context).pushNamed(
  "/signIn",
  arguments: {"data": "Hello World!"},
);

以页面跳转时

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => const SignIn(),
    settings: RouteSettings(
      arguments: {"data": "Hello World!"},
    ),
  ),
);

在页面中使用ModalRoute.of(context).settings.arguments接收参数

class SignIn extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _SignIn();
}
 
class _SignIn extends State<SignIn> {
  @override
  Widget build(BuildContext context) {
    Map arguments = ModalRoute.of(context).settings.arguments;
    String data = arguments['data'];
    return Scaffold(
      appBar: AppBar(),
      body: Column(
        children: <Widget>[
          Text("data: $data"),
        ],
      ),
    );
  }
}

直接使用路由构造方法传参

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => const SignIn("Hello World!"),
  ),
);

接参

class SignIn extends StatefulWidget {
  final String data;
 
  SignIn(this.data);
 
  @override
  State<StatefulWidget> createState() => _SignIn();
}
 
class _SignIn extends State<SignIn> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Text("data: ${widget.data}"),
    );
  }
}

使用pop返回上个页面并传参

Navigator.of(context).pop({"data": "Hello World!"});

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集

在这里插入图片描述
二、源码解析合集
在这里插入图片描述

三、开源框架合集
在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值