我的Flutter应用程序使用Flutter SharedPreferences插件,并使用platform.invokeMethod将值发送到iOS端。如果我启动应用程序,我有这个错误:
[VERBOSE-2:dart_error.cc(16)] Unhandled exception:
MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)
#0 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:278:7)
<asynchronous suspension>
#1 SharedPreferences.getInstance (package:shared_preferences/shared_preferences.dart:25:27)
<asynchronous suspension>
#2 main (file:///Users/Developer/workspace/flutter-app/q_flutter2/lib/main.dart:25:53)
<asynchronous suspension>
#3 _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:279:19)
#4 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12)
如果我评论函数将值发送到iOS端,则不会显示错误,并且SharedPreferences正在运行。
有人可以帮助我吗?
答案 0 :(得分:25)
buildTypes
中的 /android/app/build.gradle
android {
compileSdkVersion 30
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
...
}
signingConfigs {
release {
...
}
}
buildTypes {
debug {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
// signingConfig signingConfigs.debug
signingConfig signingConfigs.release
minifyEnabled false
shrinkResources false
useProguard true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
android/app/proguard-rules.pro
:-keep class androidx.lifecycle.DefaultLifecycleObserver
MainActivity
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine) // add this line
}
}
答案 1 :(得分:9)
我以前有这个问题,这是我为解决此问题所做的事情:
flutter clean
flutter pub get
之后,从设备中删除调试应用。
答案 2 :(得分:9)
经过大量研究,我找到了答案。使用共享首选项之前,请将其添加到您的代码中。
SharedPreferences.setMockInitialValues({});
这是因为如果在没有任何内容的地方使用getAll,它将变得很疯狂。我认为这与iOS无关
答案 3 :(得分:9)
这也让我做了一个噩梦。
html_div(style=(backgroundColor=colors.background,))
我之前使用过 shared_prefs,但在我最近的项目中陷入了这个困境。社区将对此进行调查。
答案 4 :(得分:6)
对于安卓部分,你不应该使用
SharedPreferences.setMockInitialValues({});
因为它不会坚持您的偏好。
相反,将以下行添加到您的 app/proguard-rules.pro
:
-keep class androidx.lifecycle.DefaultLifecycleObserver
见https://github.com/flutter/flutter/issues/58479#issuecomment-734099445
答案 5 :(得分:5)
插件版本shared_preferences: ^0.5.12
添加SharedPreferences.setMockInitialValues({});
在Flutter App主要功能中的runApp()
函数之前
为我修复此错误
答案 6 :(得分:4)
就我而言,我删除了 pubspec.yaml 文件中的包“flutter_facebook_login: ^3.0.0”,然后它运行良好...
我已经尝试了上述所有解决方案,但没有比删除“flutter_facebook_login”包更好的解决方案了。
在上述一些解决方案中,MissingPluginException 可以修复,但 shared_preferences 的 get() 和 set() 无法正常工作。
请告诉我更好的解决方案。
答案 7 :(得分:3)
因此,在创建 flutter 后,创建了一个虚拟项目来测试“T”的解决方案 here,这对我不起作用。我终于通过更新 MainActivity.kt 文件解决了这个问题。
我的解决方案只是添加行 flutterEngine.getPlugins().add(SharedPreferencesPlugin())
这是完整的 MainActivity.kt 文件:
package com.example.begin.init_begin
import android.content.Context
import android.os.Bundle
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
flutterEngine.getPlugins().add(SharedPreferencesPlugin())
}
}
请注意:GeneratePluginRegistrant.java 已经进行了注册,但在我的情况下,如上所示添加它可以解决问题。
答案 8 :(得分:3)
将共享首选项添加到我的项目并在模拟器上运行后,遇到了同样的问题。以下步骤为我解决了这个问题:
答案 9 :(得分:2)
如果上述答案不起作用,这可能会有所帮助。 在创建android studio flutter项目时,我忘记选中包含对Android的kotlin支持/对iOS的swift支持的复选框。之所以如此,是因为在进行了整洁的运行之后,我的项目无法正常工作。
答案 10 :(得分:2)
随便用
classpath 'com.android.tools.build:gradle:3.5.1'
在您的 android/build.gradle
内
答案 11 :(得分:1)
遇到此问题并通过完全重新安装应用程序来解决
答案 12 :(得分:1)
运行flutter clean
在那之后
运行 flutter pub get
通常,如果您在调试时实现了共享首选项包,则可能会导致此问题,因此请尝试停止调试上述方法,它应该可以工作。
答案 13 :(得分:1)
未处理的异常:MissingPluginException(在通道 plugins.flutter.io/shared_preferences 上找不到方法 getAll 的实现
然后将此添加到 main.dart 文件的 main()
函数中
main(){
SharedPreferences.setMockInitialValues({});
...
}
这对我有用
答案 14 :(得分:1)
这个 main.dart 添加行
SharedPreferences.setMockInitialValues({});
我解决了
答案 15 :(得分:1)
在使用VS Code的调试模式下,我也遇到此错误。 我只是停下来,然后再次启动该应用程序(无需直接重新启动)。
运行>停止调试
运行>开始调试
答案 16 :(得分:1)
我收到了其中一个flutter软件包,并将该软件包升级到最新版本很有帮助。
答案 17 :(得分:1)
就我而言,重新安装该应用程序无效。
相反,转到AppDelegate.m
文件,路径为ios/runner/AppDelegate.m
:
#include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
@import Firebase;
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[FIRApp configure];
[GeneratedPluginRegistrant registerWithRegistry:self];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
然后从设备中删除您的应用程序,然后再次运行该应用程序。
答案 18 :(得分:0)
就我而言,我通过在 /android/app/build.gradle 中添加波纹管解决了这个问题
buildTypes {
release {
signingConfig signingConfigs.release
}
}
到
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
答案 19 :(得分:0)
当我尝试在 excel 文件中加载数据时,我也遇到了同样的问题。 按照上面的建议尝试了所有的东西。 但是当我在模拟器中安装 Microsoft excel 时,它立即解决了。
答案 20 :(得分:0)
检查AppDelegate。频道注册应在插件注册之后
...
@objc class AppDelegate: FlutterAppDelegate {
override func application(
...
GeneratedPluginRegistrant.register(with: self)
channel = FlutterMethodChannel.init(name: "dressme.lofesdev.com/geo",
binaryMessenger: controller);
...
答案 21 :(得分:0)
尝试了我能找到的所有方法,但没有一个奏效。当我看到带有 -2 的评论表明 flutter_fackbook_login 包是导致问题的原因时,我很不情愿。后来又发现 here 关于 flutter_fackbook_login 是问题所在。取出包裹后,它工作了!
答案 22 :(得分:0)
我在 Flutter Web 中遇到了这个问题。 我添加了代码,使用了“快速重启”并得到了这个错误。 停止并重新启动为我解决了问题。
答案 23 :(得分:0)
在我的解决方案中,我没有使用SharedPreferences.setMockInitialValues({});
正如其他人公平地说的那样,它应该用于测试(IDE也这样说),而不是用于生产应用程序。
所以我注意到Flutter说我的项目使用的是旧版flutter android嵌入式版本,因此我应该升级到v2。我是按照以下说明这样做的:https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects
此后,关于MissingPluginException
的错误消失了。因此,这似乎比调用test方法更好。我希望我能知道为什么,但是现在我只是没有时间在里面挖太多东西。无论如何,这是解决此问题的另一种方法。
答案 24 :(得分:0)
在渠道plugins.flutter.io上未找到方法getAll的实现 __上面的内容将在您首次安装插件时发生,因此必须重新安装...
卸载并重新安装您的应用程序。...
答案 25 :(得分:-1)
几天前我遇到了同样的问题,经过几天的谷歌搜索,我发现共享首选项不起作用的原因是我有一个没有正确配置的包“flutter_facebook_login”。因此,在 Facebook 之后的任何包都将不起作用,在这种情况下,“共享首选项”。
解决方案:确保您使用的每个包都已完全配置或删除导致问题的包。
答案 26 :(得分:-1)
AndroidManifest.xml
<activity
android:name="io.flutter.embedding.android.FlutterActivity">
</activity>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
正确标记这 2 个代码,因为我将 flutter 嵌入更改为 v2 发生了,所以我正确检查了这 2 个代码并消除了我的错误。