我在将此插件 (4.0.4+300) 集成到我现有的 flutter 应用程序中时遇到问题。在这段代码中初始化插件时,我总是收到以下错误:
TokenEventChannel.receiveBroadcastStream()
.listen(_onTokenEvent, onError: _onTokenError);
在 channel 上激活平台流时抛出以下 MissingPluginException com.huawei.flutter.push/token: MissingPluginException(没有找到方法监听 channel 的实现 com.huawei.flutter.push/token)
I/flutter (7674): 抛出异常时,这是堆栈: I/flutter (7674): #0 MethodChannel._invokeMethod (包:flutter/src/services/platform_channel.dart:154:7) 我/flutter (7674): I/flutter (7674): #1 MethodChannel.invokeMethod (包:flutter/src/services/platform_channel.dart:329:12) 我/flutter (7674):#2 EventChannel.receiveBroadcastStream。 (包:flutter/src/services/platform_channel.dart:519:29) 我/flutter (7674):#3 EventChannel.receiveBroadcastStream。
我的应用程序已经包含 FCM 推送通知服务,所以我不知道这是否会出现问题?我希望在受支持的设备上同时支持 FCM 和 Push Kit。
如果您能帮助解决此问题,我将不胜感激。
Flutter doctor 输出如下: [✓] Flutter( channel 稳定,v1.17.5,在 Mac OS X 10.15.6 19G2021 上,区域设置 en-ZA) • Flutter 版本 1.17.5,位于/Users/user/Developer/flutter • 框架修订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) • VS Code 位于/Applications/Visual Studio Code.app/Contents • 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'
}
最佳答案
我们发现此错误发生在使用 Android 嵌入 v1 的较旧 Flutter 项目上。我们已经提供了修复程序,并将在下一个版本中提供。如果您的项目已经支持 v2 Embedding,请回复告知我们,我们可以进一步调查。感谢您指出这个问题。
要暂时解决此错误(在下一个版本之前),您必须将 Android Embedding v2 支持添加到您的项目中。我留下了一些步骤供您遵循,希望这些步骤能够解决您的问题。
如果您的 Flutter 项目尚未迁移,请将其迁移到 AndroidX。您可以按照 The official AndroidX migration guide for Flutter. 中的简单步骤操作
将 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>
- 编辑MainActivity.java
转到
/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文件。
- 检查 generatedPluginRegistrant.java 文件以确保您使用 v2 嵌入。
转到:
/android/app/src/java/io/flutter/plugins/GeneeratedPluginRegistrant.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,并且您应该能够从流中获取 token 。
关于android - 将HMS Pushkit和FCM集成到Flutter应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63684721/