Flutter跨平台FlutterPage鸿蒙化使用指南
摘要: FlutterPage是OpenHarmony平台上实现Flutter混合开发的核心组件,支持在原生应用中无缝嵌入Flutter界面。通过继承FlutterAbility、配置MethodChannel通信机制,开发者能构建高性能的跨平台应用。环境需配置DevEco Studio 4.0+、JDK 17及OpenHarmony版Flutter SDK。使用时通过Git引入依赖,在OpenH

一、FlutterPage插件介绍
FlutterPage是OpenHarmony平台上的一个核心组件,它允许开发者在OpenHarmony应用中无缝嵌入Flutter界面,实现混合开发架构。通过FlutterPage,开发者可以充分利用Flutter的跨平台能力和OpenHarmony的原生特性,构建高性能、富交互的全场景应用。
核心功能特点:
- 无缝集成:在OpenHarmony页面中直接嵌入Flutter界面
- 双向通信:支持Flutter与OpenHarmony原生层的高效通信
- 混合UI开发:允许原生组件与Flutter组件叠加显示
- 引擎管理:自动管理Flutter引擎的生命周期
- 插件支持:兼容Flutter生态的各种插件
二、环境搭建
在使用FlutterPage之前,需要确保已经完成以下环境配置:
- DevEco Studio:安装最新版本的DevEco Studio(推荐4.0+)
- JDK 17:配置JDK 17环境变量
- Flutter SDK:下载并配置OpenHarmony版本的Flutter SDK
- 环境变量:
export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn export PATH=/path/to/flutter_flutter/bin:$PATH export PATH=/path/to/ohos-sdk/ets/tools:$PATH
三、FlutterPage的引入与配置
由于FlutterPage是为OpenHarmony定制修改的版本,需要通过AtomGit以Git形式引入:
3.1 添加依赖
在OpenHarmony项目的pubspec.yaml文件中,添加FlutterPage的Git依赖:
dependencies:
flutter_page:
git:
url: "https://atomgit.com/flutter-openharmony/flutter_page"
path: "packages/flutter_page/flutter_page"
3.2 安装依赖
执行以下命令安装依赖:
flutter pub get
四、FlutterPage的使用步骤
4.1 EntryAbility继承FlutterAbility
在OpenHarmony应用的入口Ability中,需要继承FlutterAbility而不是默认的Ability,这样才能正确初始化和管理Flutter引擎:
export default class EntryAbility extends FlutterAbility {
configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
// 注册Flutter插件
GeneratedPluginRegistrant.registerWith(flutterEngine)
}
}
4.2 创建OpenHarmony页面
使用DevEco Studio创建一个新的OpenHarmony页面:
- 打开ohos工程
- 右键点击
ohos/entry/src/main/ets/pages目录 - 选择
New->Page->Empty Page - 输入页面名称,点击
Finish
4.3 在页面中使用FlutterPage
在新创建的OpenHarmony页面中,可以通过以下方式嵌入FlutterPage:
import { LocalStorage } from '@ohos.app.ability.common';
import { Stack, Text } from '@ohos.arkui.widget';
import { FlutterPage } from '@ohos/flutter_page';
let storage = LocalStorage.getShared();
@Entry(storage)
@Component
struct FlutterContainerPage {
private context = getContext(this) as common.UIAbilityContext;
@LocalStorageLink('viewId') viewId: string = "flutter_main_view";
build() {
Stack({ alignContent: Alignment.Top }) {
// 嵌入Flutter页面
FlutterPage({ viewId: this.viewId })
// 可以在FlutterPage上方叠加OpenHarmony原生组件
Text('OpenHarmony原生组件 - 叠加在FlutterPage上方').margin(30)
}
}
}
4.4 Flutter与OpenHarmony通信
FlutterPage支持通过MethodChannel实现Flutter与OpenHarmony原生层的双向通信:
在Flutter端发送消息:
import 'package:flutter/services.dart';
class CommunicationManager {
static const MethodChannel _channel = MethodChannel('flutter_openharmony_channel');
// 发送消息到OpenHarmony
static Future<String> sendMessageToOpenHarmony(String message) async {
try {
final String result = await _channel.invokeMethod('sendMessage', {'message': message});
return result;
} on PlatformException catch (e) {
return 'Failed to send message: ${e.message}';
}
}
}
在OpenHarmony端接收消息:
import { MethodChannel } from '@ohos/flutter_page';
export default class EntryAbility extends FlutterAbility {
configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine);
GeneratedPluginRegistrant.registerWith(flutterEngine);
// 注册MethodChannel
const channel = new MethodChannel(flutterEngine, 'flutter_openharmony_channel');
// 监听Flutter发送的消息
channel.setMethodCallHandler((call, result) => {
if (call.method === 'sendMessage') {
const message = call.arguments['message'];
console.log(`Received message from Flutter: ${message}`);
// 处理消息并返回结果
result.success('Message received by OpenHarmony: ' + message);
} else {
result.notImplemented();
}
});
}
}
五、完整示例
以下是一个完整的FlutterPage使用示例,展示了如何在OpenHarmony应用中嵌入Flutter登录页面:
5.1 OpenHarmony端代码
import { LocalStorage } from '@ohos.app.ability.common';
import { Stack, Text, Button } from '@ohos.arkui.widget';
import { FlutterPage } from '@ohos/flutter_page';
let storage = LocalStorage.getShared();
@Entry(storage)
@Component
struct LoginContainerPage {
private context = getContext(this) as common.UIAbilityContext;
@LocalStorageLink('viewId') viewId: string = "flutter_login_view";
build() {
Stack() {
// 嵌入Flutter登录页面
FlutterPage({ viewId: this.viewId })
// 原生标题栏
Stack({
width: '100%',
height: 60,
backgroundColor: '#007AFF'
}) {
Text('Flutter登录页面').fontSize(20).fontColor('#FFFFFF').margin({ left: 20, top: 15 })
}
// 原生返回按钮
Button({
type: ButtonType.Circle
}, '←').width(40).height(40)
.margin({ left: 10, top: 10 })
.onClick(() => {
// 返回上一页
this.context.navigateBack();
})
}
}
}
5.2 Flutter端代码
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class LoginPage extends StatefulWidget {
const LoginPage({Key? key}) : super(key: key);
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
final TextEditingController _usernameController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
static const MethodChannel _channel = MethodChannel('flutter_openharmony_channel');
Future<void> _handleLogin() async {
final String username = _usernameController.text;
final String password = _passwordController.text;
try {
// 发送登录信息到OpenHarmony原生层
final String result = await _channel.invokeMethod('login', {
'username': username,
'password': password
});
if (result == 'success') {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('登录成功'))
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('登录失败'))
);
}
} on PlatformException catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('登录异常: ${e.message}'))
);
}
}
Widget build(BuildContext context) {
return Scaffold(
// 注意:Flutter的AppBar会被OpenHarmony的原生标题栏覆盖
body: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'用户登录',
style: TextStyle(fontSize: 28, fontWeight: FontWeight.bold),
),
const SizedBox(height: 48),
TextField(
controller: _usernameController,
decoration: const InputDecoration(
labelText: '用户名',
border: OutlineInputBorder(),
),
),
const SizedBox(height: 16),
TextField(
controller: _passwordController,
decoration: const InputDecoration(
labelText: '密码',
border: OutlineInputBorder(),
),
obscureText: true,
),
const SizedBox(height: 32),
ElevatedButton(
onPressed: _handleLogin,
style: ElevatedButton.styleFrom(
minimumSize: const Size.fromHeight(50),
),
child: const Text('登录', style: TextStyle(fontSize: 18)),
),
],
),
),
);
}
}
void main() {
runApp(const MaterialApp(
home: LoginPage(),
));
}
六、注意事项
- 视图ID管理:每个FlutterPage实例需要唯一的viewId,避免冲突
- 组件叠加顺序:通过Stack组件控制原生组件与Flutter组件的显示层级
- 性能优化:避免频繁创建和销毁FlutterPage实例
- 内存管理:确保在页面销毁时正确释放资源
- 插件兼容性:使用前验证Flutter插件是否兼容OpenHarmony平台
七、总结
FlutterPage为OpenHarmony开发者提供了强大的混合开发能力,使开发者能够充分利用Flutter生态的丰富资源和OpenHarmony的原生优势。通过本文的介绍,开发者可以快速掌握FlutterPage的使用方法,包括环境搭建、依赖引入、页面嵌入和双向通信等核心功能。
使用FlutterPage,开发者可以:
- 实现Flutter与OpenHarmony的无缝集成
- 构建高性能的混合UI应用
- 充分利用两个生态的优势资源
- 提高开发效率和应用质量
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐



所有评论(0)