2

我在将这个插件 (4.0.4+300) 集成到我现有的颤振应用程序中时遇到问题。在这段代码中初始化插件时,我总是收到以下错误:

TokenEventChannel.receiveBroadcastStream()
        .listen(_onTokenEvent, onError: _onTokenError);

在 com.huawei.flutter.push/token 频道上激活平台流时,抛出以下 MissingPluginException: MissingPluginException(No implementation for method listen on channel com.huawei.flutter.push/token)

I/flutter (7674): 当异常被抛出时,这是堆栈: I/flutter (7674): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:154:7) I/flutter (7674):I/flutter(7674):#1 MethodChannel.invokeMethod(包:flutter/src/services/platform_channel.dart:329:12)I/flutter(7674):#2 EventChannel.receiveBroadcastStream。(包:flutter/src/services/platform_channel.dart:519:29)I/flutter(7674):#3 EventChannel.receiveBroadcastStream。

我已按照本教程进行操作: https ://medium.com/huawei-developers/sending-push-notifications-on-flutter-with-huawei-push-kit-plugin-534787862b4d

我的应用程序已经包含了 FCM 推送通知服务,所以我不知道这是否有问题?我想在支持的设备上同时支持 FCM 和 Push Kit。

我将不胜感激解决此问题的任何帮助。

Flutter Doctor 输出如下: [✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.6 19G2021, locale en-ZA) • Flutter version 1.17.5 at /Users/user/Developer/flutter • Framework修订版 8af6b2f038(9 周前),2020-06-30 12:53:55 -0700 • 引擎修订版 ee76268252 • Dart 版本 2.8.4

[✓] Android 工具链 - 为 Android 设备开发(Android SDK 版本 29.0.3) • Android SDK 位于 /Users/user/Library/Android/sdk • 平台 android-30,构建工具 29.0.3 • ANDROID_HOME = /Users/ samuel/Library/Android/sdk • Java 二进制文件位于:/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java 版本 OpenJDK 运行时环境(内部版本 1.8.0_212-release-1586-b4 -5784211) • 接受所有Android 许可证。

[✓] Xcode - 为 iOS 和 macOS 开发 (Xcode 11.6) • Xcode 在 /Applications/Xcode.app/Contents/Developer • Xcode 11.6,构建版本 11E708 • CocoaPods 版本 1.9.2

[✓] Android Studio(版本 3.6) • Android Studio 位于 /Applications/Android Studio.app/Contents • Flutter 插件版本 45.1.1 • Dart 插件版本 192.8052 • Java 版本 OpenJDK 运行时环境(内部版本 1.8.0_212-release-1586- b4-5784211)

[✓] VS Code(版本 1.48.2) • /Applications/Visual Studio Code.app/Contents 中的 VS Code • Flutter 扩展版本 3.13.2

[✓] 连接设备(1 个可用) • 为 x86 64 构建的 Android SDK • emulator-5554 • android-x64 • Android 9 (API 28)(模拟器)

• 未发现任何问题!进程以退出代码 0 结束

我在 app/build.gradle 中的 Gradle 依赖项和插件:

dependencies {
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test:runner:1.1.1'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
        implementation 'com.google.firebase:firebase-core:17.4.4'
        implementation 'com.google.firebase:firebase-messaging:20.2.3'
        implementation 'com.google.firebase:firebase-analytics:17.4.4'
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    
    }
    
    apply plugin: 'io.fabric'
    apply plugin: 'com.google.gms.google-services'
    apply plugin: 'kotlin-android'
    apply plugin: 'com.huawei.agconnect'

在 android/build.gradle 中:

dependencies {
    // Example existing classpath
    classpath 'com.android.tools.build:gradle:3.5.3'
    // Add the google services classpath
    classpath 'com.google.gms:google-services:4.3.2'
    classpath 'io.fabric.tools:gradle:1.26.1'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    classpath 'com.huawei.agconnect:agcp:1.3.1.300'
}
4

1 回答 1

1

我们发现这个错误发生在使用 Android 嵌入 v1 的旧 Flutter 项目中。我们已经提供了一个修复程序,它将在下一个版本中发布。如果您的项目已经支持 v2 嵌入,请回复通知我们,我们可以进一步调查。感谢您指出这个问题。

要暂时解决此错误(在下一个版本之前),您必须将 Android Embedding v2 支持添加到您的项目中。我将步骤留给您遵循,这些有望解决您的问题。

  1. 如果您的 Flutter 项目尚未迁移,请将其迁移到 AndroidX。您可以按照Flutter 官方 AndroidX 迁移指南中的简单步骤进行操作。

  2. 将 Flutter Embedding v2 元数据添加到您的 AndroidManifest.xml 文件中 在您的 AndroidManifest 文件的 application 标签下添加以下 flutterEmbedding 元数据,如下所示

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.huawei.hms.flutter.push_example">
<application
android:name="io.flutter.app.FlutterApplication"
android:icon="@mipmap/ic_launcher"
android:label="HMS Push Demo">
<activity
<!— 
Other configurations 
-->
</activity>
<!— Add the meta-data below. For supporting Android v2 Embedding
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
  1. 编辑 MainActivity.java 转到<your_flutter_project>/android/app/src/java/your_package_name/MainActivity.java并编辑 MainActivity,如下所示。这里的关键部分是从 io.flutter.embedding.android.FlutterActivity 库中导入 FlutterActivity 类。
package <your_package_name>;
import io.flutter.embedding.android.FlutterActivity;

public class MainActivity extends FlutterActivity {}

在这些配置之后,您可以运行flutter clean并使flutter run您的项目支持 android v2 嵌入。运行命令后,Flutter 会自动创建新的 GeneratedPluginRegistrant.java 文件。

  1. 检查 GeneratedPluginRegistrant.java 文件以确保您使用 v2 嵌入。转到:<your_flutter_project>/android/app/src/java/io/flutter/plugins/GeneratedPluginRegistrant.java 并检查此文件以确保它与下面显示的类似。如果不相似,您可以编辑该文件如下或删除并运行flutter run命令Flutter自动重新生成它。(备份文件以防万一您要删除它)。
package io.flutter.plugins;

import androidx.annotation.Keep;
import androidx.annotation.NonNull;

import io.flutter.embedding.engine.FlutterEngine;

/**
* Generated file. Do not edit.
* This file is generated by the Flutter tool based on the
* plugins that support the Android platform.
*/
@Keep
public final class GeneratedPluginRegistrant {
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
flutterEngine.getPlugins().add(new com.huawei.hms.flutter.push.PushPlugin());
}
}

现在您已支持 Android Embedding v2,您应该能够从流中获取令牌。

于 2020-09-02T02:24:16.630 回答