Flutter中界面之間參數的傳遞與接收(push褐健、pushNamed、pop)

場景:從Home頁跳轉到Detail頁澜汤,并將Home頁的一個數據傳到Detail頁進行顯示蚜迅,Detail在返回時也攜帶數據返回給Home頁

一、flutter中通過push俊抵、pop來進行頁面之間的跳轉和返回

Home.dart Home界面的跳轉代碼

onPressed: (){
//            這里的代碼返回的是Future  所以直接在后面可以接上then谁不,也可以使用result.then((value){})
     Future result = Navigator.of(context).push(MaterialPageRoute(
                builder: (content){
                  return DetailPage(detailMessage: '從HomePage跳轉過來的',);
                }
            )).then((value){
//              這里的方法在詳情頁返回時回調,value就是Detail頁面返回時攜帶的數據
              message = value;
              setState(() {
              });
            });
  },

Detail.dart Detail頁面返回按鈕代碼

構造方法
final String detailMessage;
  DetailPage({this.detailMessage});
返回按鈕點擊代碼
onPressed: (){
    //            返回的時候攜帶數據回去
            Navigator.of(context).pop('從DetailPage返回回來的數據');
//            傳的數據是泛型徽诲,所以也可以傳對象
//            Navigator.of(context).pop({'username':'name','passwd':'admin'});
 },

二刹帕、flutter中通過pushNamed、pop來進行頁面之間的跳轉和返回

Home.dart Home界面的跳轉代碼

在Home頁配置好路由
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
//      先加入跳轉的路由 實際開發(fā)中最好將routes抽取到一個類中
      routes: <String, WidgetBuilder>{
        "/Detail":(context){
          return DetailPage();
        }
      },
    );
  }
}
通過pushNamed跳轉的代碼
          onPressed: (){
              Future result = Navigator.of(context).pushNamed('/Detail',arguments: '通過pushName從HomePage跳轉過來的');
              result.then((value){
//                value就是Detail返回時攜帶的數據
              });
          },

Detail.dart Detail界面返回按鈕代碼

詳情頁接收Home頁pushNamed跳轉時攜帶的數據
final message = ModalRoute.of(context).settings.arguments;
詳情頁返回按鈕點擊代碼
          onPressed: (){
              Navigator.of(context).pop('從DetailPage返回回來的數據');
          }

上面都是跳轉到無參構造器的界面中谎替,如果需要跳轉到有參構造器的widget中偷溺,并傳入參數,這時就需要用到回調函數onGenerateRoute

    return MaterialApp(
//      該回調函數可以自己生成路由
      onGenerateRoute: (settings){
//        判斷路由名稱并生成路由
        if(settings.name == "other"){
//          需要返回一個Route钱贯,Route是一個抽象類挫掏,所以需要找其子類,一般使用MaterialPageRoute
          return MaterialPageRoute(
              builder: (context){
//                argument就是pushnamed時傳入參數
                final String argument = settings.arguments;
//                獲取到參數后就可以傳入有參構造器中
                return WPOther(argument);
              }
          );
        }
// 如果路由名稱不是other喷舀,則返回null
        return null;
      },
    )

跳轉的代碼

//這里的arguments參數就是需要傳入到構造器中的參數砍濒,在上面onGenerateRoute回調中就可以拿到該參數進行初始化
Navigator.of(context).pushNamed("other",arguments: "other-arguments");

如果跳轉時傳入的路由名稱是隨便填的,這樣會導致程序奔潰硫麻,所以我們可以用onUnknownRoute回調函數返回一個錯誤提示的界面來防止程序奔潰

        return MaterialApp(
//      當跳轉的路由不存在時會走這個回調爸邢,可以讓他跳轉到錯誤界面給出提示,防止奔潰
      onUnknownRoute: (settings){
        return MaterialPageRoute(
          builder: (context){
            return WPError(settings.arguments);
          }
        );
      },
    );

總結:

1拿愧、push跳轉:直接使用下面的代碼杠河,將要跳轉的界面DetailPage加入到MaterialPageRoute中,如果需要傳參,就在DetailPage中加入對應的構造方法券敌,直接進行傳參

Navigator.of(context).push(MaterialPageRoute(
        builder: (content){
            return DetailPage(detailMessage: '從HomePage跳轉過來的',);
        }
))

2唾戚、pushNamed跳轉:MaterialApp中有個routes屬性,是一個Map<String, WidgetBuilder>待诅,WidgetBuilder是一個函數

final Map<String, WidgetBuilder> routes;
typedef WidgetBuilder = Widget Function(BuildContext context);
routes: <String, WidgetBuilder>{
跳轉的路由名稱"/Detail"
      "/Detail":(context){
返回需要跳轉的widget
          return DetailPage();
      }
 },

跳轉時可以傳入參數 arguments
Navigator.of(context).pushNamed('/Detail',arguments: '通過pushName從HomePage跳轉過來的');

接收參數代碼
final message = ModalRoute.of(context).settings.arguments;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末叹坦,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子卑雁,更是在濱河造成了極大的恐慌募书,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件测蹲,死亡現場離奇詭異莹捡,居然都是意外死亡,警方通過查閱死者的電腦和手機扣甲,發(fā)現死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門篮赢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琉挖,你說我怎么就攤上這事启泣。” “怎么了粹排?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵种远,是天一觀的道長。 經常有香客問我顽耳,道長坠敷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任射富,我火速辦了婚禮膝迎,結果婚禮上,老公的妹妹穿的比我還像新娘胰耗。我一直安慰自己限次,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布柴灯。 她就那樣靜靜地躺著卖漫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赠群。 梳的紋絲不亂的頭發(fā)上羊始,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音查描,去河邊找鬼突委。 笑死柏卤,一個胖子當著我的面吹牛,可吹牛的內容都是我干的匀油。 我是一名探鬼主播缘缚,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敌蚜!你這毒婦竟也來了桥滨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弛车,失蹤者是張志新(化名)和其女友劉穎该园,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體帅韧,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年啃勉,在試婚紗的時候發(fā)現自己被綠了忽舟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡淮阐,死狀恐怖叮阅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情泣特,我是刑警寧澤浩姥,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站状您,受9級特大地震影響勒叠,放射性物質發(fā)生泄漏。R本人自食惡果不足惜膏孟,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一眯分、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柒桑,春花似錦弊决、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至界逛,卻和暖如春昆稿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仇奶。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工貌嫡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留比驻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓岛抄,卻偏偏與公主長得像别惦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子夫椭,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容