Flutter学习日记之使用路由进行页面切换
本文地址:https://blog.csdn.net/qq_40785165/article/details/116900126,轉(zhuǎn)載需附上此地址
大家好,我是小黑,一個(gè)還沒禿頭的程序員~~~
你多學(xué)一樣本事,就少說一句求人的話!
說實(shí)話,學(xué)的時(shí)候真痛苦,與原生Android還是有區(qū)別的,但是畢竟是一種趨勢,學(xué)到就是賺到,今天分享的是Flutter中的路由,開發(fā)中可以利用這個(gè)進(jìn)行頁面跳轉(zhuǎn)。效果如圖:
源碼地址:https://gitee.com/fjjxxy/flutter-study.git
(一)先介紹基本的路由,沒有對(duì)路由進(jìn)行管理,直接引入頁面組件,使用push/pop進(jìn)行跳轉(zhuǎn)/返回,對(duì)應(yīng)demo中的首頁跳轉(zhuǎn)到第二個(gè)頁面,RaisedButton是按鈕,設(shè)置了點(diǎn)擊事件以及內(nèi)部組件,代碼如下,
RaisedButton(onPressed: () {Navigator.of(context).push(MaterialPageRoute(builder: (context) {return SecondPage(arguments: {"id":1},);}));}, //這個(gè)屬性不能為空,不然背景顏色無效child: Text("路由",style: TextStyle(color: Colors.white),),color: Colors.red,)(二)基本路由跳轉(zhuǎn)傳值,通過定義構(gòu)造函數(shù)進(jìn)行傳值,上面的代碼中已進(jìn)行傳值,參數(shù)名為arguments,值為1;對(duì)應(yīng)Demo中第二個(gè)頁面的構(gòu)造方法中的arguments可選參數(shù),代碼如下:
import 'package:flutter/material.dart';class SecondPage extends StatefulWidget {final arguments;SecondPage({Key key, this.arguments}) : super(key: key);@override_SecondPageState createState() => _SecondPageState(arguments: this.arguments); }class _SecondPageState extends State<SecondPage> {Map arguments;_SecondPageState({this.arguments});@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: Content(arguments: arguments,),),appBar: AppBar(title: Text("第二個(gè)頁面"),),);} }class Content extends StatelessWidget {Map arguments;Content({this.arguments});@overrideWidget build(BuildContext context) {return Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text("這是第二個(gè)頁面:id=${arguments["id"]}"),RaisedButton(onPressed: () {Navigator.pushNamed(context, "/third");},child: Text("命名路由跳轉(zhuǎn)第三個(gè)頁面"),)],);} }(三)命名路由,對(duì)所有的路由進(jìn)行管理,使用Map中的key進(jìn)行跳轉(zhuǎn),Demo中除了上例中的跳轉(zhuǎn)之外,其他使用的都是命名路由,首先先定義一個(gè)路由文件,對(duì)路由的路徑以及配置進(jìn)行統(tǒng)一管理,代碼如下:
Routes.dart
import 'package:flutter/material.dart'; import 'MainPage.dart'; import 'SecondPage.dart'; import 'ThirdPage.dart'; import 'ForthPage.dart';//管理路由,main.dart直接導(dǎo)入這個(gè)路由管理就行 //arguments代表跳轉(zhuǎn)時(shí)傳的值 final routes = {'/': (context) => MainPage(), //配置根目錄,默認(rèn)首頁'/second': (context, {arguments}) => SecondPage(arguments: arguments),'/third': (context) => ThirdPage(),'/forth': (context, {arguments}) => ForthPage(arguments: arguments), };var onGenerateRoute = (RouteSettings settings) {//統(tǒng)一處理final String name = settings.name;final Function pageContentBuilder = routes[name];if (pageContentBuilder != null) {if (settings.arguments != null) {final Route route = MaterialPageRoute(builder: (context) =>pageContentBuilder(context, arguments: settings.arguments));return route;} else {final Route route =MaterialPageRoute(builder: (context) => pageContentBuilder(context));return route;}} };接著在main.dart中設(shè)置廚師路由以及路由配置,代碼如下:
import 'package:flutter/material.dart';import 'Routes.dart';void main() {runApp(MyApp()); }class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(//設(shè)置完命名路由不能只是熱加載,要重新運(yùn)行,真的氣!//路由頁面不能用MaterialApp包裹,不然沒有返回鍵//跳轉(zhuǎn)的時(shí)候構(gòu)造方法中沒有接收參數(shù)就別傳參數(shù),會(huì)報(bào)錯(cuò)initialRoute: "/",//初始路由,首頁onGenerateRoute: onGenerateRoute,//路由的配置theme: ThemeData(primarySwatch: Colors.red),);} }?跳轉(zhuǎn)代碼如下,Demo中為頁面二跳轉(zhuǎn)頁面三:
RaisedButton(onPressed: () {Navigator.pushNamed(context, "/third");},child: Text("命名路由跳轉(zhuǎn)第三個(gè)頁面"),)?如果需要傳值,可以按照上例基本路由中,給下個(gè)頁面組件定義帶參數(shù)的構(gòu)造方法,并在跳轉(zhuǎn)的方法中添加參數(shù)arguments,獲取傳值的方法與基本路由一致,使用$獲取即可,如下代碼所示:
RaisedButton(onPressed: () {Navigator.pushNamed(context, "/third",arguments: {"id":1});},child: Text("命名路由跳轉(zhuǎn)第三個(gè)頁面"),)(四) 返回的代碼如下:
RaisedButton(onPressed: () {Navigator.pop(context);},child: Text("普通返回"),)?(五)講完了普通的路由跳轉(zhuǎn),還有其他幾個(gè)跳轉(zhuǎn)Api介紹一下:
(1)替換路由:Navigator.pushReplacementNamed
適用場景:Page1->Page2->Page3->Page4,這個(gè)時(shí)候返回到Page2,而不是Page3,這個(gè)時(shí)候需要在Page3跳轉(zhuǎn)到Page4的時(shí)候把Page3的路由替換,這樣返回的時(shí)候就變成了返回到Page2,傳值依然可以用定義帶參構(gòu)造方法來實(shí)現(xiàn),代碼如下:
RaisedButton(onPressed: () {Navigator.pushReplacementNamed(context, "/forth", arguments: {"content":"替換路由會(huì)加載下一個(gè)頁面并讓下一個(gè)頁面替換當(dāng)前的路由,\n即page1->page2->page3(這時(shí)候替換路由并跳轉(zhuǎn))->page4,這時(shí)候返回會(huì)回到page2,因?yàn)閜age3被替換了"});},child: Text("替換路由并跳轉(zhuǎn)到第四個(gè)頁面,返回到第二個(gè)頁面"),)(2)清除之前的路由直到你想要的舊頁面:
?適用場景:直接返回到某操作的開始頁面或者App首頁,這個(gè)Api可以在跳轉(zhuǎn)中清除之前的路由,直到你設(shè)置的終點(diǎn)頁面,代碼如下:
RaisedButton(onPressed: () {//這種方式用構(gòu)造方法傳值,適用于基本路由跳轉(zhuǎn)// Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context)=> MainPage()), (route) => false);//這種方式可以用arguments參數(shù)傳值,適用于命名路由跳轉(zhuǎn)//第三個(gè)參數(shù)為true->可以返回,false->無法返回Navigator.pushNamedAndRemoveUntil(context, "/", (route) => false);},child: Text("移除之前的路由并返回"),)(六)注意事項(xiàng)?
注意事項(xiàng): 1.設(shè)置完命名路由不要只是熱加載,報(bào)錯(cuò)的時(shí)候可以重新運(yùn)行試試,真的氣! 2.路由頁面不能用MaterialApp包裹,不然沒有返回鍵 3.跳轉(zhuǎn)的時(shí)候構(gòu)造方法中沒有接收參數(shù)就別傳參數(shù),會(huì)報(bào)錯(cuò)到此為止,Flutter的路由跳轉(zhuǎn)就介紹完畢了,還是有些坑的,需要多嘗試多總結(jié),源碼地址,最后,希望喜歡我文章的朋友們可以幫忙點(diǎn)贊、收藏、評(píng)論,也可以關(guān)注一下,如果有問題可以在評(píng)論區(qū)提出,后面我會(huì)持續(xù)更新Flutter的學(xué)習(xí)記錄,與大家分享,謝謝大家的支持與閱讀!
總結(jié)
以上是生活随笔為你收集整理的Flutter学习日记之使用路由进行页面切换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 微信创建客服,如何给微信小程序内
- 下一篇: 我的消费记录怎么查看呢?