Flutter 路由插件 -- fluro

fluro

fluro 是flutter开发中比较常见路由插件
插件地址:fluro | Flutter Package (pub.dev)

官方给出的例子
final router = FluroRouter();
var usersHandler = Handler(handlerFunc: (BuildContext context, Map<String, dynamic> params) {
  return UsersScreen(params["id"][0]);
});

void defineRoutes(FluroRouter router) {
  router.define("/users/:id", handler: usersHandler);

  // it is also possible to define the route transition to use
  // router.define("users/:id", handler: usersHandler, transitionType: TransitionType.inFromLeft);
}
router.navigateTo(context, "/users/1234", transition: TransitionType.fadeIn);
/// Push a route with custom RouteSettings if you don't want to use path params
FluroRouter.appRouter.navigateTo(
  context,
  'home',
  routeSettings: RouteSettings(
    arguments: MyArgumentsDataClass('foo!'),
  ),
);

/// Extract the arguments using [BuildContext.settings.arguments] or [BuildContext.arguments] for short
var homeHandler = Handler(
  handlerFunc: (context, params) {
    final args = context.settings.arguments as MyArgumentsDataClass;

    return HomeComponent(args);
  },
);

从例子中可以看出使用方式并不复杂,先创建router对象,之后为每个需要弹出的页面声明Handler和标识并在router对象中注册,在需要弹出页面时使用router对象调用navigateTo方法即可。

实际开发中的用法

虽然上面说到fluro使用方法不复杂,但是在实际开发中,出于提高代码可扩展性,降低耦合度等目的,一般不会以这么直白的方式使用fluro。

我这边使用的方式是将注册页面和推出页面分割,创建不同的工具类来实现对应功能的代码。

举例:

假设目前项目结构为两个模块:模块A,模块B,两个模块分别包含两个页面,既A1,A2, B1,B2。现在我们使用fluro实现这个项目的页面跳转功能

注册页面实现方式:
为了方便维护代码,每个模块都单独实现一个用来注册页面的工具类,既RouterA,RouterB
RouterA

class RouterA implements IRouterProvider {
 // 声明标识
  static String A1 = "/A1";
  static String A2 = "/A2";

// initRouter方法中实现注册
  @override
  void initRouter(FluroRouter router) {
    //给外部传入的fluro的`router`对象注册页面
    router.define(A1,
        handler: Handler(handlerFunc: (_, params) => const A1()));
    router.define(A2,
        handler: Handler(handlerFunc: (_, params) => const A2()));
  }
}

RouterB同理:

class RouterB implements IRouterProvider {
 // 声明标识
  static String B1 = "/B1";
  static String B2 = "/B2";

// initRouter方法中实现注册
  @override
  void initRouter(FluroRouter router) {
 //给外部传入的fluro的`router`对象注册页面
    router.define(B1,
        handler: Handler(handlerFunc: (_, params) => const B1()));
    router.define(B2,
        handler: Handler(handlerFunc: (_, params) => const B2()));
  }
}

之后创建工具类Routes,它的作用是将各个模块的注册工具类与fluro的router对象关联

class Routes {
  static final List<IRouterProvider> _routerList = [];

  static void configureRoutes(FluroRouter router) {
    _routerList.clear();
    _routerList.add(RouterA());
    _routerList.add(RouterB());

    /// 使用各个模块的工具类初始化路由
    for (IRouterProvider routerProvider in _routerList) {
      routerProvider.initRouter(router);
    }
  }
}

在项目入口声明router对象,并将router传入工具类Routes进行页面注册

 final router = FluroRouter();
 //注册
 Routes.configureRoutes(router);

注册页面工具完成

页面跳转工具类实现方式:
页面跳转工具类相对于注册功能内容较少,实现全局router对象的获取,并封装页面弹出收回的方法。
router对象获取工具类Application

class Application {
  static FluroRouter router;
}

在创建router对象时给Application.router赋值

 final router = FluroRouter();
 //注册
 Routes.configureRoutes(router);
 //赋值
 Application.router = router;

跳转工具类NavigatorTool

/// fluro的路由跳转工具类
class NavigatorTool {
  static push(BuildContext context, String path,
   ) {
    Application.router.navigateTo(context, path);
  }

  /// 返回
  static void goBack(BuildContext context) {
    Navigator.pop(context);
  }
}

页面跳转工具完成

业务代码:

  1. 跳转至A1页面
 NavigatorTool.push(context, RouterA.A1);
  1. 跳转至A2页面
 NavigatorTool.push(context, RouterA.A2);

3.跳 转至B1页面

 NavigatorTool.push(context, RouterB.B1);
  1. 跳转至B1页面
 NavigatorTool.push(context, RouterB.B2);

欢迎指正

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容