我最近一直在使用一些扑动插件。许多人工作得很好,但我多次偶然发现令人沮丧的错误,通常导致放弃插件。
这是我得到的最后一个,与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 clean
,flutter upgrade
,flutter packages get
然后flutter run
”。有时它可能就足够了,但并非总是如此 - 在我的特定情况下,我仍然得到完全相同的错误。
值得注意的是,如果我克隆插件的整个GitHub存储库并从该目录中运行示例,它确实可以正常工作。但是,如果我尝试重新创建示例项目,它不会,所以我认为我错过了什么,但是什么?
以下是重新创建示例的步骤:
schedule_notifications: ^0.1.8 in pubspec.yaml
Packages get
和Packages upgrade
Get packages
main.dart
文件中import 'package:schedule_notifications_example/time_picker.dart';
更改为import 'time_picker.dart';
以解决我从Android Studio获得的错误time_picker.dart
旁边创建一个文件main.dart
并在其中粘贴https://github.com/serralvo/schedule_notifications/blob/master/example/lib/time_picker.dart的代码flutter clean
,flutter upgrade
,flutter packages get
flutter run
仍然会得到相同的错误那么,到底发生了什么?对于某些开发人员或某些项目,有些插件会产生什么样的行为?我究竟做错了什么 ?
类似问题的例子:
我遇到了同样的问题,并花了一些时间来理解它为什么会发生。解决方案很简单,只需杀死应用程序并运行一个新的应用程序。
添加新插件时,需要重新构建应用程序,热重新启动不构建应用程序,除非再次构建,否则新添加的项目不会包含在项目中。
好吧,我发布了我发现的内容,以防将来可以帮助某人。但我仍然对进一步的解释感兴趣。
因此,为了使schedule_notifications插件工作,我不得不在MainActivity.java
中打开文件example project。在那里,我注意到我自己项目中没有的一些行:
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
的新线相关联。这就是问题的来源。
执行这些步骤会使插件工作,但我不确定它是好还是糟糕的做法。如果真的是我们应该做的事情,我必须说它不是很明显!我认为至少插件安装文档应该解释它。