Flutter入門之(fluro路由跳轉(zhuǎn)框架)

最近在學(xué)習(xí)flutter避咆,看到一個(gè)fluro的路由框架不錯(cuò)镶骗,但在網(wǎng)上搜了下 很少對fluro的教程文章滋饲,所以閑暇之余寫了此文章給需要的人懶厉碟,順便再自己鞏固下對此框架的運(yùn)用,語言組織能力不好 勿噴(后續(xù)會(huì)在詳細(xì)的對每個(gè)方法參數(shù)進(jìn)行講解)

Fluro

flutter的跳轉(zhuǎn)框架屠缭,開發(fā)者稱之為 “Flutter最亮箍鼓,最時(shí)髦,最酷的路由器呵曹】羁В”
官方地址 https://pub.dev/packages/fluro

入門

pubspec.yaml中加入下面代碼

dependencies:
 fluro: "^1.5.1"

開始使用

首先我們定義一個(gè)全局的router對象,用于后續(xù)的全局調(diào)用

import 'package:fluro/fluro.dart';

class Application {
  static Router router;

}

然后創(chuàng)建一個(gè)抽象類,用于后續(xù)的各模塊router實(shí)現(xiàn)此類進(jìn)行路由注冊初始化

import 'package:fluro/fluro.dart';

abstract class IRouterProvider{
  
  void initRouter(Router router);
}

示例

這是一個(gè)登錄模塊的路由管理示例逢并,我們要實(shí)現(xiàn)剛才創(chuàng)建的 IRouterProvider 抽象類之剧,實(shí)現(xiàn)其 initRouter() 方法進(jìn)行每個(gè)頁面的路由注冊

import 'package:fluro/fluro.dart';
import 'package:flutter_deer/routers/router_init.dart';

import 'login_page.dart';
import 'register_page.dart';


class LoginRouter implements IRouterProvider{

  static String loginPage = "/login";
  static String registerPage = "/login/register";

  @override
  void initRouter(Router router) {
    router.define(loginPage, handler: Handler(handlerFunc: (_, params) => Login()));
    router.define(registerPage, handler: Handler(handlerFunc: (_, params) => Register()));
  }
  
}

接下來我們需要?jiǎng)?chuàng)建一個(gè)總的router管理類

    router.define(home, handler: Handler(
      handlerFunc: (BuildContext context, Map<String, List<String>> params) => Home()));

此方法中第一個(gè)參數(shù)為注冊地址,第二個(gè)handler用于界面的路由注冊


import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';
import 'package:flutter_deer/home/404.dart';
import 'package:flutter_deer/login/login_router.dart';
import 'package:flutter_deer/routers/router_init.dart';

import 'package:flutter_deer/home/home_page.dart';
import 'package:flutter_deer/home/webview_page.dart';

class Routes {

  static String home = "/home";
  static String webViewPage = "/webview";

  //子router管理集合
  static List<IRouterProvider> _listRouter = [];

  static void configureRoutes(Router router) {

    /// 指定路由跳轉(zhuǎn)錯(cuò)誤返回頁
    router.notFoundHandler = Handler(
      handlerFunc: (BuildContext context, Map<String, List<String>> params) {
        debugPrint("未找到目標(biāo)頁");
        return WidgetNotFound();
      });
    
      //主界面可以在此類中進(jìn)行注冊(可定義傳參)
    router.define(home, handler: Handler(
      handlerFunc: (BuildContext context, Map<String, List<String>> params) => Home()));
    
    //一些共用的界面也可以在此處注冊
    router.define(webViewPage, handler: Handler(handlerFunc: (_, params){
      String title = params['title']?.first;
      String url = params['url']?.first;
      return WebViewPage(title: title, url: url);
    }));
    
    //每次初始化前 先清除集合 以免重復(fù)添加
    _listRouter.clear();
    /// 各自路由由各自模塊管理砍聊,統(tǒng)一在此添加初始化
    _listRouter.add(LoginRouter());

    /// 初始化路由 循環(huán)遍歷取出每個(gè)子router進(jìn)行初始化操作
    _listRouter.forEach((routerProvider){
      routerProvider.initRouter(router);
    });
  }
}

接下來封裝跳轉(zhuǎn)工具類

import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';

import 'application.dart';
import 'routers.dart';

/// fluro的路由跳轉(zhuǎn)工具類
class NavigatorUtils {
  
  //不需要頁面返回值的跳轉(zhuǎn)
  static push(BuildContext context, String path,
      {bool replace = false, bool clearStack = false}) {
    FocusScope.of(context).requestFocus(new FocusNode());
    Application.router.navigateTo(context, path, replace: replace, clearStack: clearStack, transition: TransitionType.native);
  }

  //需要頁面返回值的跳轉(zhuǎn)
  static pushResult(BuildContext context, String path, Function(Object) function,
      {bool replace = false, bool clearStack = false}) {
    FocusScope.of(context).requestFocus(new FocusNode());
    Application.router.navigateTo(context, path, replace: replace, clearStack: clearStack, transition: TransitionType.native).then((result){
      // 頁面返回result為null
      if (result == null){
        return;
      }
      function(result);
    }).catchError((error) {
      print("$error");
    });
  }

  /// 返回
  static void goBack(BuildContext context) {
    FocusScope.of(context).requestFocus(new FocusNode());
    Navigator.pop(context);
  }

  /// 帶參數(shù)返回
  static void goBackWithParams(BuildContext context, result) {
    FocusScope.of(context).requestFocus(new FocusNode());
    Navigator.pop(context, result);
  }
  
}

使用

首先我們需要在main.dart中進(jìn)行初始化

class MyApp extends StatelessWidget {
  
  MyApp()  {
    //創(chuàng)建一個(gè)Router對象
    final router = Router();
    //配置Routes注冊管理
    Routes.configureRoutes(router);
    //將生成的router給全局化
    Application.router = router;
  }
  
  @override
  Widget build(BuildContext context) {
    return OKToast(
      child: MaterialApp(
        title: 'fluro',
        theme: ThemeData(
          primaryColor: Colours.app_main,
        ),
        home: HomePage(),
        //生成路由
        onGenerateRoute: Application.router.generator,
      ),
    );
  }
}

無返回值跳轉(zhuǎn) 第二個(gè)參數(shù)是目標(biāo)地址背稼,第三個(gè)是是否關(guān)閉當(dāng)前界面 ( 非必傳 默認(rèn)為false true的話是關(guān)閉 從內(nèi)存中釋放)
需要傳參時(shí) 第二個(gè)參數(shù)用以下方式傳(此為固定的格式)

'${Routes.webViewPage}?param1=${Uri.encodeComponent(content1)}&param2=${Uri.encodeComponent(content2)}'

問號(hào)前的是目標(biāo)地址 ${Routes.webViewPage}

問號(hào)后的是需要傳的參數(shù)param=${Uri.encodeComponent(content)}(fluro 不支持傳中文,需轉(zhuǎn)換)
param為參數(shù)名稱,content為需要傳遞的參數(shù)

  //不需要穿參數(shù)的
  _goLogin(){
    NavigatorUtils.push(context, LoginRouter.loginPage, replace: true);
  }

  //需要傳參數(shù)的
  _goLogin(){
    NavigatorUtils.push(context, 
  '${Routes.webViewPage}?param1=${Uri.encodeComponent(content1)}&param2=${Uri.encodeComponent(content2)}'
    , replace: true);
  }

有返回值跳轉(zhuǎn)

NavigatorUtils.pushResult(context, AccountRouter.citySelectPage, (result){
                                setState(() {
                                  //result是返回的結(jié)果
                                  TestModel model = result;
                                  _name = model.name;
                                });
                              });

返回上一級

NavigatorUtils.goBack(context);

帶參數(shù)返回上一級(result是返回結(jié)果)

NavigatorUtils.goBackWithParams(context, result);

參考自https://github.com/simplezhli/flutter_deer

有興趣學(xué)習(xí)flutter的可以看下這個(gè)項(xiàng)目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玻蝌,一起剝皮案震驚了整個(gè)濱河市蟹肘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俯树,老刑警劉巖帘腹,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異许饿,居然都是意外死亡阳欲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門陋率,熙熙樓的掌柜王于貴愁眉苦臉地迎上來球化,“玉大人,你說我怎么就攤上這事瓦糟⊥灿蓿” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵菩浙,是天一觀的道長巢掺。 經(jīng)常有香客問我句伶,道長,這世上最難降的妖魔是什么陆淀? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任考余,我火速辦了婚禮,結(jié)果婚禮上倔约,老公的妹妹穿的比我還像新娘秃殉。我一直安慰自己,他們只是感情好浸剩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布钾军。 她就那樣靜靜地躺著,像睡著了一般绢要。 火紅的嫁衣襯著肌膚如雪吏恭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天重罪,我揣著相機(jī)與錄音樱哼,去河邊找鬼。 笑死剿配,一個(gè)胖子當(dāng)著我的面吹牛搅幅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呼胚,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼茄唐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝇更?” 一聲冷哼從身側(cè)響起沪编,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎年扩,沒想到半個(gè)月后蚁廓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厨幻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年相嵌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片况脆。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡平绩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漠另,到底是詐尸還是另有隱情,我是刑警寧澤跃赚,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布笆搓,位于F島的核電站性湿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏满败。R本人自食惡果不足惜肤频,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望算墨。 院中可真熱鬧宵荒,春花似錦、人聲如沸净嘀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挖藏。三九已至暑刃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膜眠,已是汗流浹背岩臣。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宵膨,地道東北人架谎。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像辟躏,于是被迫代替她去往敵國和親谷扣。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348