PluginRegistryをFlutterEngineに変換できません


22

フラッターをバージョン1.12.13にアップデートするとすぐにこの問題が見つかり、修正できません。私は、firebase_messagingチュートリアルが送信して次のエラーが発生したときに、「エラー:互換性のないタイプ:PluginRegistryをFlutterEngine GeneratedPluginRegistrant.registerWith(registry);に変換できません。

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>

私の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で通知を送信:

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.9.1を使用する必要がありますが、1.12.13をあまり使いたくありません
Gabriel G. Pavan

プロジェクトを作成して、ダウンロードしてFirebaseテストプロジェクトで実行するためのgithub上のリンクを教えていただけますか?
Gabriel G. Pavan

回答を更新しましたが、追加する重要な事実を逃しました。
DomingoMG 2019

私は、dartを使用してプッシュ通知を送信するのに役立つ構造を残しています
DomingoMG '31 / 12/54

これはうまくいきました。理由はわからないが、実際はそうだった。flutterチームが次のリリースでこれを修正することを願っています
Avi

10

DomingoMGのコードのKotlinへの移植は、以下にあります。テスト済みで、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:dexアーカイブのマージ中にエラーが発生しました:developer.android.comで問題を解決する方法をご覧ください/ studio / build /…。プログラムタイプはすでに存在しています:com.example.gf_demo.FirebaseCloudMessagingPluginRegistrant `` `
Kamil

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をどこに登録できますか?
Kamil Svoboda

DomingoMGの回答によると、FirebaseCloudMessagingPluginRegistrant.javaはすでに「registerWith ...」の登録を行っているため、configureFlutterEngineは不要になりました。それはあなたの質問に答えますか?
Axes Grinds

FirebaseCloudMessagingPluginRegistrant.javaがconfigureFlutterEngineの代わりに登録を行うことを理解しています。ただし、configureFlutterEngineは、ネイティブAPIを呼び出すために独自のMethodChannelを登録できる場所です(flutter.devの「カスタムプラットフォーム固有のコードの記述」を参照してください)。メソッドconfigureFlutterEngineが削除された場合、MethodChannelはどこに登録できますか?
Kamil Svoboda

プラットフォーム固有のコードを記述した経験はありません。その情報についてお役に立てず申し訳ありません。答えを見つけていただけたら幸いです。
Axes Grinds

1

Firebaseメッセージングパッケージの手順から余分なものとしてウォータークラスのみを追加し、解決しました:

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.