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
在HarmonyOS鸿蒙Next中,Flutter调用ArkTS插件报错MissingPluginException通常是由于插件未正确注册或通信通道未建立导致的。需检查Flutter端是否通过MethodChannel正确调用ArkTS插件,并确认ArkTS侧已通过Ability或ExtensionAbility实现对应接口。确保插件包名、方法名与调用代码完全匹配,且ArkTS模块已正确声明在module.json5配置文件中。若使用DevEco Studio,需重新编译生成HAP以确保插件集成完整。
更多关于HarmonyOS鸿蒙Next中在flutter调用ArkTS插件报错MissingPluginException的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
MissingPluginException通常表示Flutter端无法找到对应的ArkTS插件实现。从代码分析,问题可能出现在以下几个方面:
- 插件注册时机问题:在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);
}
- 上下文获取问题:在CustomPermissionPlugin.ets中,
getContext(this)可能无法正确获取UIAbilityContext。建议修改为:
private context: common.UIAbilityContext;
onAttachedToEngine(binding: FlutterPluginBinding): void {
this.context = binding.getApplicationContext() as common.UIAbilityContext;
// ... 其余代码
}
-
通道名称一致性:检查Flutter端和ArkTS端的MethodChannel名称完全一致,当前都是"test/permissions",这点正确。
-
权限声明:确保在module.json5中声明了所需权限:
"requestPermissions": [
{
"name": "ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY"
}
]
- 插件生命周期:确认Flutter页面启动时插件已经完成注册。可以在
onAttachedToEngine方法中添加日志确认是否被调用。
建议按顺序检查这些点,重点确认插件注册时机和上下文获取是否正确。

