Flutter - 路由

Flutter中,路由管理主要有兩個類:Route和Navigator

  • Route是一個抽象類,可以使用MaterialPageRoute,或者iOS的CupertinoPageRoute
  • Navigator是管理所有的Route的Widget,通過一個Stack來進行管理的,不需要我們手動創(chuàng)建,直接使用就行。

基本push&pop


CupertinoButton(
            child: Text('push'),
            onPressed: (){
              Navigator.of(ctx).push(MaterialPageRoute(builder: (ctx){
                  return HJEventResponsePage();
              }));
            },
          ),
返回pop
CupertinoButton(
            child: Text('pop'),
            onPressed: (){
              /// 帶參數(shù)
              Navigator.of(context).pop('from detail');
            },
          ),
獲取pop回來的參數(shù)
Future result = Navigator.push(ctx, MaterialPageRoute(builder: (ctx){
      return HJEventResponsePage();
    }));
    result.then((value) {
      //print(value);
      setState(() {
       ///獲取pop回的參數(shù)顯示
        _message = value;
      });
    });

命名路由

命名路由是將名字和路由的映射關系,在一個地方進行統(tǒng)一的管理,這樣我們可以通過Navigator.pushNamed() 方法來跳轉到新的頁面

MaterialApp(
       // home: HJRouteTestPage(),
      ///設置應用程序從哪一個路由開始啟動,設置了該屬性,就不需要再設置home屬性了
      initialRoute: '/',
      routes: {
        HJRouteAboutPage.routeName: (ctx) => HJRouteAboutPage(),
        HJRouteTestPage.routeName:(ctx) => HJRouteTestPage()
      },
    );
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class HJRouteAboutPage extends StatelessWidget {

  static const String routeName = '/hjabout';

  @override
  Widget build(BuildContext context) {
    /// 拿到命名路由傳遞的參數(shù)
    final _msg = ModalRoute.of(context).settings.arguments;


    return Scaffold(
      appBar: AppBar(
        title: Text('關于頁'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(_msg),
            CupertinoButton(child: Text('返回'), onPressed: (){
              Navigator.pop(context);
            })
          ],
        ),
      ),
    );
  }
}

跳轉
Navigator.pushNamed(ctx, HJRouteAboutPage.routeName,arguments: 'from route test');

/// 拿到命名路由傳遞的參數(shù)
final _msg = ModalRoute.of(context).settings.arguments;
路由鉤子
///找不到路由時調用, 跳轉的界面需要參數(shù),命名路由不太方便
      onGenerateRoute: (settings){
        if (settings.name == HJRouteDetailPage.routeName){
          return MaterialPageRoute(builder: (ctx){
            return HJRouteDetailPage(settings.arguments);
          });
        }
        return null;
      },
      
 /// 未找到路由,跳轉統(tǒng)一界面
      onUnknownRoute: (settings){
        return MaterialPageRoute(builder: (ctx){
          return HJRouteUnknownPage();
        });
      },

實際項目里大部分可能使用get庫一套的狀態(tài)管理,路由等,用起來也方便,可以了解了解,以及getx插件的使用。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容