路由守卫拦截最常见的应用场景就是对用户数据权限的校验(用户是否是登录状态,404页面跳转……)。
在Flutter中可以通过MaterialApp
Wedgit中的onGenerateRoute
属性实现路由守卫。
在Flutter实现路由守卫拦截时需注意:
1、onGenerateRoute
只针对命名路由有效;
2、onGenerateRoute
注册在路由表之中的路由无法监听到。
关于路由基础相关知识请查看Flutter Navigator路由传参_WEB前端李志杰的博客-CSDN博客_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;
}
}