路由工具類
直接代碼
class NavigatorUtil {
/// 跳轉頁面
static push(BuildContext context, Widget page) async {
final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => page));
return result;
}
/// 跳轉頁面
static pushNamed(BuildContext context, String routeName, {Object arguments,}){
Navigator.pushNamed(context, routeName, arguments: arguments);
}
/// 跳轉並有返回值
static Future<T> getValuePush<T extends Object>(BuildContext context, Widget page, {bool isAnimate = true}) {
Completer<T> completer = Completer();
Navigator.push<T>(context, (isAnimate) ? MaterialPageRoute(builder: (context) => page) : AutoRoute(builder: (context) => page)).then((value) {
completer.complete(value);
});
return completer.future;
}
/// 跳轉並有返回值,根據路由name
static Future<T> getValuePushName<T extends Object>(BuildContext context, String newPage, {Object arguments,}) {
Completer<T> completer = Completer();
Navigator.pushNamed<T>(context, newPage, arguments: arguments).then((value) {
completer.complete(value);
});
return completer.future;
}
/// 替代路由,pushReplacement和popAndPushNamed類似,有小差別
/// pushReplacementNamed:當用戶成功登錄並且現在在 HomeScreen 上時,您不希望用戶還能夠返回到 LoginScreen。
/// 因此,登錄應完全由首頁替換。另一個例子是從 SplashScreen 轉到 HomeScreen。 它應該只顯示一次,用戶不能再從 HomeScreen 返回它。
/// 在這種情況下,由於我們要進入一個全新的屏幕,我們可能需要藉助此方法。
///
/// popAndPushNamed:假設您正在有一個 Shopping 應用程序,該應用程序在 ProductsListScreen 中顯示產品列表,用戶可以在 FiltersScreen 中應用過濾商品。
/// 當用戶單擊“應用篩選”按鈕時,應彈出 FiltersScreen 並使用新的過濾器值推回到 ProductsListScreen。
/// 這裏 popAndPushNamed 顯然更爲合適。
/// screen3 screen4
/// screen2 screen2
/// screen1 screen1
static pushReplacement<TO>(BuildContext context, Widget newPage, {TO result}) {
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => newPage,), result: result);
}
static pushReplacementNamed<TO>(BuildContext context, String newName, {TO result, Object arguments,}) {
Navigator.pushReplacementNamed(context, newName, result: result, arguments: arguments);
}
/// 替代路由,popAndPushNamed和pushReplacement,有小差別
/// screen3 screen4
/// screen2 screen2
/// screen1 screen1
static popAndPushNamed<TO>(BuildContext context, String newName, {TO result, Object arguments,}) {
Navigator.popAndPushNamed(context, newName, result: result, arguments: arguments);
}
/// 跳轉到指定界面,彈出中間部分
/// screen4
/// screen3
/// screen2 screen5
/// screen1 screen1 loginScreen
/// predicate參數 (Route<dynamic> route) => false 能夠確保刪除先前所有實例,比如上面的loginScreen; ModalRoute.withName('/screen1') 跳轉到直到哪個界面停止
static pushAndRemoveUtil(BuildContext context, Widget newPage, RoutePredicate predicate){
Navigator.pushAndRemoveUntil(context, new MaterialPageRoute(builder: (_) => newPage), predicate);
}
static pushNamedAndRemoveUntil(BuildContext context, String newRouteName, RoutePredicate predicate, {Object arguments,}){
Navigator.pushNamedAndRemoveUntil(context, newRouteName, predicate, arguments: arguments);
}
/// 反覆執行pop 直到該函數的參數predicate返回true爲止。
/// screen3
/// screen2
/// screen1 screen1
static popUntil(BuildContext context, String name){
Navigator.popUntil(context, ModalRoute.withName(name));
}
}