日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flutter 返回指定界面_Flutter页面路由导航及传参

發布時間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flutter 返回指定界面_Flutter页面路由导航及传参 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請注明出處: https://learnandfish.com/

概述

每個應用都有很多個頁面,在flutter中同樣也有很多頁面,被稱之為路由(Router),頁面之間的跳轉通過導航器(Navigator)進行管理。
其中 Navigator.push 和 Navigator.pop 是最簡單的跳轉到新頁面和返回到上一級界面的方式。

路由分為靜態路由(即命名路由)和動態路由。頁面之間跳轉時往往需要傳遞參數,這稱之為路由傳值。下面我們會一一帶領大家學習。

通過本篇文章的學習我們的目標是熟練掌握路由及傳值,以后進行應用開發時對頁面跳轉方面不再疑惑。

靜態路由(即命名路由)

flutter中萬物皆widget,我們的頁面(route)也是widget的子類,所以我們定義一個界面也是通過繼承widget實現。
前面的博客我們已經定義過界面了,比如計數器實例,就是一個簡單的頁面,也就是一個路由。下面我們來詳細實現一個界面。
首先我需要一個入口函數,這個相信大家已經很熟悉了,就是在main方法中調用runApp函數進入應用,我們就不做詳細介紹了,直接給出代碼。

import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// 常用固定寫法,生成Material風格的Appreturn MaterialApp(title: "路由使用",theme: ThemeData(// 默認為亮色主題,可以設置[Brightness.dark]變成黑暗模式brightness: Brightness.light,),home: HomePage(), // 首頁面);} }class HomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {// 通過Scaffold可以方便的生成一個Material風格的頁面return Scaffold(// 頂部導航欄appBar: AppBar(title: Text("主頁面"),),body: Center(child: RaisedButton(child: Text("我是第一個界面,點擊我進入第二個界面"),onPressed: () {print("我是第一個界面,點擊我進入第二個界面");},),),);} }

上面的代碼是我們最常規的包含一個主頁面的應用。后續我們寫應用時候的基本框架也是在此基礎上進行擴展。
現在我們的想法是點擊這個頁面上的按鈕跳轉的第二個界面,首先我們需要構造第二個界面。構造第二個界面其實和我們構造第一個
界面HomePage一樣,繼承widget重寫自己想要的樣式即可。實現了頁面就要開始跳轉邏輯。

靜態路由即命名路由,在通過Navigator進行跳轉之前,需要在MaterialApp組件內顯式聲明路由的名稱,一旦聲明,路由的跳轉
方式就固定了,所以稱之為靜態路由,有唯一的名稱所以也稱之為命令路由。顯式聲明路由通過在MaterialApp內的routes屬性進行定義。

如果我們有很多個頁面和很多個其他類型的組件都放在lib下,對于后期維護簡直是一大折磨,所以分包是大多數平臺的常規操作,
就是對有同一種特性的東西放置在同一個包下,比如頁面類的組件都放在pages包,工具類的組件放在utils包下等。
接下來我們就新建一個pages包,把第二個界面SecondPage放進去,把第一個界面HomePage也提取出來放到這個包下。

我們分為一下三步進行靜態路由的跳轉:

  • 首先在lib目錄右鍵新建pages包,接著在pages包下新建SecondPage.dart文件,然后把HomePage提取到pages下,成為單獨的類。
  • 在RouteDemo類中的MaterialApp內聲明routes屬性,為了顯示聲明路由的名稱。
  • 使用Navigator進行頁面的跳轉和返回。
import 'package:flutter/material.dart';// 引入頁面路徑 import 'pages/HomePage.dart'; import 'pages/SecondPage.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// 常用固定寫法,生成Material風格的Appreturn MaterialApp(title: "路由使用",theme: ThemeData(// 默認為亮色主題,可以設置[Brightness.dark]變成黑暗模式brightness: Brightness.light,),// 默認加載的頁面initialRoute: '/', // 首頁面// 顯式聲明界面列表routes: {'/': (context) => HomePage(),'/secondPage': (context) => SecondPage(),},);} }

首頁面單獨提取出來之后的代碼如下。

import 'package:flutter/material.dart';class HomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {// 通過Scaffold可以方便的生成一個Material風格的頁面return Scaffold(// 頂部導航欄appBar: AppBar(title: Text("主頁面"),),body: Center(child: RaisedButton(child: Text("我是第一個界面,點擊我進入第二個界面"),onPressed: () {print("我是第一個界面,點擊我進入第二個界面");// 跳轉到第二個界面Navigator.pushNamed(context, '/secondPage');},),),);} }

第二個頁面提取之后的代碼。

import 'package:flutter/material.dart';class SecondPage extends StatelessWidget {@overrideWidget build(BuildContext context) {// 通過Scaffold可以方便的生成一個Material風格的頁面return Scaffold(// 頂部導航欄appBar: AppBar(title: Text("第二個界面"),),body: Center(child: RaisedButton(child: Text("我是第二個界面,點擊我進入第二個界面"),onPressed: () {print("我是第二個界面,點擊我返回到第一個界面");// 返回上一個界面Navigator.pop(context);},),),);} }

對于命名路由的跳轉,通過Navigator.pushNamed方法調用,通過Navigator.pop方法返回上一級界面。

動態路由

動態路由不需要顯示聲明,直接通過代碼實現。

class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// 常用固定寫法,生成Material風格的Appreturn MaterialApp(title: "路由使用",theme: ThemeData(// 默認為亮色主題,可以設置[Brightness.dark]變成黑暗模式brightness: Brightness.light,),home: HomePage(),);} }

在HomePage界面通過調用Navigator.push方法實現跳轉。第二個頁面的返回邏輯不變。

Navigator.push(context,MaterialPageRoute(builder: (context) => SecondPage(),));

動態路由的相互傳參

有時候我們不僅需要跳轉到對應界面,還需要傳遞一些參數給下一個界面,同時下一個界面返回時,把某些參數再次傳遞給該界面。
我們修改SecondPage組件的構造方法,為了接收需要傳遞的參數。這時候我們第二個頁面結構如下:

class SecondPage extends StatelessWidget {// 定義一個需要變量, 接收傳遞的參數final String title;// 為title設置一個默認參數,這樣的跳轉該界面時可以不傳值。SecondPage({Key key, this.title = "第二個界面"});@overrideWidget build(BuildContext context) {// 通過Scaffold可以方便的生成一個Material風格的頁面return Scaffold(// 頂部導航欄appBar: AppBar(title: Text(title),),body: Center(child: RaisedButton(child: Text("我是第二個界面,點擊我進入第二個界面"),onPressed: () {print("我是第二個界面,點擊我返回到第一個界面");// 返回上一個界面Navigator.pop(context);},),),);} }

第一個界面跳轉的地方代碼是這樣的。

Navigator.push(context,MaterialPageRoute(// 傳遞title為SecondPage,跳轉到第二個界面就會把標題設置為SecondPagebuilder: (context) => SecondPage(title: "SecondPage"),));},

說完了從第一個頁面往第二個頁面傳遞了參數,如果第二個頁面返回時傳遞一句話,然后第一個頁面接收到這句話然后打印出來,
代碼修改如下:

// HomePage頁面代碼 Navigator.push(context,MaterialPageRoute(// 傳遞title為SecondPage,跳轉到第二個界面就會把標題設置為SecondPagebuilder: (context) => SecondPage(title: "SecondPage"),// 調用then等待接收返回數據)).then((value) => print(value));// SecondPage頁面代碼Navigator.pop(context, "返回傳遞數據");

靜態路由(即命名路由)的相互傳參

講完了動態路由及動態路由傳參之后,我們來講一下靜態路由傳參,參數的傳遞方式是flutter為我們定義好的,我們只需要把固定
代碼拷貝回來,稍微修改即可。為了更具有普遍性,我們再定義一個頁面ThirdPage。

在我們顯示聲明了routes之后,還需要在MaterialApp組件內添加onGenerateRoute屬性內容進行參數傳遞的處理。
完整代碼如下:

import 'package:flutter/material.dart';import 'pages/HomePage.dart'; import 'pages/SecondPage.dart'; import 'pages/ThirdPage.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {// 聲明所有的頁面final routes = {'/': (context, {arguments}) => HomePage(),'/secondPage': (context, {arguments}) => SecondPage(),'/thirdPage': (context, {arguments}) => ThirdPage(arguments: arguments),};@overrideWidget build(BuildContext context) {// 常用固定寫法,生成Material風格的Appreturn MaterialApp(title: "路由使用",theme: ThemeData(// 默認為亮色主題,可以設置[Brightness.dark]變成黑暗模式brightness: Brightness.light,), // home: HomePage(),initialRoute: '/', // 默認界面// 當頁面跳轉時進行參數處理onGenerateRoute: (RouteSettings settings) {// 獲取聲明的路由頁面函數var pageBuilder = routes[settings.name];if (pageBuilder != null) {if (settings.arguments != null) {// 創建路由頁面并攜帶參數return MaterialPageRoute(builder: (context) =>pageBuilder(context, arguments: settings.arguments));} else {return MaterialPageRoute(builder: (context) => pageBuilder(context));}}return MaterialPageRoute(builder: (context) => HomePage());},);} }

第二個頁面傳遞參數時使用Navigator.pushNamed方法,具體代碼如下:

import 'package:flutter/material.dart';class SecondPage extends StatelessWidget {// 定義一個需要變量, 接收傳遞的參數final String title;// 為title設置一個默認參數,這樣的跳轉該界面時可以不傳值。SecondPage({Key key, this.title = "第二個界面"});@overrideWidget build(BuildContext context) {// 通過Scaffold可以方便的生成一個Material風格的頁面return Scaffold(// 頂部導航欄appBar: AppBar(title: Text(title),),body: Center(child: RaisedButton(child: Text("我是第二個界面,點擊我進入第二個界面"),onPressed: () {print("我是第二個界面,點擊我進入第三個界面");// 通過arguments指定參數Navigator.pushNamed(context, "/thirdPage",arguments: {'title': "命令路由傳遞過來的title"});},),),);} }

第三個頁面獲取參數,完整代碼如下:

import 'package:flutter/material.dart';class ThirdPage extends StatelessWidget {final Map arguments;// 為title設置一個默認參數,這樣的跳轉該界面時可以不傳值。ThirdPage({Key key, this.arguments});@overrideWidget build(BuildContext context) {// 通過Scaffold可以方便的生成一個Material風格的頁面return Scaffold(// 頂部導航欄appBar: AppBar(title: Text("${arguments != null ? arguments['title'] : "ThirdPage"}"),),body: Center(child: RaisedButton(child: Text("我是第三個界面,點擊我進入第二個界面"),onPressed: () {print("我是第三個界面,點擊我返回到第二個界面");// 返回上一個界面Navigator.pop(context, "返回傳遞數據Page3");},),),);} }

命名路由傳參優化

上面我們已經實現了參數的傳遞,但是routes頁面列表和onGenerateRoute比較固定,我們能夠把這兩個單獨提取出來成為
一個單獨的類,這樣后期再創建頁面或者維護的時候只需要修改這一個類就行了。

我們新建一個PageConstants類,進行提取,修改后的代碼如下:

import 'package:flutter/material.dart';// 引入頁面路徑 import '../pages/HomePage.dart'; import '../pages/SecondPage.dart'; import '../pages/ThirdPage.dart';// 聲明所有頁面 final routes = {'/': (context, {arguments}) => HomePage(),'/secondPage': (context, {arguments}) => SecondPage(),'/thirdPage': (context, {arguments}) => ThirdPage(arguments: arguments), };// 處理參數傳遞 // ignore: top_level_function_literal_block var onGenerateRoute = (RouteSettings settings) {// 獲取聲明的路由頁面函數var pageBuilder = routes[settings.name];if (pageBuilder != null) {if (settings.arguments != null) {// 創建路由頁面并攜帶參數return MaterialPageRoute(builder: (context) =>pageBuilder(context, arguments: settings.arguments));} else {return MaterialPageRoute(builder: (context) => pageBuilder(context));}}return MaterialPageRoute(builder: (context) => HomePage()); };

這時候我們只需要簡單修改MyApp組件即可:

import 'package:flutter/material.dart'; import 'package:hello_flutter/pages/PageConstants.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// 常用固定寫法,生成Material風格的Appreturn MaterialApp(title: "路由使用",theme: ThemeData(// 默認為亮色主題,可以設置[Brightness.dark]變成黑暗模式brightness: Brightness.light,),initialRoute: '/', // 默認界面// 通過PageConstants引入onGenerateRoute: onGenerateRoute,);} }

這樣來看就會清爽很多。

篇幅所限,這次的內容就先講到這里,下篇文章繼續講往后的內容,應該會單獨講一講實現仿閑魚底部tab頁面切換和仿頭條多tab頁切換。

為了第一時間獲取最新文章,請關注公眾號 -- 程序員指北,每一個關注都能讓作者多搬一塊磚。

總結

以上是生活随笔為你收集整理的flutter 返回指定界面_Flutter页面路由导航及传参的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内自拍在线观看 | 国产老头老太作爱视频 | 欧美精品一区二区蜜臀亚洲 | 日韩爱爱网 | 五月天丁香在线 | 欧美一级视频 | 人人爽人人爽人人片av | 久久短视频 | 国产成人综合在线观看 | 日本三级吹潮 | 欧美11一13sex性hd | 日韩av一区二区在线播放 | 天天搞天天 | 字幕网av| 成人免费在线小视频 | 69视频在线观看 | 国产午夜在线视频 | 日本少妇xxx | 欧美国产成人在线 | 久久经典 | 日韩午夜在线视频 | 九九热在线视频观看 | 亚洲天堂成人网 | 女同调教视频 | 久久综合久久88 | 夜夜夜夜夜操 | 亚洲αv | 69国产精品视频 | 国产精久久久 | 日日射av | 日韩在线电影一区二区 | 国产一区二区网址 | 成年网站 | 天天摸天天做天天爽水多 | 高潮疯狂过瘾粗话对白 | 国产在线免费av | 国产亚洲色婷婷久久99精品 | 午夜av导航 | 中国白嫩丰满人妻videos | 欧洲精品视频在线观看 | 欧洲一区二区三区四区 | 欧美精品在线一区二区三区 | 中国国语农村大片 | 草草色| 光明影院手机版在线观看免费 | 欧美bbbbb性bbbbb视频 | 国产精品999. | 国产网址在线 | 国产xx视频 | 成人欧美一区二区 | 性生活视频软件 | 中文字幕在线观看第一页 | 日韩欧美一二三四区 | 亚洲色欲色欲www在线观看 | 综合久久一区 | 天天狠狠干 | 乱子伦一区二区 | 岛国av免费在线观看 | 香蕉视频2020 | 日韩美女网站 | 国产黄频 | 亚洲午夜剧场 | 色综合天天干 | 国产欧美精品在线观看 | 亚洲AV无码成人精品区东京热 | 欧美一级一片 | 成人在线免费电影 | 国产丝袜在线 | 亚洲自拍偷拍精品视频 | 麻豆av在线| 国产天堂精品 | jizz成人| 天天噜| 成人在线视频免费播放 | 日韩aaaaaa| 美女主播在线观看 | 少妇人妻一区二区三区 | 中国女人内谢69xxxxⅹ视频 | wwwxxxxx日本| 成人免费看片在线观看 | 性xxx欧美| 亚洲精品免费视频 | 欧美成人手机视频 | 亚洲少妇15p | 超碰超碰97 | 九色国产精品 | 日本女优在线看 | 久热这里只有 | 欧美日韩亚洲一区 | 影音先锋男人资源网站 | 久久偷拍免费视频 | 天堂av在线网 | 96视频在线观看 | 大尺度做爰无遮挡露器官 | 高清乱码毛片入口 | 麻豆亚洲av成人无码久久精品 | 777色 | 久久精品h| 国产在线www |