Flutter 路由插件fluro的使用
前面兩篇文章我們介紹了Flutter 的原生導(dǎo)航器 Navigator 實現(xiàn)頁面跳轉(zhuǎn),路由及路由攔截的使用,具體可以參考之前的文章:
//www.dbjr.com.cn/article/215167.htm
//www.dbjr.com.cn/article/214856.htm
使用原生的路由基本上能夠滿足大部分需求,但如果想要對頁面做類似瀏覽器 url 那樣的路由,或者控制頁面跳轉(zhuǎn)的轉(zhuǎn)場動畫,那么原生的路由需要做不少的改造。在 pub 上,有優(yōu)秀的路由插件 fluro 解決這類問題。
fluro的使用方法
fluro 的使用步驟比較簡單,分為下面三個步驟:
- 構(gòu)建FluroRouter路由實例,一個應(yīng)用一個實例即可;
- 定義路由路徑的處理器(Handler),用于匹配不同路由路徑的處理方法。
- 在 MaterialApp 中把 onGenerateRoute設(shè)置為 FluroRouter.generator方法來構(gòu)建系統(tǒng)路由。
需要注意的是,F(xiàn)luro 默認會把路徑“/”當(dāng)做根目錄,因此必須定義根目錄的 Handler。另外對于路由不存在的情況,可以設(shè)置FluroRouter.notFoundHandler定義錯誤路由處理器。
路由處理器Handler
fluro 的關(guān)鍵實現(xiàn)是 Handler,Handler 的定義如下:
class Handler {
Handler({this.type = HandlerType.route, required this.handlerFunc});
final HandlerType type;
final HandlerFunc handlerFunc;
}
構(gòu)造函數(shù)有兩個屬性,一個是 HandlerType 枚舉,分為 route和 function 兩個值,其中用于路由的是 route,也是默認值。handlerFunc是必傳的,這是響應(yīng)路由的一個方法,需要返回一個 Widget,以便跳轉(zhuǎn)到對應(yīng)的頁面。
typedef Widget? HandlerFunc(
BuildContext? context, Map<String, List<String>> parameters);
HandlerFunc接收上下文 context,以及攜帶了路由參數(shù),這個參數(shù)是一個Map,對應(yīng)路由路徑的多個路由參數(shù)。例如/dynamic/:id 路由,如果實際路由為/dynamic/1?event=a&event=b,則 parameters 的格式如下:
{
"id": ["1"],
"event": ["a", "b"]
}
需要注意路由參數(shù)的數(shù)據(jù)類型全部是String 類型,通過這個 Handler,可以將路由參數(shù)傳遞到下級頁面。
使用示例
我們?yōu)榱私y(tǒng)一管理路由,定義一個類 RouterManager,里面的屬性均為靜態(tài)成員,以便直接通過類訪問,而無需創(chuàng)建示例。當(dāng)然考慮封裝性,也可以做成單例模式。需要注意,F(xiàn)luroRouter 只能初始化一次,否則會導(dǎo)致熱重載報錯提示路由已經(jīng)被定義。我們把上兩篇的路由跳轉(zhuǎn)替換為fluro 跳轉(zhuǎn),RouterManager 的代碼如下:
//省略 import
class RouterManager {
static String splashPath = '/';
static String loginPath = '/login';
static String homePath = '/home';
static String dynamicPath = '/dynamic';
static String dynamicDetailPath = '$dynamicPath/:id';
static FluroRouter router;
static void initRouter() {
if (router == null) {
router = FluroRouter();
defineRoutes();
}
}
static var loginHandler =
Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
return LoginPage();
});
static var dynamicDetailHandler =
Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
return DynamicDetailPage(params['id'][0]);
});
static var splashHandler =
Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
return Splash();
});
static var homeHandler =
Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
return AppHomePage();
});
static var notFoundHandler =
Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
return NotFound();
});
static void defineRoutes() {
router.define(splashPath, handler: splashHandler);
router.define(homePath, handler: homeHandler);
router.define(loginPath, handler: loginHandler);
router.define(dynamicDetailPath, handler: dynamicDetailHandler);
router.notFoundHandler = notFoundHandler;
}
}
實際只需要調(diào)用 RouterManager.initRouter 方法即可完成路由的初始化,這個需要在 main.dart 的 MaterialApp 中完成,代碼如下。與之前的代碼相比,不再需要設(shè)置navigationKey參數(shù)和 initialRoute參數(shù),只是需要在 build 方法里調(diào)用初始化路由的方法。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
RouterManager.initRouter();
return MaterialApp(
//...
onGenerateRoute:
RouterManager.router.generator,
);
}
}
頁面跳轉(zhuǎn)
頁面跳轉(zhuǎn)調(diào)用有多種形式,本例我們用到了三種,分別是:
- 清除路由堆棧跳轉(zhuǎn):即跳轉(zhuǎn)后的頁面作為根頁面(沒有返回按鈕),這種適合閃屏頁跳到首頁。代碼如下:
RouterManager.router.navigateTo(context, RouterManager.homePath, clearStack: true);
- 普通跳轉(zhuǎn):無參數(shù)直接跳轉(zhuǎn),代碼如下:
RouterManager.router.navigateTo(context, RouterManager.loginPath);
- 帶參數(shù)跳轉(zhuǎn):路由路徑攜帶參數(shù),和普通跳轉(zhuǎn)類似,只是拼接了路徑參數(shù)和 query 參數(shù):
RouterManager.router.navigateTo(context, '${RouterManager.dynamicPath}/$id?event=a&event=b')
運行效果
我們將閃屏頁跳轉(zhuǎn)到首頁,動態(tài)跳轉(zhuǎn)到詳情頁,以及登錄頁和404頁面進行了更換,運行效果如下圖所示。注意看整個轉(zhuǎn)場方式的不同,正常的轉(zhuǎn)場切換是從底部到頂部彈出,但404是從左到右彈出(和原生的 push 一樣)。這個后續(xù)可以在 Handler 里調(diào)整或者在路由跳轉(zhuǎn)的時候定義轉(zhuǎn)場動畫,我們下一篇再來介紹這方面的使用。

以上就是Flutter 路由插件fluro的使用的詳細內(nèi)容,更多關(guān)于Flutter 路由插件fluro的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android SeekBar 自定義thumb旋轉(zhuǎn)動畫效果
某些音樂播放或者視頻播放的界面上,資源還在加載時,進度條的原點(thumb)會顯示一個轉(zhuǎn)圈的效果。這篇文章主要介紹了Android SeekBar 自定義thumb thumb旋轉(zhuǎn)動畫效果,需要的朋友可以參考下2021-11-11
Flutter如何完成路由攔截,實現(xiàn)權(quán)限管理
本篇介紹了利用 Fluro 路由管理實現(xiàn)路由權(quán)限攔截的兩種方式,兩種方式各有好處,使用過程中可以根據(jù)實際情況決定使用哪一種方法。2021-06-06
Android基于ListView實現(xiàn)類似QQ空間的滾動翻頁與滾動加載效果
這篇文章主要介紹了Android基于ListView實現(xiàn)類似QQ空間的滾動翻頁與滾動加載效果,涉及ListView相關(guān)屬性與方法的操作技巧,需要的朋友可以參考下2016-08-08
Android TableLayout數(shù)據(jù)列表的回顯清空實現(xiàn)思路及代碼
數(shù)據(jù)列表的回顯必須從后面減去子元素同時必須從后面減去子元素,感興趣的朋友可以看下具體的實現(xiàn)代碼,希望對你學(xué)習(xí)Android TableLayout有所幫助2013-04-04
android使用ViewPager實現(xiàn)圖片自動切換
這篇文章主要為大家詳細介紹了android使用ViewPager實現(xiàn)圖片自動切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02
Android自定義有限制區(qū)域圖例角度自識別涂鴉工具類
這篇文章主要為大家介紹了Android自定義有限制區(qū)域圖例角度自識別涂鴉工具類,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02

