目錄
問題描述
需要對路由進(jìn)行攔截艰毒,比方說在跳轉(zhuǎn)某些頁面之前必須先登錄了才可以摩梧,所以需要點(diǎn)擊的時(shí)候跳轉(zhuǎn)登錄頁瓮孙,而這里我使用了GetX管理路由,想了一段時(shí)間才實(shí)現(xiàn)了路由的攔截
問題解決
由于我是使用的GetX(https://pub.dev/packages/get)來進(jìn)行路由管理的柑船,因此我使用的GetMaterialApp
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late SPUtil spUtils;
@override
void initState() {
SPUtil.getInstance().then((value) =>
spUtils = value
);
}
@override
Widget build(BuildContext context) {
return GetMaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
iconTheme: IconThemeData(color: Colors.black) //用于Icon顏色
),
//注冊路由表
initialRoute: PageNameData.PAGE_MAIN,
routingCallback: (routing) {
if(routing?.current != '/'){
// Get.removeRoute(routing!.route!);
}
},
getPages: [
GetPage(
name: PageNameData.PAGE_MAIN,
page: () => getPage(PageNameData.PAGE_MAIN),
transition: PageStyleData.transition
),
GetPage(
name: PageNameData.PAGE_LOGIN,
page: ()=>getPage(PageNameData.PAGE_LOGIN),
transition: PageStyleData.transition
),
GetPage(
name: PageNameData.PAGE_DRVICEINFO,
page: () => getPage(PageNameData.PAGE_DRVICEINFO),
transition: PageStyleData.transition
),
GetPage(
name: PageNameData.PAGE_ADDDRVICE,
page: () => getPage(PageNameData.PAGE_ADDDRVICE),
transition: PageStyleData.transition
),
GetPage(
name: PageNameData.PAGE_ADDDEVICESCANPAGE,
page: () => getPage(PageNameData.PAGE_ADDDEVICESCANPAGE),
transition: PageStyleData.transition
),
GetPage(
name: PageNameData.PAGE_SCANQRCODEPAGE,
page: () => getPage(PageNameData.PAGE_SCANQRCODEPAGE),
transition: PageStyleData.transition
),
],
);
}
Widget getPage(String pageName){
//沒有登錄,跳轉(zhuǎn)登錄頁面
if(spUtils.getToken(defaultValue: "") == ""){
return LoginPage();
}
if(pageName == PageNameData.PAGE_ADDDRVICE){
return AddDevicePage();
}else if(pageName == PageNameData.PAGE_DRVICEINFO){
return DeviceInfoPage();
}else if(pageName == PageNameData.PAGE_LOGIN){
return LoginPage();
}else if(pageName == PageNameData.PAGE_ADDDEVICESCANPAGE){
return AddDeviceScanPage();
}else if(pageName == PageNameData.PAGE_SCANQRCODEPAGE){
return ScanQrCodePage();
}else if(pageName == PageNameData.PAGE_MAIN){
return MainPage();
}
return MainPage();
}
}
GetX中使用getPages來配置路由泼各,這里我就通過修改GetPage返回page的方法來實(shí)現(xiàn)路由的攔截
Widget getPage(String pageName){
//沒有登錄(Token為空)鞍时,跳轉(zhuǎn)登錄頁面
if(spUtils.getToken(defaultValue: "") == ""){
return LoginPage();
}
if(pageName == PageNameData.PAGE_ADDDRVICE){
return AddDevicePage();
}else if(pageName == PageNameData.PAGE_DRVICEINFO){
return DeviceInfoPage();
}else if(pageName == PageNameData.PAGE_LOGIN){
return LoginPage();
}else if(pageName == PageNameData.PAGE_ADDDEVICESCANPAGE){
return AddDeviceScanPage();
}else if(pageName == PageNameData.PAGE_SCANQRCODEPAGE){
return ScanQrCodePage();
}else if(pageName == PageNameData.PAGE_MAIN){
return MainPage();
}
return MainPage();
}