Flutter路由守卫拦截的实现
作者:WEB前端李志杰 时间:2021-11-12 21:24:12
为什么要使用路由
在之前我们的代码中,页面跳转使用的代码如下所示:
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => LoginPage()),
);
在开发过程中,随着页面的增加,如果继续使用这种方式会有如下缺陷:
代码耦合严重:涉及到页面跳转的地方就需要插入页面的构造函数,意味着需要知道其他页面的构建方式。
不易维护:一旦某个页面发生了变化,需要将涉及到该页面的跳转全部改变。
权限控制不方便:假设某些页面需要授权后才可以访问,需要在各个地方插入权限判断。
Flutter路由守卫拦截的实现
路由守卫拦截最常见的应用场景就是对用户数据权限的校验(用户是否是登录状态,404页面跳转……)。
在Flutter中可以通过MaterialAppWedgit中的onGenerateRoute属性实现路由守卫。
在Flutter实现路由守卫拦截时需注意:
1、onGenerateRoute只针对命名路由有效;
2、onGenerateRoute注册在路由表之中的路由无法监听到。
关于路由基础相关知识请查看Flutter Navigator路由传参
一、路右表管理
在lib/router/index.dart中统一管理路由表数据。
由于onGenerateRoute无法监听路由表中已经注册的路由,因此,我们需要通过initialRoute 属性指定应用程序的默认页面,千万不要在注册路由表的时候使用/去指定应用程序默认页面。
/// lib/router/index.dart
import 'package:cyber_security/view/login/index.dart';
import 'package:cyber_security/view/main/index.dart';
import 'package:cyber_security/view/not_found/index.dart';
import 'package:flutter/material.dart';
Map<String, WidgetBuilder> routeList={
"notFound":(content) =>const NotFound(),
"login":(content) =>const LoginPage(),
"main":(content) =>const MainPage(),
};
二、实现路由守卫
在路由守卫中我们可以监听跳转未定义的页面至404页面,实现用户数据权限的校验等业务逻辑。
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
key: navigatorKey,
debugShowCheckedModeBanner: false,
title: 'Flutter APP',
initialRoute: 'login', // 默认进入的页面
onGenerateRoute: _routeGenerator);
}
/// 实现路由守卫
Route _routeGenerator(RouteSettings settings) {
final name = settings.name;
var builder = routeList[name];
// 如果路由表中未定义,跳转到未定义路由页面
builder ??= (content) => const NotFound();
// 用户权限认证的逻辑处理
……
// 构建动态的route
final route = MaterialPageRoute(
builder: builder,
settings: settings,
);
return route;
}
}
来源:https://blog.csdn.net/qq_16221009/article/details/124255630
标签:Flutter,路由,守卫,拦截
0
投稿
猜你喜欢
react native打包apk文件安装好之后进入应用闪退的解决方案
2022-11-04 06:13:09
C#中遍历Hashtable的4种方法
2023-01-18 12:17:51
c++动态内存管理详解(new/delete)
2022-07-09 11:53:26
Java多线程通信wait()和notify()代码实例
2022-09-27 12:12:11
java后端+前端使用WebSocket实现消息推送的详细流程
2022-04-24 12:34:53
带你重新认识MyBatis的foreach
2023-11-21 08:44:54
Android中Json数据读取与创建的方法
2022-01-17 23:19:48
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2021-08-04 03:16:28
Java spring的三种注入方式详解流程
2021-07-02 12:25:47
Java多线程死锁示例
2022-09-17 15:05:25
java实现基于Tcp的socket聊天程序
2022-03-11 15:28:07
详解Java发送HTTP请求
2022-01-09 14:53:57
详解kafka中的消息分区分配算法
2021-06-02 08:16:15
基于Java字符编码的使用详解
2023-02-26 23:13:01
SpringBoot使用Sharding-JDBC实现数据分片和读写分离的方法
2023-07-27 02:15:50
Android实现短信验证码获取自动填写功能(详细版)
2022-07-22 07:08:10
Java集合的Collection接口和List接口详解
2021-11-02 05:24:44
SpringCloud:feign对象传参和普通传参及遇到的坑解决
2023-02-17 11:18:58
jpa EntityManager 复杂查询实例
2023-08-31 01:03:01
Android自定义View实现选座功能
2022-12-23 00:05:45