PluginRegistry 无法转换为 FlutterEngine

Gab*_*van 77 firebase flutter firebase-cloud-messaging flutter-dependencies

一旦我将 flutter 更新到 1.12.13 版,我就发现了这个问题并且无法修复它。我按照firebase_messaging教程发送的,得到以下错误:“错误:类型不兼容:PluginRegistry无法转换为FlutterEngine GeneratedPluginRegistrant.registerWith(registry);”我的代码如下:

package io.flutter.plugins;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.Build;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
  @Override
  public void onCreate() {
    super.onCreate();
    FlutterFirebaseMessagingService.setPluginRegistrant(this);

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
      NotificationChannel channel = new NotificationChannel("messages","Messages", NotificationManager.IMPORTANCE_LOW);
  NotificationManager manager = getSystemService(NotificationManager.class);
  manager.createNotificationChannel(channel);
    }
  }

  @Override
  public void registerWith(PluginRegistry registry) {
    GeneratedPluginRegistrant.registerWith(registry);
  }
}
Run Code Online (Sandbox Code Playgroud)

meh*_*afi 111

替换此代码行:

GeneratedPluginRegistrant.registerWith(registry);
Run Code Online (Sandbox Code Playgroud)

有了这个:

FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
Run Code Online (Sandbox Code Playgroud)

确保导入:

import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
Run Code Online (Sandbox Code Playgroud)

  • 它有效......只需记住导入提到的类即可。导入 io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin; (11认同)

Dom*_*oMG 36

2019 年 12 月 31 日更新。

您不应使用 Firebase 云消息传递工具发送通知,因为它会强制您使用标题和正文。

您必须发送没有标题和正文的通知。在后台运行应用程序,这应该适合您。

如果它对你有用,如果你能给我这个答案投票,我将不胜感激,谢谢。


我找到了一个临时解决方案。我不确定这是最好的解决方法,但我的插件按预期工作,我认为问题必须出在 io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService 在第 164 行提供的注册表中。

我的 AndroidManifest.xml 文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="Your Package"> // CHANGE THIS

    <application
        android:name=".Application"
        android:label="" // YOUR NAME APP
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        <!-- BEGIN: Firebase Cloud Messaging -->    
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        <!-- END: Firebase Cloud Messaging -->    
        </activity>
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

我的应用程序.java

package YOUR PACKAGE HERE;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;

public class Application extends FlutterApplication implements PluginRegistrantCallback {

  @Override
  public void onCreate() {
    super.onCreate();
    FlutterFirebaseMessagingService.setPluginRegistrant(this);
  }

  @Override
  public void registerWith(PluginRegistry registry) {
    FirebaseCloudMessagingPluginRegistrant.registerWith(registry);
  }
}
Run Code Online (Sandbox Code Playgroud)

我的 FirebaseCloudMessagingPluginRegistrant.java

package YOUR PACKAGE HERE;

import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;

public final class FirebaseCloudMessagingPluginRegistrant{
  public static void registerWith(PluginRegistry registry) {
    if (alreadyRegisteredWith(registry)) {
      return;
    }
    FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
  }

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

在 dart 中发送通知:

Future<void> sendNotificationOnBackground({
  @required String token,
}) async {
  await firebaseMessaging.requestNotificationPermissions(
    const IosNotificationSettings(sound: true, badge: true, alert: true, provisional: false),
  );
  await Future.delayed(Duration(seconds: 5), () async {
    await http.post(
    'https://fcm.googleapis.com/fcm/send',
     headers: <String, String>{
       'Content-Type': 'application/json',
       'Authorization': 'key=$SERVERTOKEN', // Constant string
     },
     body: jsonEncode(
     <String, dynamic>{
       'notification': <String, dynamic>{

       },
       'priority': 'high',
       'data': <String, dynamic>{
         'click_action': 'FLUTTER_NOTIFICATION_CLICK',
         'id': '1',
         'status': 'done',
         'title': 'title from data',
         'message': 'message from data'
       },
       'to': token
     },
    ),
  );
  });  
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个持续时间为 5 秒的等待,以便您可以将应用程序置于后台并验证后台消息是否正在运行


Vin*_*ani 28

可以在下面找到 DomingoMG 代码到 Kotlin 的端口(包括文件路径)。经过测试并在 10.2020 上工作。

/ pubspec.yaml

firebase_messaging: ^7.0.0
Run Code Online (Sandbox Code Playgroud)

/安卓/应用/ src目录/主/科特林/ Application.kt

package YOUR_PACKAGE_HERE

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

public class Application: FlutterApplication(), PluginRegistrantCallback {
  override fun onCreate() {
    super.onCreate()
    FlutterFirebaseMessagingService.setPluginRegistrant(this)
  }

  override fun registerWith(registry: PluginRegistry) {
    FirebaseCloudMessagingPluginRegistrant.registerWith(registry)
  }
}
Run Code Online (Sandbox Code Playgroud)

/android/app/src/main/kotlin/ FirebaseCloudMessagingPluginRegistrant.kt

package YOUR_PACKAGE_HERE

import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin

class FirebaseCloudMessagingPluginRegistrant {
  companion object {
    fun registerWith(registry: PluginRegistry) {
      if (alreadyRegisteredWith(registry)) {
        return;
      }
      FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"))
    }

    fun alreadyRegisteredWith(registry: PluginRegistry): Boolean {
      val key = FirebaseCloudMessagingPluginRegistrant::class.java.name
      if (registry.hasPlugin(key)) {
        return true
      }
      registry.registrarFor(key)
      return false
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您好,``任务':app:mergeDexDebug'执行失败。&gt; 执行 com.android.build.gradle.internal.tasks.Workers$ActionFacade 时发生故障 &gt; com.android.builder.dexing.DexArchiveMergerException:合并 dex 存档时出错:了解如何解决该问题,请访问 https://developer .android.com/studio/build/dependency#duplicate_classes。程序类型已存在: com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant ``` (3认同)
  • 现在发生此错误无法实例化活动 ComponentInfo{com.example.firebase_push_notification_my/com.example.firebase_push_notification_my.Application}: java.lang.ClassCastException: com.example.firebase_push_notification_my.Application 无法转换为 android.app.Activity (3认同)

小智 8

一些研究,我发现这是有效的。
搜索官方 Flutterfire 存储库,并查看其上的最新插件。 GeneratedPluginRegistrant.registerWith(registry);不起作用,官方文档中也提到了这一点。FlutterFire firebase_messaging

使用插件io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin,这是我从Flutterfire GitHub 存储库中 发现的

目前在 firabase_messaging: 9.0.0

//
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundService;
// Be sure to import the exact Plugin
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
//
@Override
  public void onCreate() {
    super.onCreate();
    FlutterFirebaseMessagingBackgroundService.setPluginRegistrant(this);
    }
 @Override
  public void registerWith(PluginRegistry registry) {
     FlutterFirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
  }
}
Run Code Online (Sandbox Code Playgroud)