PluginRegistry kann nicht in FlutterEngine konvertiert werden

22

Sobald ich das Flattern auf Version 1.12.13 aktualisiert habe, habe ich dieses Problem gefunden und kann es nicht beheben. Ich habe als das Tutorial firebase_messaging gesendet und den folgenden Fehler erhalten: "Fehler: Inkompatible Typen: PluginRegistry kann nicht in FlutterEngine GeneratedPluginRegistrant.registerWith (Registrierung) konvertiert werden;" Mein Code lautet wie folgt:

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
quelle
Ich bekomme diesen Fehler auch. Noch eine Lösung?
Ajonno
Ich habe es versucht und konnte es nicht
Gabriel G. Pavan

Antworten:

21

Aktualisiert am 31. Dezember 2019.

Sie sollten das Firebase Cloud Messaging-Tool nicht zum Senden von Benachrichtigungen verwenden, da Sie gezwungen sind, Titel und Text zu verwenden.

Sie müssen eine Benachrichtigung ohne Titel und Text senden. Habe die Anwendung im Hintergrund, die für dich funktionieren sollte.

Wenn es für Sie funktioniert, würde ich es begrüßen, wenn Sie mir über diese Antwort abstimmen könnten, danke.


Ich habe eine vorübergehende Lösung gefunden. Ich bin nicht sicher, ob dies die beste Lösung ist, aber meine Plugins funktionieren wie erwartet und ich gehe davon aus, dass das Problem bei der Registrierung von io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService in Zeile 164 liegen muss.

Meine AndroidManifest.xml-Datei:

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

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

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

Benachrichtigung in Dart senden:

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

Ich habe eine Wartezeit von 5 Sekunden hinzugefügt, damit Sie die Anwendung in den Hintergrund stellen und überprüfen können, ob die Nachricht im Hintergrund ausgeführt wird

DomingoMG
quelle
Ich habe versucht, ist Ihre Lösung, aber ich war erfolglos, in den Zuständen ONLAUNCH, ONRESUME und ONMESSAGE erschienen, nur auf ONBACKGROUND nicht. Ich habe die Datei FirebaseCloudMessagingPluginRegistrant.java im selben Ordner wie Application.java abgelegt. War das richtig? Ich hoffe, das Flutter-Team wird dieses Problem bald lösen. Bis dahin muss ich Version 1.9.1 verwenden, obwohl ich 1.12.13 so schlecht verwenden möchte
Gabriel G. Pavan
Könnten Sie ein Projekt erstellen und mir den Link auf Ihrem Github geben, damit ich es herunterladen und versuchen kann, es in meinem Firebase-Testprojekt auszuführen?
Gabriel G. Pavan
Ich habe die Antwort aktualisiert und eine wichtige Tatsache übersehen.
DomingoMG
Ich verlasse eine Struktur, die mir geholfen hat, Push-Benachrichtigungen mit Dart zu senden
DomingoMG
Das hat funktioniert. Ich weiß nicht warum, aber es tat es. Hoffe, das Flatterteam behebt dies in der nächsten Version
Avi
10

Eine Portierung des DomingoMG-Codes für Kotlin finden Sie unten. Getestet und im März 2020 arbeitend.

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
quelle
Hallo, `` `Ausführung für Aufgabe fehlgeschlagen ': app: mergeDexDebug'. > Ist ein Fehler aufgetreten , während com.android.build.gradle.internal.tasks.Workers $ ActionFacade> com.android.builder.dexing.DexArchiveMergerException Ausführung: Fehler beim dex Archive verschmelzenden: Erfahren Sie, wie das Problem zu lösen developer.android.com / studio / build /… . Programmtyp bereits vorhanden: com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant `` `
Kamil
7

Ersetzen Sie Ihre folgende Codezeile:

GeneratedPluginRegistrant.registerWith(registry);

mit diesem:

FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
mehrdad seyrafi
quelle
1
Es hat funktioniert ... denken Sie daran, die erwähnte Klasse zu importieren. import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
Zion
1

Vergessen Sie nicht, zusätzlich zur Antwort von DomingoMG zu entfernen

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

aus der Hauptaktivitätsdatei unter dem Android-Ordner. Wenn nicht, erhalten Sie eine Fehlermeldung.

Achsen schleift
quelle
Aber wo kann ich meinen eigenen MethodChannel registrieren, wenn ich configureFlutterEngine entferne?
Kamil Svoboda
Laut der Antwort von DomingoMG führt FirebaseCloudMessagingPluginRegistrant.java bereits die Registrierung von "registerWith ..." durch, weshalb configureFlutterEngine nicht mehr benötigt wird. Beantwortet das deine Frage?
Axes Grinds
Ich verstehe, dass FirebaseCloudMessagingPluginRegistrant.java die Registrierung anstelle von configureFlutterEngine durchführt. In configureFlutterEngine kann ich jedoch meinen eigenen MethodChannel registrieren, um die native API aufzurufen (siehe "Schreiben von benutzerdefiniertem plattformspezifischem Code" auf flutter.dev). Wo kann ich MethodChannel registrieren, wenn die Methode configureFlutterEngine entfernt wird?
Kamil Svoboda
Ich habe keine Erfahrung mit dem Schreiben von plattformspezifischem Code. Entschuldigung, dass ich mit diesen Informationen nicht helfen kann. Ich hoffe du hast eine Antwort gefunden.
Axes Grinds
1

Ich habe nur Wasserklasse als Extra aus den Schritten im Firebase Messaging-Paket hinzugefügt und es wurde gelöst:

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
quelle