首页 > 其他分享 >使用 ArkTs 开发 Flutter 鸿蒙平台插件

使用 ArkTs 开发 Flutter 鸿蒙平台插件

时间:2024-10-22 18:32:20浏览次数:1  
标签:插件 console err ArkTs value key import Flutter

使用 ArkTs 开发 Flutter 鸿蒙平台插件

本文讲述如何开发一个 Flutter 鸿蒙插件,如何实现 Flutter 与鸿蒙的混合开发,以及双端消息通信。

Flutter侧,编写 MethodChannel

const MethodChannel _methodChannel = MethodChannel('xxx.com/app');


  /// 获取token
  static Future<dynamic> getToken() {
    return _methodChannel.invokeMethod("getPrefs", 'token');
  }

  /// 设置token
  static Future<dynamic> setToken(String token) {
    return _methodChannel
        .invokeMethod("setPrefs", {'key': 'token', 'value': token});
  }

代码生命了一个 methodChannel, 并实现了 token 存错的调用方法。

ArkTs侧,实现调用

编写 src/main/ets/entryability/EntryAbility.ets


import { FlutterAbility, FlutterEngine } from '@ohos/flutter_ohos';
import { GeneratedPluginRegistrant } from '../plugins/GeneratedPluginRegistrant';
import ForestPlugin from './ForestPlugin';
import { BusinessError } from '@kit.BasicServicesKit';
import { window } from '@kit.ArkUI';
import { preferences } from '@kit.ArkData';

let dataPreferences: preferences.Preferences | null = null;

export default class EntryAbility extends FlutterAbility {

  onWindowStageCreate(windowStage: window.WindowStage): void {
    super.onWindowStageCreate(windowStage);
    preferences.getPreferences(this.context, 'forestStore', (err: BusinessError, val: preferences.Preferences) => {
      if (err) {
        console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);
        return;
      }
      dataPreferences = val;
      console.info("Succeeded in getting preferences1.");
    })
  }

  configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)
    GeneratedPluginRegistrant.registerWith(flutterEngine)
    this.addPlugin(new ForestPlugin());
  }
}

export {dataPreferences};

该文件使的原生页面在加载时,配置 Flutter 引擎,注册插件。 Flutter初始化时,同时初始化了 首选项dataPreferences,以备后用。

编写 src/main/ets/entryability/ForestPlugin.ets

import { Any, BasicMessageChannel, EventChannel, FlutterManager, FlutterPlugin, Log, MethodCall, MethodChannel, StandardMessageCodec} from '@ohos/flutter_ohos';
import { FlutterPluginBinding } from '@ohos/flutter_ohos/src/main/ets/embedding/engine/plugins/FlutterPlugin';
import { batteryInfo } from '@kit.BasicServicesKit';
import { MethodCallHandler, MethodResult } from '@ohos/flutter_ohos/src/main/ets/plugin/common/MethodChannel';
import { preferences } from '@kit.ArkData';
import { BusinessError } from '@kit.BasicServicesKit';
import {dataPreferences} from './EntryAbility';
import router from '@ohos.router'
import { webviewRouterParams } from '../pages/Webview';

const TAG = "[flutter][plugin][forest]";

export default class ForestPlugin implements FlutterPlugin {
  private channel?: MethodChannel;
  private basicChannel?: BasicMessageChannel<Any>;
  private api = new ForestApi();
  private dataPreferences: preferences.Preferences | null = null;

  onAttachedToEngine(binding: FlutterPluginBinding): void {
    this.channel = new MethodChannel(binding.getBinaryMessenger(), "xxx.com/app");
    this.channel.setMethodCallHandler({
      onMethodCall : (call: MethodCall, result: MethodResult) => {
        console.log(`${TAG}-->[${call.method}]: ${JSON.stringify(call.args)}`);
        switch (call.method) {
          case "getPrefs":
            this.api.getPrefs(String(call.args), result);
            break;
          case "setPrefs":
            let key = String(call.argument("key"));
            let value = String(call.argument("value"));
            this.api.setPrefs(key, value);
          default:
            result.notImplemented();
            break;
        }
      }
    })
  }
  //···
  onDetachedFromEngine(binding: FlutterPluginBinding): void {
    Log.i(TAG, "onDetachedFromEngine");
    this.channel?.setMethodCallHandler(null);
  }

  getUniqueClassName(): string {
    return "ForestPlugin";
  }

以上代码实现了一个插件类,其核心实现了FlutterPlugin中的 onAttachedToEngine方法,该方法在 Flutter 引擎加载成功后调用。

onMethodCall中接收来自 Flutter 的消息调用,分别实现了 'getPrefs' 和 'setPrefs' 两个回掉,其中 getPrefs有返回值,通过 result.success(val);(见下)异步返回,
setPrefs没有返回值。

以下为 ForestApi的具体实现,使用了 HarmonyOS 中的首选项 API 设置和读取数据。

class ForestApi {
  getPrefs(key: string, result: MethodResult) {
    dataPreferences?.get(key, '', (err: BusinessError, val: preferences.ValueType) => {
      if (err) {
        console.error(`${TAG} Failed to get value of ${key}. code =` + err.code + ", message =" + err.message);
        result.success('');
      }
      console.info(`${TAG} Succeeded in getting value of ${key}:${val}.`);
      result.success(val);
    })

  }

  setPrefs(key: string, value: string) {
    dataPreferences?.put(key, value, (err: BusinessError) => {
      if (err) {
        console.error(`${TAG} Failed to put value of ${key}. code =` + err.code + ", message =" + err.message);
        return;
      }
      console.info(`${TAG} Succeeded in putting value of ${key}.`);
    })
  }

  clearPrefs(key: string) {
    dataPreferences?.delete(key, (err: BusinessError) => {
      if (err) {
        console.error("Failed to delete the key 'startup'. code =" + err.code + ", message =" + err.message);
        return;
      }
      console.info(`Succeeded in deleting the key ${key}.`);
    })
  }
}

注意事项

1.双端初始化methodChannel中的名称必须保持一致,如 xxx.com/app.
2.arkTS侧通过 result.success(val) 返回数据,该过程是异步的,故在 Dart 侧需要使用 await 或者回调函数取值。
3.通信中默认只支持基础的数据类型,复杂类型的需要进行序列化或编解码。
4.在Dart 侧接收的数据为 dymanic 类型,需要进行数据类型转换。

参考资料

标签:插件,console,err,ArkTs,value,key,import,Flutter
From: https://www.cnblogs.com/zacksleo/p/18493487

相关文章

  • 如何手动安装jenkins插件
    第一步:进入jenkins的插件地址https://plugins.jenkins.io/(有时加载会慢,等等就会加载出来,加载不出来的话,就使用梯子)第二步:搜索插件第三步:选择插件第四步:查看详情页第五步:下载插件如果是下载当前插件的话,直接点击directlink如果要下载之前版本的插件的话,点击checksums......
  • 鸿蒙 Flutter 开发中集成 Webview
    鸿蒙Flutter开发中集成Webview主要有两种方案使用第三方库如使用flutter_inappwebview插件,在pubspec.lock文件中配置:flutter_inappwebview:git:url:https://gitee.com/openharmony-sig/flutter_inappwebview.gitpath:"flutter_inappwebview"编......
  • 鸿蒙Flutter实战:02-Windows环境搭建踩坑指南
    鸿蒙Flutter实战:02-Windows环境搭建踩坑指南环境搭建1.下载FlutterSDK,配置环境变量鸿蒙FlutterSDK需要在Gitee下载。目前建议下载dev分支代码。需要配置以下用户变量注意鸿蒙开发需要安装Java和配置相关变量#fluttersdk镜像FLUTTER_STORAGE_BASE_URL=https://s......
  • 新 Chrome 插件可检测 AI 伪造声音;Canary Speech 推出用于临床对话的语音分析技术丨 R
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 几行代码带你用TinyEngine低代码引擎开发侧边栏插件
    本文分享自华为云社区《实操上手TinyEngine低代码引擎插件化开发》,作者:OpenTiny。1.背景介绍1.1TinyEngine低代码引擎简介低代码开发是近些年非常热门的一种开发方式,用户可以通过可视化的方式,简单拖拽,不写代码或者编写少量代码,类似搭积木一样搭建业务应用。TinyEngine是一个......
  • PageHelper 分页插件使用中的那些“坑”
    PageHelper分页插件使用中的那些“坑”引言在项目开发过程中,分页查询是常见的需求之一。PageHelper是一个MyBatis的分页插件,它能够自动完成MyBatis的分页功能。然而,在使用过程中可能会遇到一些问题,特别是当手动在SQL中使用了LIMIT进行分页的情况下。本文将探讨这些问......
  • 通义灵码操作指南——插件使用指南
    点击链接,立即下载通义灵码插件:https://tongyi.aliyun.com/lingma/通义灵码,作为智能编码助手,可以在你进行编码工作时,为你提供行级/函数级实时续写、注释生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、代码问题修复等辅助编码工作的功能。说明:在IDE环......
  • 通义灵码操作指南——插件配置指南
    点击链接,立即下载通义灵码插件:https://tongyi.aliyun.com/lingma/通义灵码支持在VisualStudioCode、JetBrainsIDEs中修改常用快捷键、进行行间生成的启用/禁用等功能开关配置。VisualStudioCode中配置通义灵码准备工作如果需要在VisualStudioCode中使用通义灵码,必......
  • 鸿蒙Flutter实战:01-搭建开发环境
    鸿蒙Flutter实战:01-搭建开发环境准备工作1.安装DevEcoStudioNEXTIDE,注意版本应该是Next,当前最新的是Beta32.安装Git,如果要同时适配安卓,需要安装AndroidStudio;如果要适配ios,需要安装XcodeMac安装(推荐)环境变量配置#FlutterMirrorexportPUB_HOSTED_URL=h......
  • Maven入门到进阶:构建、依赖与插件管理详解
    文章目录一、Maven介绍1、什么是Maven2、Maven的核心功能二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成1.4、Packaging2、POM、父POM和超级POM2.1、POM(ProjectObjectModel)2.1、父POM(ParentPOM)2.3、超级POM(SuperPOM......