Flutter 项目在 Android 中集成 Flutter module,Flutter 页面通过 MethodChannel 调用 Android 方法时抛出 MissingPluginException

发布于 1周前 作者 gougou168 来自 Flutter

在学习 Flutter,被一个问题折腾了好几天了,问题简化如下:

Flutter 版本是 v1.17.0

现有 Android 工程,里面有两个 Activity:

  1. MainActivity,该 Activity 中有一个按钮
  2. NativeActivity 。

然后又按照官方文档集成了 Flutter module,里面有页面 FlutterRoute,FlutterRoute 中有一个按钮。

现在操作逻辑如下: 点击 MainActivity 中的按钮,跳转到 Flutter 页面,然后点击 FlutterRoute 中的按钮,再跳转到 NativeActivity 。

现在 MainActivity 代码如下:

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.annotation.NonNull;

import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity implements View.OnClickListener, MethodChannel.MethodCallHandler {

private Button button;
private static final String CHANNEL_NAME = "TEST_CHANNEL_NAME";
private MethodChannel channel;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = findViewById(R.id.button);
    button.setOnClickListener(this);


}

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    GeneratedPluginRegistrant.registerWith(flutterEngine);
    channel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL_NAME);
    channel.setMethodCallHandler(this);
}

@Override
public void onClick(View v) {
    startActivity(
            FlutterActivity.withNewEngine().build(this)
    );
}


@Override
public void onMethodCall(@NonNull MethodCall methodCall, @NonNull MethodChannel.Result result) {
    if ("startNativeActivity".equals(methodCall.method)) {
        Intent intent = new Intent(MainActivity.this, NativeActivity.class);
        startActivity(intent);
    }
}

}

Flutter 代码如下:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main(){ runApp( MaterialApp( routes: { “/”:(BuildContext context)=>FlutterRoute(), }, initialRoute: “/”, ) ); }

class FlutterRoute extends StatefulWidget { FlutterRouteState createState() { return FlutterRouteState(); } }

class FlutterRouteState extends State<FlutterRoute> {

static const channel = MethodChannel(“TEST_CHANNEL_NAME”);

Future<void> startNativeActivity() async{ await channel.invokeMethod(“startNativeActivity”); }

@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(“Flutter 页面”), ), body: Container( color: Colors.lightGreenAccent, child: Center( child: Column( children: <Widget>[ Text(“Flutter 页面”), MaterialButton( color: Colors.redAccent, child: Text(“跳转到原生 Activity”), onPressed: () { startNativeActivity(); }, ), ], ), ), ), ); } }

在 MainActivity 中点击按钮,可以跳转到 FlutterRoute,但是在 FlutterRoute 中点击按钮跳转到 NativeActivity 的时候却抛出:

E/flutter: [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method startNativeActivity on channel TEST_CHANNEL_NAME)
    #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:154:7)
    <asynchronous suspension>
    #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:329:12)
    #2      FlutterRouteState.startNativeActivity (package:fluttermodule/main.dart:27:19)
    #3      FlutterRouteState.build.<anonymous closure> (package:fluttermodule/main.dart:46:19)
    #4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:779:19)
    #5      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:862:36)
    #6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
    #7      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:504:11)
    #8      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:282:5)
    ......

究竟是哪里出了问题啊,折腾好几天了,始终不行,难道 MethodChannel 不是这么用的吗?

百度谷歌官方 githubStackOverflow 搜了个遍。。。

实在没辙了,求点醒求指教,感谢


Flutter 项目在 Android 中集成 Flutter module,Flutter 页面通过 MethodChannel 调用 Android 方法时抛出 MissingPluginException

更多关于Flutter 项目在 Android 中集成 Flutter module,Flutter 页面通过 MethodChannel 调用 Android 方法时抛出 MissingPluginException的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

7 回复

更多关于Flutter 项目在 Android 中集成 Flutter module,Flutter 页面通过 MethodChannel 调用 Android 方法时抛出 MissingPluginException的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


大哥啊,我就是参照那个文档改的啊,可就是不行啊

在 Flutter 工程中,使用 MethodChannel 是可以获取宿主原生系统的信息的

但是把 Flutter 作为 module 添加到 Android 工程中,MethodChannel 就有问题了

官方教程的 demo 要在 flutter 侧 invokeMethod(‘getBatteryLevel’),然后在 native 侧的 MainActivity 有实现 getBatteryLevel
现在你要 invokeMethod(‘startNativeActivity’),然而在你的 native 侧的中并没有实现 startNativeActivity
所以才会提示 [No implementation found for method startNativeActivity on channel TEST_CHANNEL_NAME]


在 Native 侧实现了啊。。。
java<br><br> ...<br><br> <br> public void onMethodCall(NonNull MethodCall methodCall, MethodChannel.Result result) {<br> if ("startNativeActivity".equals(methodCall.method)) {<br> Intent intent = new Intent(MainActivity.this, NativeActivity.class);<br> startActivity(intent);<br> }<br> }<br>

用浏览器搜索功能在我发的那个网页里搜 getBatteryLevel,你看官方是怎么实现的,相关的代码是写在了什么位置

你没有调用 result 对象的 success 方法啊

在Flutter项目中集成Flutter module并在Flutter页面通过MethodChannel调用Android方法时遇到MissingPluginException,通常意味着Flutter端尝试调用的原生插件在Android端没有被正确注册或者初始化。以下是一些解决这个问题的步骤:

  1. 确认插件注册:确保在Android的MainActivity或者应用的入口Activity中调用了GeneratedPluginRegistrant.registerWith(this);。这行代码通常位于MainActivity.ktMainActivity.javaonCreate方法中。

  2. 检查MethodChannel名称:确保Flutter端和Android端在创建和调用MethodChannel时使用的名称完全一致。任何微小的拼写错误都会导致MissingPluginException

  3. 插件依赖:如果使用的是第三方插件,确保在build.gradle文件中已经正确添加了插件的依赖,并且同步了项目。

  4. 重新构建项目:有时候,简单的重新构建项目(先clean再build)可以解决缓存或配置更新不及时导致的问题。

  5. 检查Flutter模块集成:如果是在Flutter module中调用,确保模块已经正确集成到主应用中,并且主应用已经包含了必要的插件配置。

如果以上步骤都确认无误但问题依旧存在,建议检查Flutter和Android的官方文档或搜索具体的插件和错误日志,以获取更详细的解决方案。

回到顶部