首页 > 解决方案 > Android 上的 Flutter:我可以在应用处于后台时调用自定义 MethodChannel 吗?

问题描述

我创建了一个自定义 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)。

任何帮助是极大的赞赏。

标签: androidflutterkotlinflutter-method-channel

解决方案


推荐阅读