You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:55:01