我创建了一个自定义 MethodChannel“com.example.app/widget”,它在收到 Firebase 云消息后更新 Android 上的主屏幕小部件。在应用程序处于前台时调用它时运行良好,但我也想在应用程序关闭或在后台接收到 Firebase 云消息时调用它。
当应用程序在后台时,它会给我一个 MissingPluginException 错误,如下所示:
E/flutter (28540): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: MissingPluginException(No implementation found for method updateFromFlutter on channel com.example.app/widget)
E/flutter (28540): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:157:7)
... 等等。还有很多关于 MissingPluginException 错误的其他线程涉及将插件添加到注册表,但我无法找到任何解决不属于另一个插件的自定义 MethodChannels 的线程。是否可以将我的自定义 MethodChannel 添加到注册表或执行类似的操作以使 Dart 代码能够在后台从该通道调用方法?
我已经尝试使用 workmanager 和 android_alarm_manager 并且它们本身似乎运行良好,但是使用我的自定义频道它们仍然无法通过此块。
我的 MainActivity.kt 中包含方法详细信息:
class MainActivity: FlutterActivity(), MethodChannel.MethodCallHandler {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example.app/widget")
channel.setMethodCallHandler(this)
}
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
when (call.method) {
"updateFromFlutter" -> {
val views = RemoteViews(context.packageName, R.layout.appwidget).apply {
setTextViewText(R.id.text, call.argument("text"))
}
val manager = AppWidgetManager.getInstance(this)
manager.updateAppWidget(call.argument("idNumber"), views)
}
}
}
}
然后在 main.dart 我打电话:
Future<void> updateAndroidWidget(String text) async {
WidgetsFlutterBinding.ensureInitialized();
const MethodChannel platform = MethodChannel('com.example.app/widget');
try {
platform.invokeMethod("updateFromFlutter", {
"text": text,
"idNumber": savedPreferences.androidWidgetID
});
} catch (e) {
print("failed: $e");
}
}
我已经有了 Flutter Android Embedding V2(Flutter 版本 >= 1.12)。
任何帮助是极大的赞赏。