<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Flutter提供了一個完整的用於在螢幕之間導航和處理深層連結的系統。沒有複雜深度連結的小型應用程式可以使用Navigator
,而具有特定深度連結和導航要求的應用程式也應該使用Router
來正確處理Android
和iOS
應用上的深度連結,並在應用程式在web上執行時與位址列保持同步。
Navigator
導航組可以用正確的過渡動畫來展示對應的介面,當然,和web端的路由類似,介面其實也是以棧
的形式儲存著。
通過路由的buildContext
上下文,並且呼叫對應的push()
或pop()
方法,我們就可以導航到新的介面,比如:
onPressed: () { Navigator.of(context).push( MaterialPageRoute( builder: (context) => const SongScreen(song: song), ), ); }, child: Text(song.name),
由於Navigator
儲存了一個Route
物件的堆疊(表示歷史堆疊),所以push()
方法也使用Route
物件作為引數。MaterialPageRoute
物件是Route
的子類,用於指定Material Design
的過渡動畫。
對於有些具有簡單導航和深度連結需求的應用程式,我們可以使用Navigator
進行導航,使用MaterialApp
物件的routes
屬性對路由進行設定:
@override Widget build(BuildContext context) { return MaterialApp( routes: { '/': (context) => HomeScreen(), '/details': (context) => DetailScreen(), }, ); }
我們在這裡設定的路由就是命名路由
。
儘管命名路由可以處理深層連結,但是他們的表現總是一致的,沒辦法做到自定義。當應用平臺接收到一個新的深層連結,不論使用者此時在哪個位置,Flutter都會將新的路線推播到導航器上。
使用命名路由的Flutter應用也不支援瀏覽器的前進按鈕。基於這些原因,官方其實是不建議在大多數應用中使用命名路由。
當然,實際開發過程中,我們需要根據實際情況進行調整。
具有高階導航和路由要求的Flutter應用程式(例如使用到每個螢幕的直接連結的web應用程式,或具有多個,或者巢狀導航Navigator
元件的應用程式)應使用諸如go_router
之類的路由包,該包可以在應用程式收到新的深度連結時解析路由路徑並設定Navigator
。
要使用路由,我們需要切換到MaterialApp
或Cupertino App
上的路由器建構函式,併為其提供路由器設定。
MaterialApp.router( routerConfig: GoRouter( // … ) );
由於像go_router
這樣的包是宣告性的,所以當接收到深度連結時,它們將始終顯示相同的介面。
Router
和Navigator
在設計時就可以協同工作。我們可以使用像go_router
這樣的路由包的 API進行路由的跳轉,也可以使用Navigator
的push()
或pop()
方法進行導航。
當我們使用Router
或宣告性路由包進行導航時,Navigator
上的每個路由頁面都是支援的。這表示,路由是根據頁面上的使用了頁面上引數的Navigator
建構函式建立的路由。
相反,通過呼叫Navigator.push()
等方法的路由導航,將會在導航中新增一個pageless
(無頁面)的路由。如果我們使用的是路由包,則頁面支援的路由始終是可深度連結的,而無頁面的路由則不是。
當從導航器中刪除頁面支援的路由時,它之後的所有無頁面路由也將被刪除。例如,如果深度連結通過從導航器中刪除頁面支援的路由來導航,則之後(直到下一個_pagebacked路由)的所有無頁面路由也將被刪除。
Flutter支援iOS、Android和web瀏覽器上的深度連結。開啟URL會在應用程式中顯示該螢幕。通過以下步驟,我們可以使用命名路由(使用routes引數或onGenerateRoute)或使用Router小部件啟動和顯示路由。
如果我們在web瀏覽器中執行應用程式,則無需額外設定。路由路徑的處理方式與iOS或Android深度連結相同。預設情況下,web應用程式使用模式:/#/path/to/app/screen
從url片段讀取深度連結路徑,但這可以通過設定應用程式的url策略來更改。
只需要在AndroidManifest.xml
組態檔中的<activity>
標籤中新增一個後設資料標籤和意向過濾器標籤即可:
<!-- Deep linking --> <meta-data android:name="flutter_deeplinking_enabled" android:value="true" /> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="flutterbooksample.com" /> <data android:scheme="https" /> </intent-filter>
設定之後,重啟整個應用即可。
需要在ios/Runner
資料夾下Info.plist
檔案中新增兩個新的key:
<key>FlutterDeepLinkingEnabled</key> <true/> <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLName</key> <string>flutterbooksample.com</string> <key>CFBundleURLSchemes</key> <array> <string>customscheme</string> </array> </dict> </array>
CFBundleURLName
是一個唯一的URL,用於將我們的應用程式與其他使用相同方案的應用程式進行區分。
設定完成後,同樣需要進行應用的重啟。
flutter web 應用支援兩種URL策略:
flutterexample.dev/#/path/to/screen
.lutterexample.dev/path/to/screen
.設定起來也很簡單,從flutter_web_plugins外掛庫匯入usePathUrlStrategy方法,在入口函數中呼叫即可。
import 'package:flutter_web_plugins/url_strategy.dart'; void main() { usePathUrlStrategy(); runApp(ExampleApp()); }
PathUrlStrategy使用歷史API,這需要對web伺服器進行額外設定,具體怎麼設定,應該跟nginx相關~
熟悉了導航和路由,再加深一下對元件裡的理解記憶,後面熟悉一下介面請求的方式,基本上就可以開始做flutter應用的開發了~
以上就是flutter的導航和路由使用範例詳解的詳細內容,更多關於flutter 導航路由的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45