Flutter微应用管理插件flutter_micro_app的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter微应用管理插件flutter_micro_app的使用

Flutter Micro App 插件旨在简化组织并保持在Flutter应用程序中实现微应用架构的一致性,确保标准化和高效的开发过程。以下是关于如何使用此插件的详细介绍。

一、概述

  • 版本与许可

    • Pub Version
    • CI
    • license
    • PRs Welcome
  • 功能

    • 提供了Flutter DevTools扩展,允许您检查应用事件处理器、通过Flutter Widget Inspector检查Widget树中的路由、从外部控制应用分发事件、搜索路由以及将所有路由导出到Excel文件(.xlsx),并且支持特性标记存根。
    • 支持存根远程配置,您可以轻松地在真实数据和模拟数据之间切换。

二、初始化与配置

1. 配置偏好设置(可选)

MicroAppPreferences.update(
  MicroAppConfig(
    nativeEventsEnabled: true, // 如果您想在原生(Android/iOS)之间分发和监听事件 [默认 = false]
    nativeNavigationCommandEnabled: true,
    nativeNavigationLogEnabled: true,
    pathSeparator: MicroAppPathSeparator.slash // 自动使用斜杠"/"连接路由片段
    pageTransitionType: MicroPageTransitionType.platform, // 动态过渡类型
    onRouteNotRegistered: (route, {arguments, type, context}) {
      print('[OnRouteNotRegistered] Route not found: $route, $arguments, $type');
    },
  )
);

2. 初始化微主机,注册所有微应用

void main() {
  runApp(MyApp());
}

class MyApp extends MicroHostStatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: NavigatorInstance.navigatorKey, 
      onGenerateRoute: onGenerateRoute, 
      initialRoute: '/host_home_page',
      navigatorObservers: [
        NavigatorInstance 
      ],
    );
  }

  @override
  List<MicroAppPage> get pages => [
    MicroAppPage(
      route:  '/host_home_page', 
      pageBuilder: PageBuilder(
        widgetBuilder: (_, __) => const HostHomePage()
      ),
      description: 'The initial page of the application',
    ),
    MicroAppPage(
      route: '/modal_page',
      pageBuilder: PageBuilder(
        modalBuilder: (settings) => ModalExamplePage(title: '${settings.arguments}'), 
      ),
      description: 'ModalBuilder can be used to show [PopupRoute]',
    )
  ];

  @override
  List<MicroApp> get initialMicroApps => [MicroApplication1(), MicroApplication2()];
}

三、事件处理

1. 分发事件

MicroAppEventController().emit(
  const MicroAppEvent(
    name: 'my_event',
    channels: ['user_auth'])
);

MicroAppEventController().emit<String>(
  const MicroAppEvent(
    name: 'my_event',
    payload: 'some string here')
);

MicroAppEventController().emit<MyCustomClass>(
  const MicroAppEvent(
    name: 'my_event',
    payload: MyCustomClass(userName: 'Emanuel Braz'),
    channels: ['user_auth', 'wellcome']
  );
);

2. 监听事件

class MyMicroApplication extends MicroApp with HandlerRegisterMixin {
  
  MyMicroApplication() {
    registerEventHandler(
      MicroAppEventHandler(
        (event) => logger.d([ event.name, event.payload])
      );
    );
  }
}

四、页面导航

1. 使用GoRouter(高级且灵活)

final FmaGoRouter fmaGoRouter = FmaGoRouter(
  name: 'GoRouter Example',
  description: 'This is an example of GoRouter',
  goRouter: GoRouter(
    navigatorKey: NavigatorInstance.navigatorKey,
    routes: <RouteBase>[
      FmaGoRoute(
        description: 'This is the boot page',
        path: '/',
        parameters: BaseHomePage.new,
        builder: (BuildContext context, GoRouterState state) {
          return const BaseHomePage();
        },
        routes: <RouteBase>[
          FmaGoRoute(
            description: 'This page has path parameter',
            parameters: ExamplePageA.new,
            path: 'page_with_id/:id',
            builder: (context, state) {
              return ExamplePageA('page with id = ' + (state.pathParameters['id'] ?? ''));
            },
          ),
        ],
      ),
    ],
  ),
);

2. 使用MicroApp默认(简单易用)

import 'package:micro_routes/exports.dart';

class Application1MicroApp extends MicroApp {

  final routes = Application1Routes();

  @override
  List<MicroAppPage> get pages => [
    MicroAppPage<Initial>(
      description: 'The initial page of the micro app 1',
      route: routes.baseRoute.route, 
      parameters: Initial.new,
      pageBuilder: PageBuilder(
        widgetBuilder: (context, settings) => const Initial(),
        transitionType: MicroPageTransitionType.slideZoomUp
      ),
    ),
    MicroAppPage<Page1>(
      description: 'Display all buttons of the showcase',
      route: routes.page1, 
      parameters: Page1.new,
      pageBuilder: PageBuilder(
        modalBuilder: (settings) => Page1(), 
      )
    ),
  ];
}

五、示例代码

以下是一个完整的main.dart示例:

void main() {
  // 所有示例都在Android模拟器上工作,目前没有iOS示例,但功能相同,
  // 只需在原生iOS上实现它。如果需要,可以自己实现。(尽快会提供iOS示例)
  
  // 初始化微应用主机
  runApp(MyApp());
}

class MyApp extends MicroHostStatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: NavigatorInstance.navigatorKey, 
      onGenerateRoute: onGenerateRoute, 
      initialRoute: '/host_home_page',
      navigatorObservers: [
        NavigatorInstance 
      ],
    );
  }

  @override
  List<MicroAppPage> get pages => [
    MicroAppPage(
      route:  '/host_home_page', 
      pageBuilder: PageBuilder(
        widgetBuilder: (_, __) => const HostHomePage()
      ),
      description: 'The initial page of the application',
    ),
    MicroAppPage(
      route: '/modal_page',
      pageBuilder: PageBuilder(
        modalBuilder: (settings) => ModalExamplePage(title: '${settings.arguments}'), 
      ),
      description: 'ModalBuilder can be used to show [PopupRoute]',
    )
  ];

  @override
  List<MicroApp> get initialMicroApps => [MicroApplication1(), MicroApplication2()];
}

以上是关于flutter_micro_app插件的基本使用方法,希望对您有所帮助!如果您有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter微应用管理插件flutter_micro_app的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter微应用管理插件flutter_micro_app的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flutter_micro_app 插件的示例代码。flutter_micro_app 是一个用于 Flutter 微前端管理的插件,允许你在一个 Flutter 应用中嵌入和管理多个微应用。

首先,你需要在你的 pubspec.yaml 文件中添加 flutter_micro_app 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_micro_app: ^最新版本号  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,让我们看看如何在你的 Flutter 应用中使用 flutter_micro_app

主应用 (Host App)

  1. 创建主应用入口
import 'package:flutter/material.dart';
import 'package:flutter_micro_app/flutter_micro_app.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Micro App Example'),
        ),
        body: MicroAppHost(
          child: Center(
            child: Text('Loading Micro App...'),
          ),
          onMicroAppCreated: (MicroAppContext context) {
            // 当微应用创建完成时调用
            print('Micro App Created');
          },
          onMicroAppLaunched: (MicroAppContext context, String url) {
            // 当微应用启动完成时调用
            print('Micro App Launched with URL: $url');
          },
          microAppRegistry: MicroAppRegistry()
            ..registerMicroApp(
              name: 'example_micro_app',
              entry: 'assets/example_micro_app/main.dartbundle', // 微应用的入口文件
              container: Container(
                color: Colors.white,
              ),
            ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            // 启动微应用
            await MicroAppHost.of(context).launchMicroApp(name: 'example_micro_app', url: '/home');
          },
          tooltip: 'Launch Micro App',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

微应用 (Micro App)

你需要为你的微应用创建一个独立的 Flutter 模块。这里假设你已经创建了一个名为 example_micro_app 的模块。

  1. 在微应用中配置 MaterialApp
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        '/home': (context) => HomeScreen(),
        // 添加更多路由
      },
      initialRoute: '/home',
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Example Micro App'),
      ),
      body: Center(
        child: Text('Hello from Micro App!'),
      ),
    );
  }
}
  1. 构建微应用资源

确保你的微应用已经正确构建并生成了 main.dartbundle 文件。你可以使用以下命令来构建你的 Flutter 模块:

flutter build bundle --target=lib/main.dart -o assets/example_micro_app/main.dartbundle

然后将生成的 main.dartbundle 文件放置在主应用的 assets 目录下。

运行主应用

完成上述步骤后,你可以运行你的主应用。点击浮动操作按钮(FAB),你应该能够看到你的微应用被加载并显示在屏幕上。

这个例子展示了如何在 Flutter 中使用 flutter_micro_app 插件来管理微应用。你可以根据实际需求进一步扩展和自定义你的微前端架构。

回到顶部