缺少插件异常(在dexterous.com/flutter/local_notifications通道上找不到show方法的实现)

8
我尝试使用Flutter实现Firebase Cloud Messaging,但当我使用“本地通知”插件显示通知时,出现了一个问题。
在前台,我的通知可以正常工作,但在后台会出现以下错误:
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method show on channel dexterous.com/flutter/local_notifications)
我使用的是Firebase Cloud Messaging 6.0.9、Local Notification 1.2.0+4和最新的Flutter。
以下是我的代码: NotificationHandler
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

class NotificationHandler{
  static final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // make it a static field of the class

  static void initNotification()
  {

// initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
    var initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsIOS = IOSInitializationSettings(
        onDidReceiveLocalNotification: onDidReceiveLocalNotification);
    var initializationSettings = InitializationSettings(
        initializationSettingsAndroid, initializationSettingsIOS);
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
  }
  static Future onSelectNotification(String payload) async {
    if (payload != null) {
      print('notification payload: ' + payload);
    }

  }
  static Future onDidReceiveLocalNotification(int id, String title, String body, String payload) {
    print(title+" "+body);
  }

}

ShowNotification方法

static void showNotification(data, data2) async {
      var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
          'dexterous.com.flutter.local_notifications', 'your channel name', 'your channel description',
          importance: Importance.Max,
          priority: Priority.High);
      var iOSPlatformChannelSpecifics =
      new IOSNotificationDetails();
      var platformChannelSpecifics = new NotificationDetails(
          androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);

      await NotificationHandler.flutterLocalNotificationsPlugin
      .show(
        0,
        data,
        data2,
        platformChannelSpecifics,
        payload: 'Custom_Sound',
      );

  }

请按照以下步骤操作: 1)使用flutter clean命令 2)卸载之前的应用程序 3)重新安装该应用程序 - Jawad Ahmed
谢谢,问题已经解决了。这一步是无用的 :( - EddyLee
4个回答

17

我已经找到解决方案,因此在平台端我们不需要注册外部插件。

在FCMPluginRegistrant.java中添加以下内容:

public final  class FirebaseCloudMessagingPluginRegistrant {

    public static void registerWith(PluginRegistry registry) {

        if (alreadyRegisteredWith(registry)) {
            return;
        }
        FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        FlutterLocalNotificationsPlugin.registerWith(registry.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"));


    }




    private static boolean alreadyRegisteredWith(PluginRegistry registry) {
        final String key = FirebaseCloudMessagingPluginRegistrant.class.getCanonicalName();
        if (registry.hasPlugin(key)) {
            return true;
        }
        registry.registrarFor(key);
        return false;
    }
}

在 Application.java 上调用它。

  @Override
    public void registerWith(PluginRegistry registry) {



        FirebaseCloudMessagingPluginRegistrant.registerWith(registry);

    }

这对我有效。尚未检查其他平台是否需要类似的解决方法。import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin - Sigurdur
在上面的第一段代码中,还要导入io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin。这对我有用。 - Raja C

6

对于 Kotlin: Application.kt

package your.package.name

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
import io.flutter.view.FlutterMain
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
        FlutterMain.startInitialization(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
            FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
        }
        if (!registry!!.hasPlugin("com.dexterous.flutterlocalnotifications")) {
                FlutterLocalNotificationsPlugin.registerWith(registry!!.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"));
        }
    }
}

这对我似乎不起作用 https://stackoverflow.com/questions/62820872/how-do-i-correctly-register-a-plugin-with-the-fcm-plugin - anonymous-dev

1

我刚刚先卸载了这个应用,然后重新安装它,这样就解决了我的问题。


0

当我在我的混合应用程序的本地部分中使用result.notImplemented时,我遇到了同样的问题。当我将这个方法替换为result.success(0)时,所有问题都得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接