Flutter路由守卫拦截的实现
作者:WEB前端李志杰 发布时间:2021-11-12 21:24:12
标签:Flutter,路由,守卫,拦截
为什么要使用路由
在之前我们的代码中,页面跳转使用的代码如下所示:
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


猜你喜欢
- 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系。可是有的时候,可能存在多个线程多同一个数据进行操作,这样
- 同步代码块基本语句synchronized (任意对象) {操作共享代码}代码示例public class SellTicket imple
- SpringMvc中普通类注入Service为null场景:使用Quartz定时器时,普通的java类需要注入spring的service类
- 先说一下对异步和同步的理解:同步调用:调用方在调用过程中,持续等待返回结果。异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任
- Android系统对所有的危险权限进行了分组,称为 权限组 。属于同一组的危险权限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得
- Java读文件修改默认换行符Java默认换行符是'\n'。但有时数据并不以'\n'进行换行方法如下publi
- 本文实例展示了DevExpress实现GridView当无数据行时提示消息的方法,具体步骤如下:主要功能代码部分如下:/// <sum
- 下面笔者说说自己对进制转换的分析:笔者认为,任何进制都可以直接转换到十进制,而十进制也可以相当容易的转换到其他进制,所以笔者在这里将十进制作
- 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删
- 一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClie
- 本文实例为大家分享了Java实现多人聊天室的具体代码,供大家参考,具体内容如下先说,记录本人的学习过程,当笔记了多人聊天室分为1.服务器①.
- 在项目中使用Maven管理jar包依赖,往往会出现以下状况:1、国内访问maven默认远程中央镜像特别慢;2、使用阿里的镜像替代远程中央镜像
- Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。第一步:pom.xml添加maven依赖<!-- https
- 获取map的key和value的方法分为两种形式:map.keySet():先获取map的key,然后根据key获取对应的value;map
- 1.灰度线性变换图像的灰度线性变换是图像灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度,从而达到图像增强的目的。灰度映射通
- 因为线程重用导致的信息错乱的bugThreadLocal一般用于线程间的数据隔离,通过将数据缓存在ThreadLocal中,可以极大的提升性
- 在生产型Android客户端软件(企业级应用)开发中,界面可能存在多个输入(EditText)和多个操作(MotionEvent和KeyEv
- 总结java里面关于获取当前时间的一些方法System.currentTimeMillis()获取标准时间可以通过System.curren
- 本文实例讲述了android同时控制EditText输入字符个数和禁止特殊字符输入的方法。分享给大家供大家参考。具体分析如下:这里总结了三种
- 递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递