Harmonyos توسعه ترکیبی بعدی شعله

در فرآیند تکمیل Hongmeng خالص در حالت جدایی سه انتها ، اگرچه اسناد رسمی راهنمایی هایی را ارائه می دهند ، اما ممکن است در عملکرد واقعی برخی از مشکلات وجود داشته باشد. در زیر خلاصه ای از تجربه من در طی فرآیند سازگاری برای توسعه دهندگان شما برای مراجعه به آنها وجود دارد – اگر مفید است ، لطفاً آن را دوست داشته باشید.
در طی فرآیند اختلاط ، این مبتنی بر تیم ماهی شور Flutter_Boost است (تفاوت بین آنها و سایر راه حل ها در اینجا مورد بحث قرار نمی گیرد) و فلوتلوژین سفارشی.
عمدتا محتوا درگیر:
- محیط زیست
- ایجاد ماژول Flutter
- غذا 引入 flutter_boost
- هارمونی Flutter_Boost را معرفی می کند
- ارتباطات جانبی فلوتر و هنگمنگ
- Flutter Hongmeng را بومی می نامد
محیط زیست
برای پشتیبانی از محیط توسعه Flutter_fluter برای پشتیبانی از SDK Flutter ، برای پشتیبانی از محیط توسعه Hongmeng استفاده کنید.
من آن را تکرار نمی کنم ، لینک را اضافه می کنم.
ایجاد ماژول Flutter
یک پروژه Fluter ایجاد کنید
flutter create -t module --org xyz.zhousg demo_fluter
بسته بندی پروژه های Fluter
flutter build har --debug
Fluter Flutter_Boost را معرفی می کند
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
fl_chart: ^0.62.0
flutter_boost:
+ git:
+ url: 'https://github.com/alibaba/flutter_boost.git'
+ ref: '4.6.5'
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_boost/flutter_boost.dart';
// 1. 创建一个自定义的Binding,继承和with的关系如下,里面什么都不用写
class CustomFlutterBinding extends WidgetsFlutterBinding
with BoostFlutterBinding {}
void main() {
// 2. 这里的CustomFlutterBinding调用务必不可缺少,用于控制Boost状态的resume和pause
CustomFlutterBinding();
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// 3. 路由表
Map<String, FlutterBoostRouteFactory> routerMap = {
'SettingsPage': (settings, isContainerPage, uniqueId) {
return CupertinoPageRoute(
settings: settings,
builder: (BuildContext ctx) {
return const Placeholder();
},
);
},
'DeviceStoragePage': (settings, isContainerPage, uniqueId) {
return CupertinoPageRoute(
settings: settings,
builder: (BuildContext ctx) {
return const Placeholder();
},
);
},
'AboutPage': (settings, isContainerPage, uniqueId) {
return CupertinoPageRoute(
settings: settings,
builder: (BuildContext ctx) {
return const Placeholder();
},
);
},
"https://dev.to/": (settings, isContainerPage, uniqueId) {
return CupertinoPageRoute(
settings: settings,
builder: (BuildContext ctx) {
return const Placeholder();
},
);
},
};
// 路由工厂函数
Route<dynamic> routeFactory(
RouteSettings settings, bool isContainerPage, String? uniqueId) {
FlutterBoostRouteFactory? fn = routerMap[settings.name];
if (fn == null) {
throw FlutterError(
'Route "${settings.toString()}" is not defined in routerMap.');
}
return fn(settings, isContainerPage, uniqueId)!;
}
@override
Widget build(BuildContext context) {
// flutter_boost 接管
return FlutterBoostApp(
routeFactory,
// Flutter 侧直接预览需要,需要使用 Deveco Studio 导入 .ohos 项目进行自动签名预览至鸿蒙设备
initialRoute: 'SettingsPage',
appBuilder: (home) {
return MaterialApp(
builder: (context, child) => home,
);
},
);
}
}
هارمونی Flutter_Boost را معرفی می کند
در اینجا ما از Router + FlutterPage برای نمایش رابط Flutter استفاده می کنیم.
pack.
.ohos
|--har
|-- fluter_boost.har
|-- fluter_module.har
|-- fluter.har
ب.
oh-package.json5
"dependencies": {
"@ohos/flutter_module": "file:../demo_flutter/.ohos/har/flutter_module.har",
// 下面两个依赖我直接拷贝到了 libs 下
"@ohos/flutter_ohos": "file:./libs/flutter.har",
"flutter_boost": "file:./libs/flutter_boost.har"
},
"overrides": {
"@ohos/flutter_ohos": "file:./libs/flutter.har",
"flutter_boost": "file:./libs/flutter_boost.har"
},
ج.
entryAbility.ets
import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
import { router } from '@kit.ArkUI';
import { FlutterManager } from '@ohos/flutter_ohos';
import { FlutterBoostDelegate, FlutterBoostRouteOptions, FlutterBoost, FlutterBoostSetupOptionsBuilder } from 'flutter_boost';
import { GeneratedPluginRegistrant } from '@ohos/flutter_module';
export default class EntryAbility extends UIAbility implements FlutterBoostDelegate{
pushNativeRoute(options: FlutterBoostRouteOptions): void {
// throw new Error('Method not implemented.');
}
pushFlutterRoute(options: FlutterBoostRouteOptions,): void {
// throw new Error('Method not implemented.');
}
popRoute(options: FlutterBoostRouteOptions): boolean {
// throw new Error('Method not implemented.');
router.back()
return true
}
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
FlutterManager.getInstance().pushUIAbility(this);
}
onDestroy(): void {
FlutterManager.getInstance().popUIAbility(this);
}
onWindowStageCreate(windowStage: window.WindowStage): void {
// Flutter bind in UIAbility
FlutterManager.getInstance().pushWindowStage(this, windowStage);
// Initial FlutterBoost
const optionsBuilder: FlutterBoostSetupOptionsBuilder = new FlutterBoostSetupOptionsBuilder()
FlutterBoost.getInstance().setup(this, this.context, (engine) => {
GeneratedPluginRegistrant.registerWith(engine)
}, optionsBuilder.build())
windowStage.loadContent('pages/Index');
}
onWindowStageDestroy(): void {
FlutterManager.getInstance().popWindowStage(this);
}
onForeground(): void {
logger.info('Ability onForeground');
}
onBackground(): void {
logger.info('Ability onBackground');
}
}
برخی از کدها در اینجا حذف شده اند ~ pushnativeroute pushflutterroute poproute اجرای خاص هنوز برای مراجعه به مخزن رسمی است
د.
- flutterpage صفحه ای که میزبان Flutter است
pages/FluterPage.ets
import { FlutterEntry, FlutterPage, FlutterView} from '@ohos/flutter_ohos';
import { FlutterBoost, FlutterBoostEntry } from 'flutter_boost';
import { router } from '@kit.ArkUI';
@Entry
@Component
struct SettingsPage {
private flutterEntry?: FlutterEntry;
private flutterView?: FlutterView
aboutToAppear() {
this.flutterEntry = new FlutterBoostEntry(getContext(this), router.getParams())
this.flutterEntry?.aboutToAppear()
this.flutterView = this.flutterEntry?.getFlutterView()
}
aboutToDisappear() {
this.flutterEntry?.aboutToDisappear()
}
onPageShow() {
this.flutterEntry?.onPageShow()
}
onPageHide() {
this.flutterEntry?.onPageHide()
}
onBackPress(): boolean | void {
FlutterBoost.getInstance()
.getPlugin()?.onBackPressed();
return true;
}
build() {
Column() {
FlutterPage({ viewId: this.flutterView?.getId() })
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
}
}
pages/Index.ets
// uri Flutter Module 中的路由表 KEY params 是传参
router.pushUrl({ url: 'pages/FlutterPage', params: { uri: 'DeviceStoragePage', params: {} } })
router.pushUrl({ url: 'pages/FlutterPage', params: { uri: 'SettingPage', params: {} } })
router.pushUrl({ url: 'pages/FlutterPage', params: { uri: 'AboutPage', params: {} } })
ارتباطات جانبی فلوتر و هنگمنگ
TextButton(
onPressed: () {
Map<String, String> data = {'name': 'jack'};
BoostChannel.instance.sendEventToNative('updateUser', data);
},
child: const Text('发送消息'),
),
pages/FlutterPage.ets
aboutToAppear() {
this.flutterEntry = new FlutterBoostEntry(getContext(this), router.getParams())
this.flutterEntry?.aboutToAppear()
this.flutterView = this.flutterEntry?.getFlutterView()
const plugin = FlutterBoost.getInstance()
.getPlugin()
if (plugin) {
// 通信
plugin.addEventListener('updateUser', {
onEvent: (key, args) => {
// logger.debug(`事件名称 ${key}`, JSON.stringify(args))
promptAction.showToast({ message: 'Flutter Data: ' + JSON.stringify(args) })
}
})
}
Flutter Hongmeng را بومی می نامد
final _platform = const MethodChannel('xyz.zhousg.interview_success_project');
TextButton(
onPressed: () {
_platform.invokeMethod('openCamera').then(
(value) => setState(() {
// value 鸿蒙侧回传数据
}),
);
},
child: Text('打开相机),
),
افزونه Flutter را تعریف کنید
NativePlugin.ets
import { FlutterPlugin, FlutterPluginBinding, MethodChannel, MethodResult } from '@ohos/flutter_ohos';
export class NativePlugin implements FlutterPlugin {
private channel?: MethodChannel;
getUniqueClassName(): string {
return 'CameraPlugin'
}
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.channel = new MethodChannel(binding.getBinaryMessenger(), 'xyz.zhousg.interview_success_project')
this.channel.setMethodCallHandler({
onMethodCall: (call, result) => {
switch (call.method) {
case "openCamera":
this.openCamera(result)
break;
default:
result.notImplemented()
break;
}
}
})
}
onDetachedFromEngine(binding: FlutterPluginBinding): void {
this.channel?.setMethodCallHandler(null);
}
// native api
openCamera (result: MethodResult) {
// 回传数据给 Flutter
result.success('http://test.png')
}
}
یک افزونه ثبت کنید
entryAbility.ets
// Initial FlutterBoost
const optionsBuilder: FlutterBoostSetupOptionsBuilder = new FlutterBoostSetupOptionsBuilder()
FlutterBoost.getInstance().setup(this, this.context, (engine) => {
GeneratedPluginRegistrant.registerWith(engine)
// 打开相机
engine.getPlugins()?.add(new NativePlugin())
}, optionsBuilder.build())
از Flutter_Boost برای توسعه پروژه های ترکیبی Flutter بسیار شبیه به اجزای وب هیبریدی برای توسعه هیبریدی در Hongmeng است.