• <ul id="cgeq2"></ul>
  • 歡迎您光臨深圳塔燈網絡科技有限公司!
    電話圖標 余先生:13699882642

    網站百科

    為您解碼網站建設的點點滴滴

    Flutter之路由使用

    發表日期:2018-11 文章編輯:小燈 瀏覽次數:4308

    時隔許久,繼之前發的Flutter入門(環境配置)文章之后,終于有時間來寫一下其他方面的東西啦,之前的20天真的是忙得焦頭爛額啊,從學習Flutter到將項目懟上線不到一個月的時間,邊學邊開發,沒有輪子可搬,自己瘋狂的造,還不斷的踩坑(坑還不容易找到解決辦法),整天整天的沒有停下來過,簡直了。。。
    好在到現在熬過來了,也終于有時間來好好的對Flutter進行一下總結和回顧,請各位小伙伴們敬請期待后面的不斷更新呦。
    今天跟大家聊聊Flutter中非常重要的一個東西:路由
    這是不得不好好研究和學習的一個知識點,用的不好會讓你非常的頭疼,也會給你造成非常多的問題。

    第一點:push使用

    1.pushNamed——Navigator.of(context).pushNamed('routeName'); 

    此種方法只是簡單的將我們需要進入的頁面push到棧頂,以此來顯示當前頁面,其參數是一個字符串類型,傳入的是頁面對應的路由名稱
    該路由名稱需要在程序主入口中進行定義。定義方法為:

    void main() { runApp( new MaterialApp( home: new Screen1(), routes: <String, WidgetBuilder> { '/screen1': (BuildContext context) => new Screen1(), '/screen2' : (BuildContext context) => new Screen2(), '/screen3' : (BuildContext context) => new Screen3(), }, ) ); } 

    使用:Navigator.of(context).pushNamed('/screen1');直接進入screen1頁面(每次都將新建一個新的頁面)

    2.1 pushReplacementNamed——Navigator.of(context).pushReplacementNamed('/screen4'); 

    指把當前頁面在棧中的位置替換成跳轉的頁面(替換導航器的當前路由,通過推送路由[routeName]),當新的頁面進入后,之前的頁面將執行dispose方法。
    下面為官方說明:

    Replace the current route of the navigator that most tightly encloses the given context by pushing the route named [routeName] and then disposing the previous route once the new route has finished animating in. 

    即比如當前從頁面1進入頁面2,在頁面2使用
    Navigator.of(context).pushReplacementNamed('/screen3');進入頁面3,當進入了頁面3后,頁面2將執行dispose方法,此時在頁面3返回時,會回到頁面1.

    使用情況:例如
    從SplashScreen到HomeScreen。它應該只顯示一次,用戶不應該再從主屏幕回到它。在這種情況下,由于我們將要進入一個全新的屏幕,
    我們可能想要使用這個方法來實現它的enter animation屬性。

    2.2pushReplacement——Navigator.pushReplacement( context, MaterialPageRoute(builder: (BuildContext context) => screen4())); 

    這個用法跟2.1相同,只是路由的傳遞有差別,上方的是傳遞路由名稱(頁面對應的名稱,需在入口定義(本文第一點)),而后者只需new對應頁面即可,而且可以傳遞
    參數(傳參方式類似于本文后續所說的傳遞方法)。

    3.popAndPushNamed——Navigator.popAndPushNamed(context, '/screen4'); 

    指將當前頁面pop,然后跳轉到制定頁面(將當前路由彈出導航器,并將命名路由推到它的位置。)
    下面為官方說明:

    Pop the current route off the navigator that most tightly encloses the given context and push a named route in its place. 

    使用情況:例如
    在購物應用中,有產品列表,用戶在產品列表中可以通過篩選,來進一步選擇商品,在這個過程中,用戶點擊篩選按鈕時,會進入篩選條件選擇界面,當用戶點擊
    確定篩選按鈕時,應彈出篩選界面,并使用新的篩選條件進入產品列表。這種情況popAndPushNamed就更合適了。

    4.pushNamedAndRemoveUntil——Navigator.of(context).pushNamedAndRemoveUntil('/screen4', (Route<dynamic> route) => false); 

    指將制定的頁面加入到路由中,然后將其他所有的頁面全部pop, (Route<dynamic> route) => false將確保刪除推送路線之前的所有路線。
    這時候將打開一個新的screen4頁面

    Push the route with the given name onto the navigator, and then remove all the previous routes until the `predicate` returns true. 

    使用情況:例如
    當用戶點擊了退出登錄時,我們需要進入某一個頁面(比如點退出登錄后進入了登錄頁),這個時候用戶點擊返回時不應該能進入任何一個頁面,這種情況就可以使用。

    5.1 pushNamedAndRemoveUntil——Navigator.of(context).pushNamedAndRemoveUntil('/screen4', ModalRoute.withName('/screen1')); 

    指將制定的頁面加入到路由中,然后將之前的路徑移除知道制定的頁面為止(將具有給定名稱的路由推到導航器上,然后刪除所有路徑前面的路由直到'predicate'返回true為止。)
    這時候將銷毀棧內除了screen4的頁面,點擊直接去棧內screen4,這時screen4會重新build

    Push the route with the given name onto the navigator, and then remove all the previous routes until the `predicate` returns true. 

    使用情況:例如
    一個購物應用程序的例子!或者任何需要支付交易的應用程序。因此,在這些應用程序中,一旦用戶完成了支付事件,所有與交易或購物車相關的屏幕都應該從堆棧中刪除,用戶應該進入到支付確認頁面。單擊back按鈕應將它們返回到產品列表或主屏幕。
    使用實例:
    1-->2-->3,3到4時使用Navigator.pushNamedAndRemoveUntil(context,"/screen4",ModalRoute.withName('/screen1'));
    這時候如果在頁面4點擊返回,將會直接退出程序。
    1-->2-->3,3到4時使用Navigator.pushNamedAndRemoveUntil(context,"/screen4",ModalRoute.withName('/'));
    這時候如果在頁面4點擊返回,將會直接回到頁面1。
    1-->2-->1-->2-->3,3到4時使用Navigator.pushNamedAndRemoveUntil(context,"/screen4",ModalRoute.withName('/screen1'));
    這時候如果在頁面4點擊返回,將會回到第二個1頁面。

    5.2

    Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (BuildContext context) => newscreen4()), ModalRoute.withName('/'), 

    這種方法跟上述方法作用相同,不同之處在于,上述傳遞的是路由名稱,這個名稱需要你在入口處進行路由指定,而這種則無需指定,直接new 出來即可,
    而且可以傳遞參數。(看其名稱即可發現差別pushNamedAndRemoveUntil與pushAndRemoveUntil)使用這種作用如下
    1-->2-->3,3到4時使用此方法,這時候如果在頁面4點擊返回,將會直接回到頁面1。

    如果使用

    Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (BuildContext context) => Screen4()), (Route<dynamic> route) => false, ); 

    這時候進入4后。4將成為唯一的一個頁面。其他頁面都將pop出棧,這個跟上述pushNamedAndRemoveUntil也一致。

    6.popUntil——Navigator.popUntil(context, ModalRoute.withName('/screen2')); 

    有些應用場景下,用戶可能不得不填寫一個由三部分組成的長表單,該表單可能在移動應用程序的三個連續屏幕中顯示。現在在表單的第三個頁面,用戶決定取消填寫表單。用戶單擊Cancel,就會彈出所有之前的與表單相關的屏幕,并將用戶帶回主屏幕,從而丟失所有與表單相關的數據(在這種情況下,這是我們想要的)。我們不會在這里推出任何新東西,只是回到以前的路線。

    第二點pop

    1.Navigator.of(context).maybePop(); 

    maybePop 會自動進行判斷,如果當前頁面pop后,會顯示其他頁面,不會出現問題,則將執行當前頁面的pop操作
    否則將不執行。

    2.Navigator.of(context).canPop(); 
    canPop判斷當前頁面能否進行pop操作,并返回bool值 
    3.Navigator.of(context).pop(); 

    直接退出當前頁面

    第三點傳參和參數返回

    傳參的方式很簡單,在需要接收參數的頁面進行參數定義,并加入其構造函數中,在跳轉到該頁面時,使用MaterialPageRoute并在頁面中傳入參數即可。

    String params;Navigator.push(context, new MaterialPageRoute(builder: (BuildContext context) => new mainPage(params))); 接收參數 class mainPage extends StatelessWidget { final String userName; mainPage(this.userName); @override Widget build(BuildContext context) { print(userName); } 

    帶返回值的頁面跳轉:

    String userName = "yinll"; Navigator.push( context, new MaterialPageRoute( builder: (BuildContext context) => new Screen5(userName))).then((data){ result =data; print(result); }); 

    然后screen5中,在返回時使用:Navigator.of(context).pop('這是頁面5返回的參數');
    在pop中寫上返回的的值,這時候在上方的then中即可得到返回的數據。

    好啦小伙伴們,今天就先說這么多,,后續我也會保持用法的不斷更新,可以點下關注,以便及時得到更新通知哦。哈哈!
    作為剛入坑Flutter的我而言,有些說的可能也存在錯誤,歡迎批評指正!


    本頁內容由塔燈網絡科技有限公司通過網絡收集編輯所得,所有資料僅供用戶學習參考,本站不擁有所有權,如您認為本網頁中由涉嫌抄襲的內容,請及時與我們聯系,并提供相關證據,工作人員會在5工作日內聯系您,一經查實,本站立刻刪除侵權內容。本文鏈接:http://www.juherenli.com/17618.html
    相關APP開發
     八年  行業經驗

    多一份參考,總有益處

    聯系深圳網站公司塔燈網絡,免費獲得網站建設方案及報價

    咨詢相關問題或預約面談,可以通過以下方式與我們聯系

    業務熱線:余經理:13699882642

    Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

    国产精品无码一二区免费| 精品日产卡一卡二卡国色天香 | 精品国产一区二区三区av片| 国产亚洲精品美女| 亚洲国产精品嫩草影院在线观看 | 精品久久久久久无码人妻蜜桃| 国产人成精品香港三级古代| 国产精品igao视频| 精品久久久中文字幕| 久久精品无码一区二区WWW| 亚洲国产精品无码久久一线| 精品久久久久久国产牛牛app| 国产嫩草影院精品免费网址| 国产成人午夜精品影院游乐网| 97国产精品视频观看一| 久久国产乱子伦精品免费不卡| 国产成人综合久久精品下载| 亚洲国产精品99久久久久久| 国产福利微拍精品一区二区| 老司机亚洲精品影院无码| 亚洲精品狼友在线播放| 久久精品三级视频| 国产成人99久久亚洲综合精品| 国产成人精品影院狼色在线| 精品国产AV无码一区二区三区| 久久国产精品成人无码网站| 亚洲国产精品一区二区三区在线观看| 久久精品a亚洲国产v高清不卡| 国产高清在线精品一本大道国产| 国产精品jlzz视频| 国产精品一区不卡| 国产大陆亚洲精品国产| 国产精品扒开腿做爽爽爽的视频| 热re久久精品国产99热| 国产精品福利影院| 国产成人综合久久精品下载| 国产精品jizz观看| 一本久久A久久免费精品不卡| 亚洲国产主播精品极品网红 | 国产精品无码日韩欧| 无码人妻精品一区二区蜜桃百度|