這是一篇入門級教程,更適用於小型項目。markdown
假如咱們想在用戶沒有登陸的時候自動跳轉到登陸頁面,在登陸的時候能夠正常瀏覽其餘頁面。這樣每一次打開頁面的時候都去判斷登陸狀態很是麻煩,咱們能夠利用MaterialApp
的onGenerateRoute
屬性。函數
onGenerateRoute
只會對命名路由生效onGenerateRoute
屬性,它在打開命名路由時可能會被調用builder
函數來生成路由組件onGenerateRoute
來生成路由根據上面 onGenerateRoute 的介紹,咱們必須作以下處理:ui
MaterialApp(
// home: MyHomePage(),
// routes: routes,
initialRoute: "index",
onGenerateRoute: onGenerateRoute,
);
複製代碼
Route<dynamic> onGenerateRoute(RouteSettings settings) {
String routeName;
routeName = routeBeforeHook(settings);
return MaterialPageRoute(builder: (context) {
/// 注意:若是路由的形式爲: '/a/b/c'
/// 那麼將依次檢索 '/' -> '/a' -> '/a/b' -> '/a/b/c'
/// 因此,我這裏的路由命名避免使用 '/xxx' 形式
switch (routeName) {
case "index":
return MyHomePage();
case "login":
return LoginScreen();
default:
return Scaffold(
body: Center(
child: Text("頁面不存在"),
),
);
}
});
}
複製代碼
到這裏咱們只是實現了路由名稱 --> 具體的頁面的映射
,下面還要實現「路由鉤子」,用來實現攔截功能。spa
創建 routeBeforeHook 函數,並在 onGenerateRoute 函數中調用插件
String routeBeforeHook(RouteSettings settings) {
/// Global.prefs 是全局的 SharedPreferences 實例
/// SharedPreferences 是經常使用的本地存儲的插件
final token = Global.prefs.getString('token') ?? '';
if (token != '') {
if (settings.name == 'login') {
return 'index';
}
return settings.name;
}
return 'login';
}
複製代碼
不要吝嗇各位手裏的贊啊!code
End.orm