PluginRegistry को FlutterEngine में नहीं बदला जा सकता है


22

जैसे ही मैंने स्पंदन को संस्करण १.१२.१३ में अद्यतन किया, मुझे यह समस्या मिली और इसे ठीक नहीं किया जा सका। मैंने फायरबेस_मेसिंग ट्यूटोरियल के रूप में भेजा और निम्न त्रुटि मिली: "त्रुटि: असंगत प्रकार: प्लगइन्जेंसी को फ़्लटरबिजाइन जेनरेट किए गएPluginRegistrant.registerWith (रजिस्ट्री) में परिवर्तित नहीं किया जा सकता है;" मेरा कोड इस प्रकार है:

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 यह त्रुटि भी हो रही है। अभी तक कोई समाधान?
अंजन्नो

नहीं, मैंने कोशिश की और नहीं कर सका
गेब्रियल जी। पवन

जवाबों:


21

31 दिसंबर 2019 को अपडेट किया गया।

नोटिफिकेशन भेजने के लिए आपको फायरबेस क्लाउड मैसेजिंग टूल का उपयोग नहीं करना चाहिए, क्योंकि यह आपको शीर्षक और बॉडी का उपयोग करने के लिए मजबूर करता है।

आपको शीर्षक और निकाय के बिना एक अधिसूचना भेजनी होगी। पृष्ठभूमि में एप्लिकेशन है, जो आपके लिए काम करना चाहिए।

यदि यह आपके लिए काम करता है, तो मैं इसकी सराहना करूंगा यदि आप मुझे इस उत्तर पर वोट दे सकते हैं, तो धन्यवाद।


मुझे एक अस्थायी समाधान मिल गया है। मुझे यकीन नहीं है कि यह सबसे अच्छा फिक्स है, लेकिन मेरे प्लगइन्स उम्मीद के मुताबिक काम करते हैं और मुझे लगता है कि समस्या को 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>

मेरा आवेदन .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);
  }
}

मेरा फायरबेसक्लाउमेसिंगप्लगिनरिनजिस्टेंट.जवा

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

डार्ट में अधिसूचना भेजें:

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

मैंने 5 सेकंड की अवधि के साथ प्रतीक्षा को जोड़ा ताकि आप एप्लिकेशन को पृष्ठभूमि में रख सकें और सत्यापित कर सकें कि पृष्ठभूमि में संदेश चल रहा है


मैंने कोशिश की कि आपका समाधान हो, लेकिन मैं असफल था, ONLAUNCH, ONRESUME और ONMESSAGE राज्यों में दिखाई दिया, केवल ONBACKGROUND पर नहीं। मैंने फ़ाइल FirebaseCloudMessagingPluginRegistrant.java को एक ही फ़ोल्डर में Application.java के रूप में रखा, क्या यह सही था? मुझे उम्मीद है कि फ़्लटर टीम जल्द ही इस समस्या का समाधान करेगी। तब तक मुझे संस्करण 1.9.1 का उपयोग करना होगा, हालांकि मैं 1.12.13 को इतनी बुरी तरह से उपयोग करना चाहता हूं
गेब्रियल जी। पवन

क्या आप एक प्रोजेक्ट बना सकते हैं और मुझे अपने फायरबस टेस्ट प्रोजेक्ट पर डाउनलोड करने और इसे चलाने का प्रयास करने के लिए अपने गिथब पर लिंक दे सकते हैं?
गेब्रियल जी। पवन

मैंने उत्तर को अपडेट कर दिया है, मुझे जोड़ने के लिए एक महत्वपूर्ण तथ्य याद आया।
डोमिंगोएमजीएम

मैं एक संरचना छोड़ता हूं जिसने मुझे डार्ट के साथ पुश नोटिफिकेशन भेजने में मदद की है
डोमिंगोएमजीएम

यह काम किया। यकीन नहीं क्यों, लेकिन यह किया था। आशा है कि स्पंदन टीम अगले रिलीज में इसे ठीक कर लेगी
एवी

10

डोमिंगोएमजी के कोड कोटलिन का एक पोर्ट नीचे पाया जा सकता है। परीक्षण किया और मार्च, 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
    }
  }
}

नमस्ते, `` `कार्य के लिए निष्पादन विफल ': ऐप: मर्जडेक्सडेबग'। Com.android.build.gradle.internal.tasks.Workers $ ActionFacade> com.android.builder.dexing.DexArchiveMergerException: निष्पादित करते समय एक विफलता हुई: de-Archives विलय करते समय त्रुटि: जानें कि कैसे इस समस्या को हल करना है developer.android.com पर। / स्टूडियो / बिल्ड /… । प्रोग्राम प्रकार पहले से ही मौजूद है: com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant `` `
Kamil

7

अपनी नीचे दी गई कोड लाइन बदलें:

GeneratedPluginRegistrant.registerWith(registry);

इसके साथ:

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

1
यह काम किया ... बस उल्लेख किया गया वर्ग आयात करना याद रखें। आयात io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
सिय्योन

1

डोमिंगोएमजी के उत्तर के अलावा, हटाना न भूलें

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

एंड्रॉइड फ़ोल्डर के तहत मुख्यता फ़ाइल से। यदि नहीं, तो आपको एक त्रुटि मिलेगी।


लेकिन मैं अपना खुद का MethodChannel कहाँ पंजीकृत कर सकता हूँ, जब मैं configFlutterEngine को हटा दूँगा?
कामिल स्वोबोदा

डोमिंगोएमजी के उत्तर के अनुसार, FirebaseCloudMessagingPluginRegistrant.java पहले से ही "registerWith ..." का पंजीकरण करता है, इसीलिए configFlutterEngine की अब आवश्यकता नहीं है। क्या वह आपके सवाल का जवाब है?
एक्सिस ग्राइंड

मैं समझता हूं कि FirebaseCloudMessagingPluginRegistrant.java configFlubEngine के बजाय पंजीकरण करता है। लेकिन configFlutterEngine वह जगह है जहां मैं अपनी एपीआई एपीआई कॉल करने के लिए अपना खुद का MethodChannel पंजीकृत कर सकता हूं (कृपया flutter.dev पर "कस्टम प्लेटफ़ॉर्म-विशिष्ट कोड लिखना") देखें। जब विधि कॉन्फ़िगर किया जाता है तो मैं विधिचैनलाइन को कहां पंजीकृत कर सकता हूं?
कामिल स्वोबोदा

मुझे प्लेटफ़ॉर्म-विशिष्ट कोड लिखने का कोई अनुभव नहीं है। क्षमा करें कि मैं उस जानकारी के साथ मदद नहीं कर सकता। मुझे आशा है कि आपको उत्तर मिल गया होगा।
एक्सिस ग्राइंड

1

मैंने फायरबेस मैसेजिंग पैकेज में चरणों से अतिरिक्त रूप में केवल जल वर्ग जोड़ा और इसे हल किया गया:

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;
}}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.