PluginRegistry ne peut pas être converti en FlutterEngine

22

Dès que j'ai mis à jour le flottement vers la version 1.12.13, j'ai trouvé ce problème et je ne peux pas le résoudre. J'ai fait comme le tutoriel firebase_messaging envoyé et j'ai obtenu l'erreur suivante: "erreur: types incompatibles: PluginRegistry ne peut pas être converti en FlutterEngine GeneratedPluginRegistrant.registerWith (registre);" Mon code est le suivant:

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);
  }
}
Gabriel G. Pavan
la source
im obtenir cette erreur aussi. une solution encore?
ajonno
Non, j'ai essayé et je n'ai pas pu
Gabriel G. Pavan

Réponses:

21

Mis à jour le 31 décembre 2019.

Vous ne devez pas utiliser l'outil de messagerie cloud Firebase pour envoyer des notifications, car il vous oblige à utiliser le titre et le corps.

Vous devez envoyer une notification sans le titre et le corps. avoir l'application en arrière-plan, cela devrait fonctionner pour vous.

Si cela fonctionne pour vous, je vous serais reconnaissant de bien vouloir me donner un vote sur cette réponse, merci.


J'ai trouvé une solution temporaire. Je ne suis pas sûr que ce soit la meilleure solution mais mes plugins fonctionnent comme prévu et je suppose que le problème doit être avec le registre fourni par io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService sur la ligne 164.

Mon fichier 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>

My Application.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);
  }
}

My 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;
  }
}

Envoyer une notification dans 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
     },
    ),
  );
  });  
}

J'ai ajouté une attente d'une durée de 5 secondes pour que vous puissiez mettre l'application en arrière-plan et vérifier que le message en arrière-plan est en cours d'exécution

DomingoMG
la source
J'ai essayé est votre solution mais j'ai échoué, dans les états ONLAUNCH, ONRESUME et ONMESSAGE, uniquement sur ONBACKGROUND non. J'ai placé le fichier FirebaseCloudMessagingPluginRegistrant.java dans le même dossier que Application.java, était-ce vrai? J'espère que l'équipe Flutter résoudra bientôt ce problème. D'ici là, je devrai utiliser la version 1.9.1, bien que je veuille utiliser 1.12.13 si mal
Gabriel G. Pavan
Pourriez-vous créer un projet et me donner le lien sur votre github pour que je puisse le télécharger et essayer de l'exécuter sur mon projet de test Firebase?
Gabriel G. Pavan,
J'ai mis à jour la réponse, j'ai raté un fait important à ajouter.
DomingoMG
Je laisse une structure qui m'a aidé à envoyer des notifications push avec fléchette
DomingoMG
Cela a fonctionné. Je ne sais pas pourquoi, mais ça l'a fait. J'espère que l'équipe de flutter corrige cela dans la prochaine version
Avi
10

Un port du code de DomingoMG vers Kotlin peut être trouvé ci-dessous. Testé et fonctionnel en mars 2020.

pubspec.yaml

firebase_messaging: ^6.0.12

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)
  }
}

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
    }
  }
}
Vinicius Zani
la source
Salut, `` L'exécution a échoué pour la tâche ': app: mergeDexDebug'. > Une erreur s'est produite lors de l'exécution de com.android.build.gradle.internal.tasks.Workers $ ActionFacade> com.android.builder.dexing.DexArchiveMergerException: erreur lors de la fusion des archives dex: découvrez comment résoudre le problème sur developer.android.com / studio / build /… . Type de programme déjà présent: com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant ``
Kamil
7

Remplacez votre ligne de code ci-dessous:

GeneratedPluginRegistrant.registerWith(registry);

avec ça:

FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
mehrdad seyrafi
la source
1
Cela a fonctionné ... n'oubliez pas d'importer la classe mentionnée. import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
zion
1

En plus de la réponse de DomingoMG, n'oubliez pas de supprimer

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);

à partir du fichier d'activité principal sous le dossier android. Sinon, vous obtiendrez une erreur.

Axes Grinds
la source
Mais où puis-je enregistrer mon propre MethodChannel, quand je supprimerai configureFlutterEngine?
Kamil Svoboda
Selon la réponse de DomingoMG, FirebaseCloudMessagingPluginRegistrant.java enregistre déjà "registerWith ...", c'est pourquoi configureFlutterEngine n'est plus nécessaire. Est-ce que ça répond à votre question?
Axes Grinds
Je comprends que FirebaseCloudMessagingPluginRegistrant.java effectue l'enregistrement au lieu de configureFlutterEngine. Mais configureFlutterEngine est un endroit où je peux enregistrer mon propre MethodChannel pour appeler une API native (veuillez voir "Écrire un code spécifique à une plate-forme personnalisée" sur flutter.dev). Où puis-je enregistrer MethodChannel lorsque la méthode configureFlutterEngine est supprimée?
Kamil Svoboda
Je n'ai aucune expérience avec l'écriture de code spécifique à la plate-forme. Désolé de ne pas pouvoir vous aider avec ces informations. J'espère que vous avez trouvé une réponse.
Axes Grinds
1

J'ai ajouté uniquement la classe d'eau en plus des étapes du package de messagerie Firebase et cela a été résolu:

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;
}}
ctnr
la source