解决attempted to register plugin but it was already registered with this flutterengine

简介: 解决attempted to register plugin but it was already registered with this flutterengine

场景

Flutter版本更新后,运行出现以下问题,App闪退。

W/FlutterEngineCxnRegstry(10678): Attempted to register plugin (io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry$ShimRegistrarAggregate@3777b26) but it was already registered with this FlutterEngine (io.flutter.embedding.engine.FlutterEngine@6c93367).
E/AndroidRuntime(10678): FATAL EXCEPTION: main
E/AndroidRuntime(10678): Process: com.example.firstflutterapp, PID: 10678
E/AndroidRuntime(10678): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.firstflutterapp/com.example.firstflutterapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void io.flutter.plugin.common.BinaryMessenger.setMessageHandler(java.lang.String, io.flutter.plugin.common.BinaryMessenger$BinaryMessageHandler)' on a null object reference
E/AndroidRuntime(10678):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3898)
E/AndroidRuntime(10678):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4081)
E/AndroidRuntime(10678):  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
E/AndroidRuntime(10678):  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
E/AndroidRuntime(10678):  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
E/AndroidRuntime(10678):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2462)
E/AndroidRuntime(10678):  at android.os.Handler.dispatchMessage(Handler.java:110)
E/AndroidRuntime(10678):  at android.os.Looper.loop(Looper.java:219)
E/AndroidRuntime(10678):  at android.app.ActivityThread.main(ActivityThread.java:8393)
E/AndroidRuntime(10678):  at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(10678):  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
E/AndroidRuntime(10678):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
E/AndroidRuntime(10678): Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void io.flutter.plugin.common.BinaryMessenger.setMessageHandler(java.lang.String, io.flutter.plugin.common.BinaryMessenger$BinaryMessageHandler)' on a null object reference
E/AndroidRuntime(10678):  at io.flutter.plugin.common.MethodChannel.setMethodCallHandler(MethodChannel.java:119)
E/AndroidRuntime(10678):  at com.jzoom.amaplocation.AmapLocationPlugin.registerWith(AmapLocationPlugin.java:54)
E/AndroidRuntime(10678):  at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(GeneratedPluginRegistrant.java:18)
E/AndroidRuntime(10678):  at com.example.firstflutterapp.MainActivity.configureFlutterEngine(MainActivity.kt:31)
E/AndroidRuntime(10678):  at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:180)
E/AndroidRuntime(10678):  at io.flutter.embedding.android.FlutterActivity.onCreate(FlutterActivity.java:409)
E/AndroidRuntime(10678):  at android.app.Activity.performCreate(Activity.java:8121)
E/AndroidRuntime(10678):  at android.app.Activity.performCreate(Activity.java:8109)
E/AndroidRuntime(10678):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320)
E/AndroidRuntime(10678):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3871)
E/AndroidRuntime(10678):  ... 11 more

解决方案

根据错误描述,是因为注册plugin时提示已经被注册过了了。

涉及到插件,需要看官方文档。https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects

以下是我的MainActivity.kt

class MainActivity: FlutterActivity() {
  override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
  super.configureFlutterEngine(flutterEngine)
  GeneratedPluginRegistrant.registerWith(flutterEngine)
  }
}

这是官方代码

+    @Override
+    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
+        GeneratedPluginRegistrant.registerWith(flutterEngine);
+        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
+                .setMethodCallHandler(
+                    (call, result) -> {
+                        // Your existing code
+                }
+        );
+    }

发现多了个super方法,查看FlutterActivity源码发现,configureFlutterEngine方法已经调用过了GeneratedPluginRegistrant.registerWith(flutterEngine),所以我们只需要删除super.configureFlutterEngine(flutterEngine)即可。


class MainActivity: FlutterActivity() {
  override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
  //super.configureFlutterEngine(flutterEngine)
  GeneratedPluginRegistrant.registerWith(flutterEngine)
  }
}
相关文章
|
缓存 Dart JavaScript
flutter版本控制工具 `FVM`
文章目录 FVM 切换VSCode 的Flutter版本 在windows上安装fvm 方法一:先安装 choco 检查安装是否成功 常用指令 接下来安装fvm 方法二:pub方式安装 fvm VSCode配置 安卓studio Flutter版本切换 项目 缓存目录 列出配置 设置缓存路径 配置 常用命令 安装 删除 列出 releases doctor 路由 配置全局版本 项目多个选项 针对不用flavor版本 切换flavor版本 查看flavor 常见问题 运行 FVM 时内核二进制文件无效或 sdk 哈希无效 PATH 中 Windows 的环境变量顺序 找不到命令“pub”
1685 1
flutter版本控制工具 `FVM`
|
12月前
|
存储
如何在Flutter中动态申请权限?
如何在Flutter中动态申请权限?
957 66
Flutter基础widgets教程-IconButton篇
Flutter基础widgets教程-IconButton篇
598 0
Flutter 小技巧之 ListView 和 PageView 的各种花式嵌套
Flutter 小技巧之 ListView 和 PageView 的各种花式嵌套 在 Flutter 中,ListView 和 PageView 是两个常用的控件,它们可以用于滑动展示大量内容的场景,且支持各种嵌套方式,本文将介绍其中的一些花式嵌套方式。
651 0
|
容器
Flutter 解决宽度或高度不足而导致的屏幕溢出显示问题
Flutter 解决宽度或高度不足而导致的屏幕溢出显示问题
1301 1
|
IDE API 开发工具
Gleam
Gleam 是面向 Erlang 虚拟机的类型化语言,Gleam 的语法对于类型化语言来说非常优雅和简单。如果能看到 Gleam 像 Elixir 一样成功,那就太酷了。
896 4
|
Dart IDE 开发工具
Flutter Version Manager (FVM): Flutter的版本管理终极指南
Flutter Version Manager (FVM): Flutter的版本管理终极指南
7403 1
|
JSON Dart 测试技术
Flutter中高级JSON处理:使用json_serializable进行深入定制
Flutter中高级JSON处理:使用json_serializable进行深入定制
2941 3
|
Dart
Flutter之ExpansionTile实现以代码方式码折叠、展开
Flutter之ExpansionTile实现以代码方式码折叠、展开
485 4
|
UED 开发者
Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗
Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗
540 2