برنامه نویسی

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

در فرآیند تکمیل Hongmeng خالص در حالت جدایی سه انتها ، اگرچه اسناد رسمی راهنمایی هایی را ارائه می دهند ، اما ممکن است در عملکرد واقعی برخی از مشکلات وجود داشته باشد. در زیر خلاصه ای از تجربه من در طی فرآیند سازگاری برای توسعه دهندگان شما برای مراجعه به آنها وجود دارد – اگر مفید است ، لطفاً آن را دوست داشته باشید.

در طی فرآیند اختلاط ، این مبتنی بر تیم ماهی شور Flutter_Boost است (تفاوت بین آنها و سایر راه حل ها در اینجا مورد بحث قرار نمی گیرد) و فلوتلوژین سفارشی.

عمدتا محتوا درگیر:

  1. محیط زیست
  2. ایجاد ماژول Flutter
  3. غذا 引入 flutter_boost
  4. هارمونی Flutter_Boost را معرفی می کند
  5. ارتباطات جانبی فلوتر و هنگمنگ
  6. 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 است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا