Flutter Android平台MissingPluginException异常求助(附MainActivity.kt代码)
Flutter Android平台MissingPluginException异常求助(附MainActivity.kt代码)
Hey 兄弟,看你贴的MainActivity代码片段,应该是在做Flutter和Android原生MethodChannel通信的时候碰到MissingPluginException了吧?我之前做原生插件的时候也踩过这个坑,给你梳理几个大概率能解决的方向,按顺序试就好:
先把你贴的代码格式化补全(原代码有截断,我补了关键的MethodChannel注册结构)
import android.app.ActivityManager import android.content.Context import androidx.annotation.NonNull import android.Manifest import android.content.pm.PackageManager import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import android.net.Uri import android.content.Intent import android.app.AppOpsManager import android.app.usage.UsageEvents import android.app.usage.UsageStatsManager import android.os.Build import android.os.Bundle import android.provider.Settings import android.util.Log import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugins.GeneratedPluginRegistrant class MainActivity : FlutterActivity() { private val CHANNEL = "app_usage" override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { // 注意!这行必须放在最前面执行 GeneratedPluginRegistrant.registerWith(flutterEngine) // 完整注册MethodChannel的处理逻辑,不能漏掉 MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> when (call.method) { // 这里根据你需要的方法名写处理逻辑 "getAppUsage" -> { // 示例:处理获取应用使用统计的请求 result.success("这里返回你要给Flutter的数据") } else -> { // 处理未实现的方法 result.notImplemented() } } } } }
核心排查&解决步骤
- 注册顺序是重中之重!
GeneratedPluginRegistrant.registerWith(flutterEngine)必须先于MethodChannel的注册代码执行。如果反过来写,Flutter引擎还没完成基础插件注册,直接就会报MissingPluginException,这个坑我当初踩了好多次。 - 核对CHANNEL名称一字不差:Flutter端调用用的Channel名字必须和原生里的
"app_usage"完全一致,大小写、空格、符号都不能错,差一点都不行!比如Flutter端要是写成了"App_Usage"或者多了个空格,直接就找不到对应的通道了。 - 清缓存重建项目:很多时候就是缓存搞的鬼,先执行
flutter clean,然后flutter pub get,再去Android Studio里点Build -> Clean Project,接着Rebuild Project,最后重新跑项目,大概率能解决莫名其妙的找不到插件问题。 - 检查混淆规则(仅Release包问题):如果是打Release包才出问题,那基本是混淆把MethodChannel的代码干掉了。打开
android/app/proguard-rules.pro,加上这几行:-keep class io.flutter.plugin.common.MethodChannel { *; } -keep class io.flutter.plugin.common.MethodChannel$MethodCallHandler { *; } -keep class com.yourpackage.MainActivity { *; } // 把com.yourpackage换成你自己的实际包名 - Flutter端调用要规范:Flutter端要确保在MethodChannel初始化完成后再调用方法,用
async/await处理异步调用,避免在引擎未初始化完成时同步调用。比如Flutter端代码要这样写:import 'package:flutter/services.dart'; class AppUsageHelper { static const MethodChannel _channel = MethodChannel('app_usage'); static Future<String?> fetchAppUsage() async { try { final String? result = await _channel.invokeMethod('getAppUsage'); return result; } on PlatformException catch (e) { print("调用原生方法出错:${e.message}"); return null; } } }
另外要注意,你的原代码里configureFlutterEngine方法被截断了,一定要确保你完整实现了MethodChannel的setMethodCallHandler逻辑,不能只定义个CHANNEL变量就完事了。
备注:内容来源于stack exchange,提问作者Aditya Dhafa
相关产品推荐
相关产品推荐

