HarmonyOS鸿蒙Next中在flutter调用ArkTS插件报错MissingPluginException

HarmonyOS鸿蒙Next中在flutter调用ArkTS插件报错MissingPluginException 参考文章

鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件 | 华为开发者联盟

的方法,依然报错

MissingPluginException(No implementation found for method requestDocumentsPermission on channel test/permissions

代码如下

EntryAbility.ets

import { FlutterAbility, FlutterEngine } from '@ohos/flutter_ohos';
import { GeneratedPluginRegistrant } from '../plugins/GeneratedPluginRegistrant';
import CustomPermissionPlugin from '../my_plugins/CustomPermissionPlugin';

export default class EntryAbility extends FlutterAbility {
  configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)
    GeneratedPluginRegistrant.registerWith(flutterEngine)
    this.addPlugin(new CustomPermissionPlugin())
  }
}

CustomPermissionPlugin.ets

import {
  FlutterPlugin,
  FlutterPluginBinding,
  MethodChannel,
  MethodCall,
  MethodResult,
  Log
} from '@ohos/flutter_ohos';
import abilityAccessCtrl, { Permissions , PermissionRequestResult } from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';

const TAG = "CustomPermissionPlugin";

export default class CustomPermissionPlugin implements FlutterPlugin {
  private atManager = abilityAccessCtrl.createAtManager();
  private channel?: MethodChannel;
  private context = getContext(this) as common.UIAbilityContext

  onAttachedToEngine(binding: FlutterPluginBinding): void {
    console.log("attached to Engine")
    let that = this;

    this.channel = new MethodChannel(binding.getBinaryMessenger(), "test/permissions");
    this.channel.setMethodCallHandler({
      onMethodCall(call: MethodCall, result: MethodResult) {
        console.log(`${TAG}-->[${call.method}]: ${JSON.stringify(call.args)}`);
        if (call.method =="requestDocumentsPermission" ) {
          that.atManager.requestPermissionsFromUser(that.context, ['ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY'], (err: BusinessError<void>, data: PermissionRequestResult) => {
            if (err) {
              console.error(`requestDocumentsPermission fail, err->${err.code}:${err.message}`);
              result.error(err.code.toString(), err.message, err.data)
            } else {
              result.success(data.authResults[0])
            }
          });
        }else{
          result.notImplemented();
        }
      }
    })
  }

  getUniqueClassName(): string {
    return "CustomPermissionPlugin"
  }

  onDetachedFromEngine(binding: FlutterPluginBinding): void {
    Log.i(TAG, "onDetachedFromEngine");
    this.channel?.setMethodCallHandler(null);
  }
}

flutter调用方

  Future<void> _runPermissionAndSaveTest() async {
    try {
      const platform = MethodChannel('test/permissions');
      Future<void> requestPermissionsFromUser() async {
        String retStr;
        try {
          final int result =
              await platform.invokeMethod('requestDocumentsPermission') as int;
          retStr = "permission status: $result";
        } on PlatformException catch (e) {
          retStr = "Failed to request permission: '${e.message}'.";
        }
        debugPrint(retStr);
      }

      await requestPermissionsFromUser();

      final savePath = await FilePicker.platform.saveFile(
          dialogTitle: '保存文件', fileName: 'test.txt', initialDirectory: "/");
      if (savePath != null && savePath.isNotEmpty) {
        final file = File(savePath);
        await file.writeAsString('test');
        debugPrint('saved: $savePath');
      } else {
        debugPrint('canceled');
      }
    } catch (e, st) {
      debugPrint('file_picker error: $e');
      debugPrintStack(stackTrace: st);
    }
  }

更多关于HarmonyOS鸿蒙Next中在flutter调用ArkTS插件报错MissingPluginException的实战教程也可以访问 https://www.itying.com/category-92-b0.html

2 回复

在HarmonyOS鸿蒙Next中,Flutter调用ArkTS插件报错MissingPluginException通常是由于插件未正确注册或通信通道未建立导致的。需检查Flutter端是否通过MethodChannel正确调用ArkTS插件,并确认ArkTS侧已通过AbilityExtensionAbility实现对应接口。确保插件包名、方法名与调用代码完全匹配,且ArkTS模块已正确声明在module.json5配置文件中。若使用DevEco Studio,需重新编译生成HAP以确保插件集成完整。

更多关于HarmonyOS鸿蒙Next中在flutter调用ArkTS插件报错MissingPluginException的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


MissingPluginException通常表示Flutter端无法找到对应的ArkTS插件实现。从代码分析,问题可能出现在以下几个方面:

  1. 插件注册时机问题:在EntryAbility.ets中,你使用了addPlugin()方法注册插件,但需要确认插件注册是否在Flutter引擎初始化完成前执行。建议在onCreate()生命周期中确保插件注册:
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  this.flutterEngine = new FlutterEngine(this.context);
  // 先注册插件再配置引擎
  this.addPlugin(new CustomPermissionPlugin());
  super.onCreate(want, launchParam);
}
  1. 上下文获取问题:在CustomPermissionPlugin.ets中,getContext(this)可能无法正确获取UIAbilityContext。建议修改为:
private context: common.UIAbilityContext;

onAttachedToEngine(binding: FlutterPluginBinding): void {
  this.context = binding.getApplicationContext() as common.UIAbilityContext;
  // ... 其余代码
}
  1. 通道名称一致性:检查Flutter端和ArkTS端的MethodChannel名称完全一致,当前都是"test/permissions",这点正确。

  2. 权限声明:确保在module.json5中声明了所需权限:

"requestPermissions": [
  {
    "name": "ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY"
  }
]
  1. 插件生命周期:确认Flutter页面启动时插件已经完成注册。可以在onAttachedToEngine方法中添加日志确认是否被调用。

建议按顺序检查这些点,重点确认插件注册时机和上下文获取是否正确。

回到顶部