PluginRegistry, FlutterEngine'e dönüştürülemiyor


22

Çırpınmayı sürüm 1.12.13'e güncellediğimde bu sorunu buldum ve düzeltemiyorum. Firebase_messaging öğretici gönderdi ve aşağıdaki hatayı aldım: "hata: uyumsuz türleri: PluginRegistry FlutterEngine GeneratedPluginRegistrant.registerWith (kayıt defteri) dönüştürülemez;" Kodum aşağıdaki gibidir:

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

im de bu hatayı alıyorum. henüz herhangi bir çözüm?
ajonno

Hayır. Denedim ve yapamadım
Gabriel G. Pavan

Yanıtlar:


21

31 Aralık 2019'da güncellendi.

Firebase bulut mesajlaşma aracını bildirimleri göndermek için kullanmamalısınız, çünkü sizi başlığı ve gövdeyi kullanmaya zorlar.

Başlık ve gövde olmadan bir bildirim göndermelisiniz. sizin için çalışması gereken arka planda uygulama var.

Eğer sizin için işe yararsa, bana bu cevaba oy vermenizden memnun olurum, teşekkür ederim.


Geçici bir çözüm buldum. Bu en iyi düzeltme olduğundan emin değilim ama benim eklentiler beklendiği gibi çalışır ve sorunun satır 164 io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService tarafından sağlanan kayıt defteri ile olması gerektiğini varsayalım.

AndroidManifest.xml dosyam:

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

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

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

Dart içinde bildirim gönder:

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

Uygulamayı arka plana yerleştirip arka plandaki iletinin çalıştığını doğrulayabilmeniz için 5 saniyelik bir bekleme süresi ekledim


Denedim senin çözüm ama başarısız oldum, ONLAUNCH, ONRESUME ve ONMESSAGE durumlarda ortaya, sadece ONBACKGROUND değil. FirebaseCloudMessagingPluginRegistrant.java dosyasını Application.java ile aynı klasöre koydum, değil mi? Umarım Flutter ekibi bu sorunu yakında çözer. O zamana kadar 1,12.13'ü çok kötü kullanmak istememe rağmen 1.9.1 sürümünü kullanmam gerekecek
Gabriel G. Pavan

Bir proje oluşturabilir ve Firebase test projemde indirip çalıştırmaya çalışabilmem için bana github'ınızdaki bağlantıyı verebilir misiniz?
Gabriel G. Pavan

Cevabı güncelledim, eklemek için önemli bir gerçeği kaçırdım.
DomingoMG

Dart ile push bildirimleri göndermeme yardımcı olan bir yapı
bıraktım

Bu işe yaradı. Neden olduğundan emin değilim ama oldu. Çarpıntı ekibinin bir sonraki sürümde bunu düzeltmesini umuyoruz
Avi

10

DomingoMG'nin Kotlin kodunun bir limanı aşağıda bulunabilir. Test edildi ve Mart 2020'de çalışıyor.

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

Merhaba, `` Yürütme görev için başarısız oldu '': app: mergeDexDebug. > Com.android.build.gradle.internal.tasks.Workers $ ActionFacade çalıştırılırken bir hata oluştu> com.android.builder.dexing.DexArchiveMergerException: Dex arşivlerini birleştirirken hata oluştu: Sorunu developer.android.com adresinde nasıl çözeceğinizi öğrenin / studio / build /… . Program türü zaten mevcut: com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant ``
Kamil

7

Aşağıdaki kod satırınızı değiştirin:

GeneratedPluginRegistrant.registerWith(registry);

Bununla:

FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));

1
İşe yaradı ... sadece söz konusu sınıfı almayı unutmayın. import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
zion

1

DomingoMG'nin cevabına ek olarak, kaldırmayı da unutmayın

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

android klasörü altındaki anaaktivite dosyasından. Değilse, bir hata alırsınız.


Ama nerede configureFlutterEngine kaldıracağım, kendi MethodChannel kaydedebilirsiniz?
Kamil Svoboda

DomingoMG'nin cevabına göre, FirebaseCloudMessagingPluginRegistrant.java "registerWith ..." kaydını zaten yapıyor, bu yüzden configureFlutterEngine artık gerekli değil. senin sorunun cevabı bu mu?
Axes Grinds

FirebaseCloudMessagingPluginRegistrant.java, configureFlutterEngine yerine kayıt yaptığını anlıyorum. ConfigureFlutterEngine yerel API çağırmak için kendi MethodChannel kaydedebilirsiniz yeridir (flutter.dev "Özel platforma özel kod yazma" bakınız). ConfigureFlutterEngine yöntemi kaldırıldığında MethodChannel'i nereye kaydedebilirim?
Kamil Svoboda

Platforma özel kod yazma konusunda deneyimim yok. Üzgünüm, bu bilgilere yardım edemem. Umarım bir cevap bulmuşsundur.
Axes Grinds

1

Firebase Messaging paketindeki adımlardan sadece su sınıfı ekledim ve çözüldü:

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;
}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.