Flutter跨平台开发:Multiple Flutters 在鸿蒙系统上的使用指南
Flutter Multiple Flutters插件演示了如何通过Flutter Engine Groups API在现有应用中嵌入多个Flutter实例。该方案支持多入口点配置、资源共享和跨平台通信,能有效降低内存占用并提升性能。主要功能包括:使用Engine Group管理多个Flutter引擎、实现主机与Flutter实例的数据同步、支持不同主题配置以及MethodChannel通信机制。
1. 插件介绍
Flutter Multiple Flutters 是一个演示如何使用 Flutter Engine Groups API 在现有应用中嵌入多个 Flutter 实例的示例。该示例展示了如何高效地在同一应用中管理多个 Flutter 引擎实例,实现内存和 CPU 资源的共享,从而提升应用性能。
主要功能:
- 使用 Flutter Engine Groups API 嵌入多个 Flutter 实例
- 实现主机平台与多个 Flutter 实例之间的数据同步
- 支持多个 Flutter 入口点,每个入口点可配置不同的主题和初始状态
- 演示了 MethodChannel 在多引擎环境下的通信机制
- 集成了 url_launcher 插件,展示了跨平台能力
适用场景:
- 需要在现有应用中嵌入多个独立的 Flutter 模块
- 希望在同一应用中展示不同主题或功能的 Flutter 界面
- 需要实现主机平台与多个 Flutter 实例之间的数据共享
- 对应用性能要求较高,希望通过引擎资源共享减少内存占用
2. 如何使用插件
2.1 包的引入
在项目的 pubspec.yaml 文件中,添加以下依赖配置:
dependencies:
multiple_flutters_module:
git:
url: "https://atomgit.com/flutter/samples.git"
path: "add_to_app/multiple_flutters/multiple_flutters_module"
# 如果需要使用 url_launcher 插件
url_launcher:
git:
url: "https://atomgit.com/openharmony-tpc/flutter_packages.git"
path: "packages/url_launcher/url_launcher"
然后运行 flutter pub get 命令获取依赖:
flutter pub get
2.2 配置 Flutter Engine Group
在鸿蒙应用的 EntryAbility.ets 文件中,初始化 Flutter Engine Group:
import { FlutterEngineGroup } from '@flutter/platform_ohos';
class EntryAbility extends Ability {
private flutterEngineGroup: FlutterEngineGroup;
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 初始化 Flutter Engine Group
this.flutterEngineGroup = new FlutterEngineGroup(this.context);
// 其他初始化代码...
}
// 其他方法...
}
2.3 创建和管理 Flutter 引擎实例
使用 Engine Group 创建多个 Flutter 引擎实例:
// 创建第一个 Flutter 引擎实例(使用默认入口点)
const flutterEngine1 = this.flutterEngineGroup.createAndRunDefaultEngine();
// 创建第二个 Flutter 引擎实例(使用自定义入口点)
const flutterEngine2 = this.flutterEngineGroup.createAndRunWithEntrypoint(
'topMain', // 入口点名称
'main' // Dart 主入口文件
);
// 创建第三个 Flutter 引擎实例
const flutterEngine3 = this.flutterEngineGroup.createAndRunWithEntrypoint(
'bottomMain', // 入口点名称
'main' // Dart 主入口文件
);
2.4 嵌入 Flutter 视图
在鸿蒙页面中嵌入多个 Flutter 视图:
import { FlutterView } from '@flutter/platform_ohos';
class DoubleFlutterPage extends AbilitySlice {
private componentContainer: ComponentContainer;
onStart(): void {
super.onStart();
// 创建垂直布局
const columnLayout = new Column();
// 创建第一个 Flutter 视图
const flutterView1 = new FlutterView(this);
flutterView1.setSize(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_CONTENT);
flutterView1.attachToEngine(flutterEngine1);
// 创建第二个 Flutter 视图
const flutterView2 = new FlutterView(this);
flutterView2.setSize(ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_CONTENT);
flutterView2.attachToEngine(flutterEngine2);
// 将 Flutter 视图添加到布局中
columnLayout.addComponent(flutterView1);
columnLayout.addComponent(flutterView2);
// 设置页面内容
this.componentContainer = this.findComponentById('component-container') as ComponentContainer;
this.componentContainer.addComponent(columnLayout);
}
// 其他方法...
}
2.5 API 调用
2.5.1 多入口点配置
在 Flutter 模块的 main.dart 文件中,定义多个入口点:
// 默认入口点
void main() => runApp(const MyApp(color: Colors.blue));
// 顶部 Flutter 实例入口点
('vm:entry-point')
void topMain() => runApp(const MyApp(color: Colors.green));
// 底部 Flutter 实例入口点
('vm:entry-point')
void bottomMain() => runApp(const MyApp(color: Colors.purple));
2.5.2 数据同步
使用 MethodChannel 实现主机平台与 Flutter 实例之间的数据同步:
// Flutter 端代码
final _channel = const MethodChannel('multiple-flutters');
// 设置 MethodCallHandler
_channel.setMethodCallHandler((call) async {
if (call.method == "setCount") {
// 主机平台通知数据更新
setState(() {
_counter = call.arguments as int?;
});
}
});
// 向主机平台发送数据更新
void _incrementCounter() {
_channel.invokeMethod<void>("incrementCount", _counter);
}
// 鸿蒙端代码
import { MethodChannel } from '@flutter/platform_ohos';
// 创建 MethodChannel
const channel = new MethodChannel(flutterEngine.dartExecutor.binaryMessenger, 'multiple-flutters');
// 设置 MethodCallHandler
channel.setMethodCallHandler((call, result) => {
if (call.method === 'incrementCount') {
// 处理 Flutter 发送的计数增加请求
dataModel.incrementCount();
result.success(null);
} else if (call.method === 'next') {
// 处理下一页请求
router.pushNamed('next-page');
result.success(null);
}
});
// 向 Flutter 发送数据更新
channel.invokeMethod('setCount', dataModel.count);
2.5.3 使用 url_launcher 插件
import 'package:url_launcher/url_launcher.dart' as launcher;
import 'package:url_launcher/url_launcher_string.dart';
// 打开 Flutter 文档
ElevatedButton(
onPressed: () async {
final Uri url = Uri.parse('https://flutter.dev/docs');
if (await launcher.canLaunchUrl(url)) {
await launcher.launchUrl(url, webViewConfiguration: const WebViewConfiguration(headers: <String, String>{'harmony_browser_page': 'pages/LaunchInApp'}));
}
},
child: const Text('Open Flutter Docs'),
),
3. 数据同步机制
该示例使用 Observer 设计模式和 Flutter 平台通道实现主机平台与多个 Flutter 实例之间的数据同步:
- 数据的唯一真实来源位于主机平台的数据模型中
- 每个显示 Flutter 内容的主机视图维护:Flutter 引擎、双向平台通道和主机数据模型的订阅
- Flutter 实例维护它们感兴趣的数据的副本,这些数据在实例首次显示时由主机提供
- Flutter 代码的突变通过通道发送到主机平台,主机平台执行突变,然后通知所有主机视图控制器和 Flutter 引擎新值
- 主机代码的突变直接发生在数据模型上,数据模型通知主机视图控制器和 Flutter 引擎新值
4. 总结
Flutter Multiple Flutters 示例展示了如何高效地在鸿蒙应用中嵌入多个 Flutter 实例,通过 Flutter Engine Groups API 实现资源共享,提高应用性能。该示例提供了完整的多引擎管理、数据同步和跨平台通信方案,适合需要在现有应用中集成多个独立 Flutter 模块的场景。
通过本指南,您已经了解了如何:
- 引入 multiple_flutters 模块和相关依赖
- 配置和使用 Flutter Engine Group
- 创建多个 Flutter 引擎实例和视图
- 实现主机平台与 Flutter 实例之间的数据同步
- 使用 MethodChannel 进行跨平台通信
- 集成 url_launcher 等第三方插件
欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net
更多推荐


所有评论(0)