PluginRegistry tidak dapat dikonversi ke FlutterEngine

22

Segera setelah saya memperbarui flutter ke versi 1.12.13 saya menemukan masalah ini dan tidak dapat memperbaikinya. Saya lakukan ketika tutorial firebase_messaging mengirim dan mendapatkan kesalahan berikut: "error: jenis yang tidak kompatibel: PluginRegistry tidak dapat dikonversi ke FlutterEngine GeneratedPluginRegistrant.registerWith (registry);" Kode saya adalah sebagai berikut:

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
sumber
Saya mendapatkan kesalahan ini juga. solusi apa belum?
ajonno
Tidak. Saya sudah mencoba dan tidak bisa
Gabriel G. Pavan

Jawaban:

21

Diperbarui pada 31 Desember 2019.

Anda tidak boleh menggunakan alat perpesanan cloud Firebase untuk mengirim pemberitahuan, karena itu memaksa Anda untuk menggunakan judul dan isi.

Anda harus mengirim pemberitahuan tanpa judul dan isi. memiliki aplikasi di latar belakang, yang seharusnya bekerja untuk Anda.

Jika ini berhasil untuk Anda, saya akan sangat menghargai jika Anda dapat memberi saya suara untuk jawaban ini, terima kasih.


Saya telah menemukan solusi sementara. Saya tidak yakin ini adalah perbaikan terbaik tetapi plugin saya berfungsi seperti yang diharapkan dan saya berasumsi masalahnya harus dengan registri yang disediakan oleh io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService on line 164.

File AndroidManifest.xml saya:

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

Application.java saya

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

FirebaseCloudMessagingPluginRegistrant.java saya

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

Kirim Pemberitahuan di panah:

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

Saya menambahkan tunggu dengan durasi 5 detik sehingga Anda dapat meletakkan aplikasi di latar belakang dan memverifikasi bahwa pesan di latar belakang sedang berjalan

DomingoMG
sumber
Saya mencoba adalah solusi Anda tetapi saya tidak berhasil, di ONLAUNCH, ONRESUME dan ONMESSAGE muncul, hanya di ONBACKGROUND tidak. Saya meletakkan file FirebaseCloudMessagingPluginRegistrant.java di folder yang sama dengan Application.java, apakah itu benar? Saya harap tim Flutter akan menyelesaikan masalah ini segera. Pada saat itu saya harus menggunakan versi 1.9.1, meskipun saya sangat ingin menggunakan 1.12.13
Gabriel G. Pavan
Bisakah Anda membuat proyek dan memberi saya tautan di github Anda untuk saya unduh dan mencoba menjalankannya di proyek pengujian Firebase saya?
Gabriel G. Pavan
Saya telah memperbarui jawabannya, saya melewatkan fakta penting untuk ditambahkan.
DomingoMG
Saya meninggalkan struktur yang telah membantu saya mengirim pemberitahuan push dengan dart
DomingoMG
Ini berhasil. Tidak yakin mengapa, tapi ternyata berhasil. Semoga tim flutter memperbaikinya di rilis berikutnya
Avi
10

Port kode DomingoMG ke Kotlin dapat ditemukan di bawah. Diuji dan bekerja pada Maret 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
sumber
Hai, `` `Eksekusi gagal untuk tugas ': app: mergeDexDebug'. > Kegagalan terjadi saat menjalankan com.android.build.gradle.internal.tasks.Workers $ ActionFacade> com.android.builder.dexing.DexArchiveMergerException: Kesalahan saat menggabungkan arsip dex: Pelajari cara mengatasi masalah di developer.android.com / studio / build /… . Jenis program sudah ada: com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant `` `
Kamil
7

Ganti baris kode di bawah ini:

GeneratedPluginRegistrant.registerWith(registry);

dengan ini:

FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
mehrdad seyrafi
sumber
1
Berhasil ... hanya ingat untuk mengimpor kelas yang disebutkan. impor io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
zion
1

Selain jawaban DomingoMG, jangan lupa hapus

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

dari file mainaktivitas di bawah folder android. Jika tidak, Anda akan mendapatkan kesalahan.

Gerinda Sumbu
sumber
Tapi di mana saya bisa mendaftarkan MethodChannel saya sendiri, ketika saya akan menghapus configureFlutterEngine?
Kamil Svoboda
Menurut jawaban DomingoMG, FirebaseCloudMessagingPluginRegistrant.java sudah melakukan registrasi "registerWith ..." jadi itu sebabnya configureFlutterEngine tidak lagi diperlukan. Apakah itu menjawab pertanyaan Anda?
Axes Grinds
Saya memahami FirebaseCloudMessagingPluginRegistrant.java melakukan registrasi alih-alih configureFlutterEngine. Tetapi configureFlutterEngine adalah tempat di mana saya dapat mendaftarkan MethodChannel saya sendiri untuk memanggil API asli (silakan lihat "Menulis kode khusus platform khusus" di flutter.dev). Di mana saya bisa mendaftar MethodChannel ketika metode configureFlutterEngine dihapus?
Kamil Svoboda
Saya tidak punya pengalaman dengan menulis kode khusus platform. Maaf saya tidak bisa membantu dengan informasi itu. Saya harap Anda menemukan jawaban.
Axes Grinds
1

Saya menambahkan hanya kelas air sebagai tambahan dari langkah-langkah dalam paket Pesan Firebase dan telah terpecahkan:

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
sumber