flutter的路由工具類

路由工具類

直接代碼

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));
  }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章