PluginRegistry không thể được chuyển đổi thành FlutterEngine


22

Ngay sau khi tôi cập nhật bản rung lên phiên bản 1.12.13, tôi đã tìm thấy sự cố này và không thể khắc phục nó. Tôi đã làm như hướng dẫn firebase_messaging đã gửi và gặp lỗi sau: "error: loại không tương thích: PluginRegistry không thể được chuyển đổi thành FlutterEngine GeneratedPluginRegistrant.registerWith (registry);" Mã của tôi như sau:

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

tôi cũng nhận được lỗi này. Giải pháp nào chưa?
ajonno

Không. Tôi đã thử và không thể
Gabriel G. Pavan

Câu trả lời:


21

Cập nhật vào ngày 31 tháng 12 năm 2019.

Bạn không nên sử dụng công cụ nhắn tin đám mây Firebase để gửi thông báo, vì nó buộc bạn phải sử dụng tiêu đề và nội dung.

Bạn phải gửi một thông báo mà không có tiêu đề và cơ thể. có ứng dụng trong nền, điều đó sẽ làm việc cho bạn.

Nếu nó hiệu quả với bạn, tôi sẽ đánh giá cao nếu bạn có thể cho tôi một phiếu bầu cho câu trả lời này, cảm ơn bạn.


Tôi đã tìm thấy một giải pháp tạm thời. Tôi không chắc đây là cách khắc phục tốt nhất nhưng các plugin của tôi hoạt động như mong đợi và tôi cho rằng vấn đề phải xảy ra với đăng ký được cung cấp bởi io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService trên dòng 164.

Tệp AndroidManifest.xml của tôi:

<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 của tôi

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 của tôi

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

Gửi thông báo trong phi tiêu:

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

Tôi đã thêm một thời gian chờ với thời lượng 5 giây để bạn có thể đặt ứng dụng ở chế độ nền và xác minh rằng thông báo trong nền đang chạy


Tôi đã thử là giải pháp của bạn nhưng tôi đã không thành công, trong trạng thái ONLAUNCH, ONRESUME và ONMESSAGE xuất hiện, chỉ trên ONBACKGROUND thì không. Tôi đặt tệp FirebaseCloudMessagingPluginRegistrant.java vào cùng thư mục với Application.java, đúng không? Tôi hy vọng nhóm Flutter sẽ sớm giải quyết vấn đề này. Đến lúc đó tôi sẽ phải sử dụng phiên bản 1.9.1, mặc dù tôi muốn sử dụng 1.12.13 rất tệ
Gabriel G. Pavan

Bạn có thể tạo một dự án và cho tôi liên kết trên github của bạn để tôi tải xuống và thử chạy nó trong dự án thử nghiệm Firebase của tôi không?
Gabriel G. Pavan

Tôi đã cập nhật câu trả lời, tôi đã bỏ lỡ một thực tế quan trọng để thêm.
DomingoMG

Tôi để lại một cấu trúc đã giúp tôi gửi thông báo đẩy bằng phi tiêu
DomingoMG

Điều này đã làm việc. Không chắc tại sao, nhưng nó đã làm. Hy vọng nhóm rung động sẽ khắc phục điều này trong phiên bản tiếp theo
Avi

10

Một cổng mã của DomingoMG đến Kotlin có thể được tìm thấy bên dưới. Đã thử nghiệm và làm việc vào tháng 3 năm 2020.

pubspec.yaml

firebase_messaging: ^6.0.12

Ứng dụng.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
    }
  }
}

Xin chào, `` `Thi hành thất bại cho nhiệm vụ ': app: mergeDexDebug'. > Đã xảy ra lỗi khi thực thi com.android.build.gradle.iternal.t task.Workers $ ActionFacade> com.android.builder.dexing.DexArchiveMergerException: Lỗi trong khi hợp nhất kho lưu trữ dex: Tìm hiểu cách giải quyết vấn đề tại nhà phát triển dand / studio / xây dựng / đào . Loại chương trình đã có: com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant `` `
Kamil

7

Thay thế dòng mã dưới đây của bạn:

GeneratedPluginRegistrant.registerWith(registry);

Với cái này:

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

1
Nó hoạt động ... chỉ cần nhớ nhập các lớp được đề cập. nhập io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
zion

1

Ngoài câu trả lời của DomingoMG, đừng quên xóa

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

từ tập tin chính trong thư mục android. Nếu không, bạn sẽ nhận được một lỗi.


Nhưng nơi tôi có thể đăng ký Phương thức kênh của riêng mình, khi tôi sẽ gỡ bỏ configureFlutterEngine?
Kamil Svoboda

Theo câu trả lời của DomingoMG, FirebaseCloudMessagingPluginRegistrant.java đã đăng ký "registerWith ...", vì vậy đó là lý do tại sao configureFlutterEngine không còn cần thiết nữa. Câu trả lời đó có đáp ứng được câu hỏi của bạn không?
Rìu xay

Tôi hiểu FirebaseCloudMessagingPluginRegistrant.java thực hiện đăng ký thay vì configureFlutterEngine. Nhưng configureFlutterEngine là nơi tôi có thể đăng ký Phương thức kênh riêng của mình để gọi API gốc (vui lòng xem "Viết mã dành riêng cho nền tảng tùy chỉnh" trên flutter.dev). Tôi có thể đăng ký Phương thức kênh ở đâu khi phương thức configureFlutterEngine bị xóa?
Kamil Svoboda

Tôi không có bất kỳ kinh nghiệm nào với việc viết mã dành riêng cho nền tảng. Xin lỗi rằng tôi không thể giúp với thông tin đó. Tôi hy vọng bạn tìm thấy một câu trả lời.
Rìu nghiền

1

Tôi chỉ thêm lớp nước dưới dạng bổ sung từ các bước trong gói Nhắn tin Firebase và nó đã được giải quyết:

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;
}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.