Flutter 高赞的路由管理插件 fluro 简介

简介: fluro 是 Flutter 优秀的路由管理器,支持路由路径中携带路径参数和 query 参数,可以更灵活地进行页面参数的传递和转场动画。

前面两篇文章我们介绍了Flutter 的原生导航器 Navigator 实现页面跳转,路由及路由拦截的使用。使用原生的路由基本上能够满足大部分需求,但如果想要对页面做类似浏览器 url 那样的路由,或者控制页面跳转的转场动画,那么原生的路由需要做不少的改造。在 pub 上,有优秀的路由插件 fluro 解决这类问题。

fluro的使用方法

fluro 的使用步骤比较简单,分为下面三个步骤:

  • 构建FluroRouter路由实例,一个应用一个实例即可;
  • 定义路由路径的处理器(Handler),用于匹配不同路由路径的处理方法。
  • MaterialApp 中把 onGenerateRoute设置为 FluroRouter.generator方法来构建系统路由。

需要注意的是,Fluro 默认会把路径“/”当做根目录,因此必须定义根目录的 Handler。另外对于路由不存在的情况,可以设置FluroRouter.notFoundHandler定义错误路由处理器。

路由处理器Handler

fluro 的关键实现是 Handler,Handler 的定义如下:

class Handler {
  Handler({this.type = HandlerType.route, required this.handlerFunc});
  final HandlerType type;
  final HandlerFunc handlerFunc;
}

构造函数有两个属性,一个是 HandlerType 枚举,分为 route和 function 两个值,其中用于路由的是 route,也是默认值。handlerFunc是必传的,这是响应路由的一个方法,需要返回一个 Widget,以便跳转到对应的页面。

typedef Widget? HandlerFunc(
    BuildContext? context, Map<String, List<String>> parameters);

HandlerFunc接收上下文 context,以及携带了路由参数,这个参数是一个Map,对应路由路径的多个路由参数。例如/dynamic/:id 路由,如果实际路由为/dynamic/1?event=a&event=b,则 parameters 的格式如下:

{
  "id": ["1"],
  "event": ["a", "b"]
}

需要注意路由参数的数据类型全部是String 类型,通过这个 Handler,可以将路由参数传递到下级页面。

使用示例

我们为了统一管理路由,定义一个类 RouterManager,里面的属性均为静态成员,以便直接通过类访问,而无需创建示例。当然考虑封装性,也可以做成单例模式。需要注意,FluroRouter 只能初始化一次,否则会导致热重载报错提示路由已经被定义。我们把上两篇的路由跳转替换为fluro 跳转,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;
  }
}

实际只需要调用 RouterManager.initRouter 方法即可完成路由的初始化,这个需要在 main.dartMaterialApp 中完成,代码如下。与之前的代码相比,不再需要设置navigationKey参数和 initialRoute参数,只是需要在 build 方法里调用初始化路由的方法。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    RouterManager.initRouter();
    return MaterialApp(
      //...
      onGenerateRoute:
          RouterManager.router.generator,
    );
  }
}

页面跳转

页面跳转调用有多种形式,本例我们用到了三种,分别是:

  • 清除路由堆栈跳转:即跳转后的页面作为根页面(没有返回按钮),这种适合闪屏页跳到首页。代码如下:
RouterManager.router.navigateTo(context, RouterManager.homePath, clearStack: true);
  • 普通跳转:无参数直接跳转,代码如下:
RouterManager.router.navigateTo(context, RouterManager.loginPath);
  • 带参数跳转:路由路径携带参数,和普通跳转类似,只是拼接了路径参数和 query 参数:
RouterManager.router.navigateTo(context, '${RouterManager.dynamicPath}/$id?event=a&event=b')

运行效果

我们将闪屏页跳转到首页,动态跳转到详情页,以及登录页和404页面进行了更换,运行效果如下图所示。注意看整个转场方式的不同,正常的转场切换是从底部到顶部弹出,但404是从左到右弹出(和原生的 push 一样)。这个后续可以在 Handler 里调整或者在路由跳转的时候定义转场动画,我们下一篇再来介绍这方面的使用。

屏幕录制2021-06-16 下午9.57.09.gif


欢迎关注个人公众号:岛上码农

相关文章
|
3天前
|
存储 JavaScript 前端开发
盘点主流 Flutter 状态管理库2024
状态管理是每个应用不可缺少的,本文将会盘点下主流的状态管理包。
100 2
盘点主流 Flutter 状态管理库2024
|
3天前
|
传感器 Android开发 iOS开发
Flutter插件开发指南02: 事件订阅 EventChannel
上一节我们讲了 Channel 通道,但是如果你是卫星定位业务,原生端主动推消息给 Flutter 这时候就要用到 EventChannel 通道了。 本节会写一个 1~50 的计数器,到 50 后自动关闭原生的消息订阅。
Flutter插件开发指南02:  事件订阅 EventChannel
|
3天前
|
Java Linux API
Flutter插件开发指南01: 通道Channel的编写与实现
Flutter插件是Flutter应用程序与原生平台之间的桥梁,使得Flutter应用程序可以与原生代码进行交互,从而扩展Flutter应用程序的功能和能力。Flutter插件通常包括Dart和原生代码(例如Java、Kotlin或Objective-C、Swift等),并可以通过Flutter插件框架来注册、管理和调用。
Flutter插件开发指南01: 通道Channel的编写与实现
|
3天前
|
存储 JSON 缓存
flutter 推荐插件:path_provider
flutter 推荐插件:path_provider
76 0
flutter-barrage-craft — 能成为pub.dev中最好用的弹幕插件吗🤔?
Hi👋,最近我开发了一个弹幕插件,想知道它是否有成为 pub.dev 中最好用的弹幕插件的潜力。能帮我评估一下吗?🐱‍🏍
|
3天前
|
安全 Go 数据安全/隐私保护
Flutter开发笔记:Flutter路由技术
Flutter开发笔记:Flutter路由技术
383 0
|
1天前
|
XML Dart Java
Flutter插件开发之APK自动安装,字节跳动Android岗面试题
Flutter插件开发之APK自动安装,字节跳动Android岗面试题
|
2天前
|
Android开发
flutter插件市场,字节大牛耗时八个月又一力作
flutter插件市场,字节大牛耗时八个月又一力作
|
3天前
|
开发框架 前端开发 定位技术
【Flutter 前端技术开发专栏】Flutter 中的插件市场与开源资源利用
【4月更文挑战第30天】Flutter插件市场和开源资源加速开发进程。pub.dev是官方插件库,提供大量第三方插件,节约时间和保证质量。选择插件时关注功能需求、评价及维护状况。开源资源作为学习、解决问题和创新的平台,需注意版权、代码质量和兼容性。案例分析展示插件应用,开源社区促进交流与技术进步,未来市场将持续发展。善用资源,提升开发效率与项目竞争力。
【Flutter 前端技术开发专栏】Flutter 中的插件市场与开源资源利用
|
3天前
|
传感器 前端开发 Android开发
【Flutter 前端技术开发专栏】Flutter 中的插件开发与集成
【4月更文挑战第30天】本文探讨了Flutter插件开发的关键技术和实践,包括插件作为连接Flutter与原生功能桥梁的角色,开发流程(定义接口、实现原生代码、打包发布),以及集成方法(添加依赖、初始化)。文中提到了多媒体、传感器和文件系统等常见插件类型,并以相机插件为例说明开发步骤。此外,还强调了版本兼容性、性能优化和错误处理的注意事项,推荐了开发工具和资源。随着Flutter的发展,插件开发将更加重要,未来有望形成更丰富的生态系统。
【Flutter 前端技术开发专栏】Flutter 中的插件开发与集成