Flutter调用原生Kotlin代码遇MethodChannel插件异常问题
问题:MethodChannel调用时Firebase Messaging与Flutter Local Notifications插件报错
调用MethodChannel实现Flutter与第三方应用数据收发时,出现以下错误:
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(channel-error, Unable to establish connection on channel., null, null)
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: MissingPluginException(No implementation found for method initialize on channel dexterous.com/flutter/local_notifications)
相关代码
Android端MainActivity.kt代码
package com.package.name import android.content.ContextWrapper import android.content.Intent import android.content.IntentFilter import android.os.BatteryManager import android.os.Build import android.os.Bundle import androidx.annotation.NonNull import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin class MainActivity: FlutterActivity() { private val CHANNEL = "samples.flutter.dev/battery" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) flutterEngine?.plugins?.add(FlutterFirebaseMessagingPlugin()) } override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { // Note: this method is invoked on the main thread. call, result -> if (call.method == "getBatteryLevel") { val batteryLevel = getBatteryLevel() if (batteryLevel != -1) { result.success(batteryLevel) } else { result.error("UNAVAILABLE", "Battery level not available.", null) } } else { result.notImplemented() } } } private fun getBatteryLevel(): Int { val batteryLevel: Int if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val batteryManager = getSystemService(BATTERY_SERVICE) as BatteryManager batteryLevel = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) } else { val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED)) batteryLevel = intent!!.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1) } return batteryLevel } }
Flutter端MethodChannel调用代码
Future<void> getBatteryLevel() async { const platform = const MethodChannel('samples.flutter.dev/battery'); try { final int result = await platform.invokeMethod('getBatteryLevel'); print(result); } on PlatformException catch (e) { print('${e.message}'); } }
解决方案
1. 移除手动添加插件的代码
删除MainActivity.kt中onCreate方法里的flutterEngine?.plugins?.add(FlutterFirebaseMessagingPlugin())这一行。当前Flutter的Firebase插件会通过自动注册机制完成初始化,手动添加会导致通道冲突,引发channel-error异常。
2. 确保插件自动注册正常
如果你的项目是较旧的Flutter版本,需要在configureFlutterEngine方法中保留父类方法调用(新版本FlutterActivity默认已处理):
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 自定义MethodChannel代码... }
必须调用super.configureFlutterEngine(flutterEngine),否则会阻止系统自动注册第三方插件。
3. 清理并重新构建项目
执行以下步骤彻底重置项目依赖与缓存:
- 终端运行
flutter clean - 运行
flutter pub get - 关闭真机/模拟器上的应用,重新执行
flutter run
4. 检查Flutter Local Notifications配置
确保AndroidManifest.xml中已添加必要配置:
- 添加权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
同时确认插件版本与当前Flutter版本兼容。
内容的提问来源于stack exchange,提问作者Toxic
相关产品推荐
相关产品推荐

