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

Flutter Android端自定义平台代码官方示例报错求助

Flutter Android端MethodChannel报错:MissingPluginException解决思路

我在Flutter应用中集成Android端特定代码,采用官方示例实现后出现报错,但iOS端官方示例可正常运行。以下是相关代码及报错信息,求解决思路:

Android Kotlin代码

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES


class MainActivity: FlutterActivity() {
  private val CHANNEL = "my_string/battery"

  override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
      // 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 (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
      val batteryManager = getSystemService(Context.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 Dart代码

Future<void> getBatteryLevel() async {
    var platform = MethodChannel('my_string/battery');
    String batteryLevel;
    try {
      int batteryLevel = await platform.invokeMethod('getBatteryLevel');
      // batteryLevel = 'Battery level at $result % .';
      print(batteryLevel);
    } on PlatformException catch (e) {
      batteryLevel = "Failed to get battery level: '${e.message}'.";
    }
  }

报错信息

E/flutter (21390): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: MissingPluginException(No implementation found for method getBatteryLevel on channel my_string/battery)
E/flutter (21390): #0      MethodChannel._invokeMethod
platform_channel.dart:313
E/flutter (21390): <asynchronous suspension>
E/flutter (21390): #1      PreferencePageViewModel.studyplusLogIn
preference_page_view_model.dart:904
E/flutter (21390): <asynchronous suspension>

解决思路

  • 严格校验通道名称:确保Dart代码中MethodChannel的参数与Kotlin中CHANNEL常量完全一致,包括大小写、斜杠等特殊字符,不能有任何差异。
  • 清理缓存并重建项目:
    • 停止当前运行的应用,执行命令flutter clean清除构建缓存
    • 重新构建Android项目,可通过flutter run直接启动,或在Android Studio中执行File > Sync Project with Gradle Files后再运行
  • 确认Activity配置正确性:
    • 确保MainActivity继承自FlutterActivity,且configureFlutterEngine方法中正确调用了super.configureFlutterEngine(flutterEngine)
    • 检查MethodChannel的初始化和setMethodCallHandler逻辑是否完整写在configureFlutterEngine方法内部,没有被遗漏或放在错误的生命周期方法中
  • 排查Flutter Engine初始化问题:如果使用了自定义的FlutterEngine实例,需确保通道注册在Engine初始化完成后执行;默认FlutterActivity的写法无需额外调整
  • 检查AndroidManifest配置:确认MainActivity是应用的默认启动Activity,没有配置错误的theme或启动模式导致Activity无法正常初始化MethodChannel
  • 更换测试环境验证:尝试在不同的Android模拟器或真机上测试,排除设备环境本身的异常

内容的提问来源于stack exchange,提问作者marosiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:47:55