Fluro扩展:支持返回widget

536 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

引言

小轰在开发中使用fluro实现路由跳转时,发现对于组件开发,还有一个能力是路由必须具备的:通过路由获取另一个组件中的 Widget 然后填充到自己的页面中。

实现方式:

  1. 进行显示依赖,PackageA 直接依赖 PackageB
  2. 对Fluro进行扩展,使其具备通过路径返回Widget的能力

这时候我们需要了解到dart语言中的一个关键字 extension,该关键字用于扩展能力,可以在原有类的基础上进行扩充,有兴趣的小伙伴可以单独搜索一下该关键字的api,下面我们来对Fluro进行扩展,通过路径返回Widget:

创建 rex_fluro.dart(直接copy可用)

extension RexFluroExt on FluroRouter {
  Widget widgetForPath(
      {@required String path,
      @required BuildContext context,
      Map<String, List<String>> parameters}) {
    final AppRoute rout = this.match(path).route;
    if (!(rout.handler is Handler)) {
      return null;
    }
    final Handler handler = rout.handler as Handler;
    if (handler.type != HandlerType.route) {
      handler.handlerFunc(context, parameters);
      return null;
    }
    return handler.handlerFunc(context, parameters);
  }
}

在需要使用该扩展能力的地方进行import使用

import 'package:rex_test/src/extension/rex_fluro.dart';
//使用方法
//通过全局的Fluro管理工具进行控制
GlobalRouterManager.router.widgetForPath(
                path: '/pathA',
                context: context,
                parameters: [{'params':json.encode(ModuleA.tojson())}]);

附上 GlobalRouteManager代码

abstract class GlobalRouterManager {
  static FluroRouter _router = FluroRouter();
  static FluroRouter get router => _router;
  static registerRoutes(Iterable<RouteEntry> entries) {
    if(entries!=null && entries.isNotEmpty){
      entries.forEach((element) => _router.define(element.name,
          handler: element.handler, transitionType: element.transitionType));
    }
  }
}

使用前,请务必保证在main入口对GlobalRouterManager.registerRoutes()进行对路由注册操作。