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
投稿

猜你喜欢

  • C#中的并发集合Concurrent类

    2021-10-27 03:44:36
  • java实现递归文件列表的方法

    2022-10-13 13:17:00
  • 解决Spring Cloud Feign 请求时附带请求头的问题

    2022-12-11 04:29:46
  • Android提高之MediaPlayer音视频播放

    2021-05-29 08:44:37
  • 如何利用Jackson序列化忽略指定类型的属性详解

    2023-11-16 09:01:27
  • Spring Bean 依赖注入常见错误问题

    2022-10-02 20:46:51
  • springboot集成fastDfs过程代码实例

    2023-02-21 19:42:20
  • java图片识别文字的方法

    2021-11-11 02:43:03
  • C#手动操作DataGridView使用各种数据源填充表格实例

    2023-07-20 08:30:31
  • Spring之WEB模块配置详解

    2023-12-05 13:21:48
  • C#入门之定义类成员与接口实现

    2023-05-25 09:50:58
  • Java中的字符串常量池详细介绍

    2023-03-08 09:16:41
  • Android Vitamio和ExoPlayer两种播放器优劣分析

    2023-02-25 13:21:51
  • C# this关键字的四种用法

    2022-10-06 07:09:22
  • C#实现多线程下载文件的方法

    2022-04-24 10:59:43
  • spring boot使用logback实现多环境日志配置详解

    2022-10-03 20:38:24
  • Android自定义边缘凹凸的卡劵效果

    2023-03-16 09:58:46
  • Android中通知栏跳动问题解决方法

    2023-05-31 20:16:55
  • Spring Boot Thymeleaf实现国际化的方法详解

    2023-11-24 06:01:01
  • 如何通过XML方式配置并实现Mybatis

    2021-12-21 02:49:04
  • asp之家 软件编程 m.aspxhome.com