PluginRegistry를 FlutterEngine으로 변환 할 수 없습니다


22

flutter를 버전 1.12.13으로 업데이트하자마자이 문제를 발견하여 해결할 수 없습니다. firebase_messaging 튜토리얼을 보냈고 다음과 같은 오류가 발생했습니다. "오류 : 호환되지 않는 유형 : PluginRegistry를 FlutterEngine GeneratedPluginRegistrant.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);
  }
}

이 오류가 발생합니다. 아직 어떤 솔루션?
ajonno

아뇨 시도 할 수 없습니다
가브리엘 G. 파반에게

답변:


21

2019 년 12 월 31 일에 업데이트되었습니다.

제목과 본문을 사용하도록 강제하기 때문에 Firebase 클라우드 메시징 도구를 사용하여 알림을 보내면 안됩니다.

제목과 본문없이 알림을 보내야합니다. 백그라운드에서 응용 프로그램을 사용하면 효과가 있습니다.

그것이 당신에게 효과가 있다면, 당신이 저 에게이 답변에 대한 투표권을 줄 수 있다면 감사하겠습니다. 감사합니다.


임시 해결책을 찾았습니다. 이것이 최선의 해결책인지 잘 모르겠지만 플러그인이 예상대로 작동하며 문제는 164 행의 io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService가 제공하는 레지스트리와 관련이 있다고 가정합니다.

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

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

다트에 알림 보내기 :

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와 같은 폴더에 넣었습니다. Flutter 팀이이 문제를 곧 해결할 수 있기를 바랍니다. 그때까지 1.12.13을 너무 나쁘게 사용하고 싶지만 버전 1.9.1을 사용해야합니다.
Gabriel G. Pavan

Firebase 테스트 프로젝트에서 프로젝트를 다운로드하고 실행하기 위해 프로젝트를 생성하고 github에 링크를 제공 할 수 있습니까?
Gabriel G. Pavan

나는 대답을 업데이트했고, 추가해야 할 중요한 사실을 놓쳤다.
DomingoMG

다트와 함께 푸시 알림을 보내는 데 도움이되는 구조를
남겼습니다

이것은 효과가 있었다. 이유는 확실하지 않지만 그랬습니다. flutter 팀이 다음 릴리스에서이 문제를 해결하기를 바랍니다.
Avi

10

Kotlin에 대한 DomingoMG 코드 포트는 아래에서 확인할 수 있습니다. 2020 년 3 월 테스트 및 작업

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

안녕하세요,```태스크 ': app : mergeDexDebug'에 대한 실행이 실패했습니다. > com.android.build.gradle.internal.tasks.Workers $ ActionFacade 실행 중 실패가 발생했습니다.> com.android.builder.dexing.DexArchiveMergerException : 덱스 아카이브 병합 중 오류 : developer.android.com 에서 문제를 해결하는 방법 알아보기 / 스튜디오 / 구축 / ... . 프로그램 유형 이미 존재 : com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant```
카밀

7

아래 코드 줄을 바꾸십시오.

GeneratedPluginRegistrant.registerWith(registry);

이것으로 :

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

1
그것은 작동했습니다 ... 언급 한 클래스를 가져 오는 것을 잊지 마십시오. import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
시온

1

DomingoMG의 답변 외에도 제거하는 것을 잊지 마십시오

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

android 폴더 아래의 mainactivity 파일에서. 그렇지 않으면 오류가 발생합니다.


그러나 configureFlutterEngine을 제거 할 때 자체 MethodChannel을 등록 할 수있는 곳은 어디입니까?
카밀 스보보다

DomingoMG의 답변에 따르면 FirebaseCloudMessagingPluginRegistrant.java는 이미 "registerWith ..."등록을 수행하므로 configureFlutterEngine이 더 이상 필요하지 않습니다. 그 질문에 대답합니까?
Axes Grinds

FirebaseCloudMessagingPluginRegistrant.java가 configureFlutterEngine 대신 등록을 수행한다는 것을 알고 있습니다. 그러나 configureFlutterEngine은 고유 API를 호출하기 위해 자체 MethodChannel을 등록 할 수있는 위치입니다 (flutter.dev의 "사용자 정의 플랫폼 별 코드 작성"참조). configureFlutterEngine 메소드가 제거 될 때 MethodChannel을 어디에 등록 할 수 있습니까?
Kamil Svoboda

플랫폼 별 코드 작성 경험이 없습니다. 해당 정보를 도와 드릴 수 없습니다. 답을 찾았 으면 좋겠습니다.
도끼

1

Firebase Messaging 패키지의 단계에서 추가로 water class 만 추가했으며 해결되었습니다.

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;
}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.