Flutter路由守衛(wèi)攔截的實(shí)現(xiàn)
為什么要使用路由
在之前我們的代碼中,頁(yè)面跳轉(zhuǎn)使用的代碼如下所示:
Navigator.of(context).push( MaterialPageRoute(builder: (context) => LoginPage()), );
在開發(fā)過程中,隨著頁(yè)面的增加,如果繼續(xù)使用這種方式會(huì)有如下缺陷:
- 代碼耦合嚴(yán)重:涉及到頁(yè)面跳轉(zhuǎn)的地方就需要插入頁(yè)面的構(gòu)造函數(shù),意味著需要知道其他頁(yè)面的構(gòu)建方式。
- 不易維護(hù):一旦某個(gè)頁(yè)面發(fā)生了變化,需要將涉及到該頁(yè)面的跳轉(zhuǎn)全部改變。
- 權(quán)限控制不方便:假設(shè)某些頁(yè)面需要授權(quán)后才可以訪問,需要在各個(gè)地方插入權(quán)限判斷。
Flutter路由守衛(wèi)攔截的實(shí)現(xiàn)
路由守衛(wèi)攔截最常見的應(yīng)用場(chǎng)景就是對(duì)用戶數(shù)據(jù)權(quán)限的校驗(yàn)(用戶是否是登錄狀態(tài),404頁(yè)面跳轉(zhuǎn)……)。
在Flutter中可以通過MaterialAppWedgit中的onGenerateRoute屬性實(shí)現(xiàn)路由守衛(wèi)。
在Flutter實(shí)現(xiàn)路由守衛(wèi)攔截時(shí)需注意:
1、onGenerateRoute只針對(duì)命名路由有效;
2、onGenerateRoute注冊(cè)在路由表之中的路由無(wú)法監(jiān)聽到。
關(guān)于路由基礎(chǔ)相關(guān)知識(shí)請(qǐng)查看Flutter Navigator路由傳參
一、路右表管理
在lib/router/index.dart中統(tǒng)一管理路由表數(shù)據(jù)。
由于onGenerateRoute無(wú)法監(jiān)聽路由表中已經(jīng)注冊(cè)的路由,因此,我們需要通過initialRoute 屬性指定應(yīng)用程序的默認(rèn)頁(yè)面,千萬(wàn)不要在注冊(cè)路由表的時(shí)候使用/去指定應(yīng)用程序默認(rèn)頁(yè)面。
/// 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(),
};二、實(shí)現(xiàn)路由守衛(wèi)
在路由守衛(wèi)中我們可以監(jiān)聽跳轉(zhuǎn)未定義的頁(yè)面至404頁(yè)面,實(shí)現(xiàn)用戶數(shù)據(jù)權(quán)限的校驗(yàn)等業(yè)務(wù)邏輯。
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', // 默認(rèn)進(jìn)入的頁(yè)面
onGenerateRoute: _routeGenerator);
}
/// 實(shí)現(xiàn)路由守衛(wèi)
Route _routeGenerator(RouteSettings settings) {
final name = settings.name;
var builder = routeList[name];
// 如果路由表中未定義,跳轉(zhuǎn)到未定義路由頁(yè)面
builder ??= (content) => const NotFound();
// 用戶權(quán)限認(rèn)證的邏輯處理
……
// 構(gòu)建動(dòng)態(tài)的route
final route = MaterialPageRoute(
builder: builder,
settings: settings,
);
return route;
}
}
到此這篇關(guān)于Flutter路由守衛(wèi)攔截的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Flutter路由守衛(wèi)攔截內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
分享實(shí)現(xiàn)Android圖片選擇的兩種方式
本文給大家分享的是Android選擇圖片的兩種方式的實(shí)現(xiàn)代碼,分別是單張選取和多張批量選取,非常的實(shí)用,有需要的小伙伴可以參考下2016-01-01
Android實(shí)戰(zhàn)教程第二篇之簡(jiǎn)單實(shí)現(xiàn)兩種進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)戰(zhàn)教程第二篇,簡(jiǎn)單實(shí)現(xiàn)兩種進(jìn)度條效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android輕松實(shí)現(xiàn)多語(yǔ)言的方法示例
本篇文章主要介紹了Android輕松實(shí)現(xiàn)多語(yǔ)言的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
Android Studio做超好玩的拼圖游戲 附送詳細(xì)注釋源碼
這篇文章主要介紹了用Android Studio做的一個(gè)超好玩的拼圖游戲,你是0基礎(chǔ)Android小白也能包你學(xué)會(huì),另外附送超詳細(xì)注釋的源碼,建議收藏!2021-08-08
Android中ExpandableListView使用示例詳解
這篇文章主要為大家詳細(xì)介紹了Android中ExpandableListView使用示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android AsyncTask用法巧用實(shí)例代碼
這篇文章主要介紹了Android AsyncTask用法巧用實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
Android自定義View實(shí)現(xiàn)圓環(huán)進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓環(huán)進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

