首页 文章

Flutter MissingPluginException有几个插件

提问于
浏览
2

我最近一直在使用一些扑动插件 . 许多人工作得很好,但我多次偶然发现令人沮丧的错误,通常导致放弃插件 .

这是我得到的最后一个,schedule_notifications

E/flutter (24758): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (24758): MissingPluginException(No implementation found for method getIconResourceId on channel schedule_notifications_app)
E/flutter (24758): #0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:278:7)
E/flutter (24758): <asynchronous suspension>
E/flutter (24758): #1      _MyAppState._getIconResourceId (<my path>/sandbox/lib/main.dart:67:40)
E/flutter (24758): <asynchronous suspension>
E/flutter (24758): #2      _MyAppState.initState (<my path>/sandbox/lib/main.dart:24:7)
E/flutter (24758): #3      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3751:58)
E/flutter (24758): #4      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3617:5)
E/flutter (24758): #5      Element.inflateWidget (package:flutter/src/widgets/framework.dart:2907:14)
E/flutter (24758): #6      Element.updateChild (package:flutter/src/widgets/framework.dart:2710:12)
E/flutter (24758): #7      RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:857:16)
E/flutter (24758): #8      RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:828:5)
E/flutter (24758): #9      RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:774:17)
E/flutter (24758): #10     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2222:19)
E/flutter (24758): #11     RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:773:13)
E/flutter (24758): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:662:7)
E/flutter (24758): #13     runApp (package:flutter/src/widgets/binding.dart:704:7)
E/flutter (24758): #14     main (<my path>/sandbox/lib/main.dart:8:16)
E/flutter (24758): #15     _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:279:19)
E/flutter (24758): #16     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12)
D/libGLESv2(24758): DTS_GLAPI : DTS is not allowed for Package : <my package>
D/libGLESv1(24758): DTS_GLAPI : DTS is not allowed for Package : <my package>
D/ViewRootImpl(24758): ViewPostImeInputStage processPointer 0
D/ViewRootImpl(24758): ViewPostImeInputStage processPointer 1

在SO和GitHub上有很多类似问题的例子(参见我的帖子的结尾),但是唯一建议修复它们的是“使用 flutter cleanflutter upgradeflutter packages get 然后 flutter run ” . Sometimes it may be enough, but not always - 在我的特定情况下,我仍然得到完全相同的错误 .

值得注意的是,如果我克隆插件的整个GitHub存储库并从该目录中运行示例,它确实可以正常工作 . 但是,如果我尝试重新创建示例项目,它不会,所以我认为我错过了什么,但是什么?

Here are the steps I followed to re-create the example :

  • 在Android Studio中创建一个新的Flutter项目

  • 添加依赖项 schedule_notifications: ^0.1.8 in pubspec.yaml

  • 单击Android Studio中的Flutter命令 Packages getPackages upgrade

  • 单击Android Studio中的弹出窗口 Get packages

  • https://github.com/serralvo/schedule_notifications/blob/master/example/lib/main.dart中的代码粘贴到我的 main.dart 文件中

  • 将行 import 'package:schedule_notifications_example/time_picker.dart'; 更改为 import 'time_picker.dart'; 以解决我从Android Studio获得的错误

  • main.dart 旁边创建一个文件 time_picker.dart 并粘贴https://github.com/serralvo/schedule_notifications/blob/master/example/lib/time_picker.dart中的代码

  • 在Android Studio中执行项目并获得上述错误

  • 启动Flutter控制台并进入我的项目目录

  • 在控制台中执行命令 flutter cleanflutter upgradeflutter packages get

  • 在控制台中执行命令 flutter run 但仍会出现相同的错误

So, what is going on exactly ? What could produce this behavior with some plugins, for some developers or some projects ? What am I doing wrong ?

Examples of similar questions :

2 回答

  • 2

    我遇到了同样的问题并花了一些时间才明白为什么会这样 . 解决方案很简单,只需杀死应用程序并运行一个新的应用程序 .

  • 0

    好吧,我发布了我发现的内容,以防将来可以帮助某人 . 但我仍然对进一步的解释感兴趣 .

    因此,为了使schedule_notifications插件工作,我必须在example project中打开文件 MainActivity.java . 在那里,我注意到我自己项目中没有的一些行:

    MethodChannel methodChannel = new MethodChannel(getFlutterView(), "schedule_notifications_app");
        methodChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {
          @Override
          public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
            if (methodCall.method.equals("getIconResourceId")) {
              result.success(R.mipmap.ic_launcher);
            }
          }
        });
    

    当我在我自己的 MainActivity.java 文件中复制并粘贴这些行时(使用正确的导入),我的项目终于奏效了 .

    您会注意到在 main.dart 中,我们有以下这些行:

    static const _platform = const MethodChannel('schedule_notifications_app');
    

    iconResourceId = await _platform.invokeMethod('getIconResourceId');
    

    这些与 MainActivity.java 中的新行相关联 . 这就是问题的来源 .

    Performing those steps result in making the plugins work, but I'm unsure if it is good or awful practice. 如果真的是我们应该做的事情,我必须说它是 quite not obvious !我认为 at least the plugins installation docs should explain it .

相关问题