扑动: 未处理的异常: MissingPluginException (在通道 plugins.Flutter.io/shared_preferences 上没有找到 getAll 方法的实现)

我的 Flutter 应用程序使用 Flutter SharedPreferences 插件,并通过 platform.invkeMethod 将值发送到 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 正在工作。

有人能帮我吗?

123932 次浏览

检查 AppGenerate。频道注册应该在插件注册之后

...
@objc class AppDelegate: FlutterAppDelegate {


override func application(
...
GeneratedPluginRegistrant.register(with: self)
channel = FlutterMethodChannel.init(name: "dressme.lofesdev.com/geo",
binaryMessenger: controller);
...

在通道 plugins.flutter.io上找不到方法 getAll的实现。

当你第一次安装这个插件的时候会发生上述情况,所以必须重新安装。

因此,卸载并重新安装应用程序。

In my case, reinstalling the application didn't work.

相反,转到 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

Then delete your application from the device then run the application again.

如果上述答案不起作用,也许这会有所帮助。 在创建 android 工作室 flutter 项目时,我忘了检查包含 kotlin 对 android 的支持/对 iOS 的快速支持。之所以这样,是因为在颤振干净和颤振运行后,我的项目没有工作。

在将共享首选项添加到项目并在模拟器上运行之后,也出现了同样的问题。下面的步骤为我解决了这个问题:

  1. 运行‘ flutter clean’
  2. 运行’扑腾酒吧得到’
  3. 从模拟器中删除应用程序

我以前也遇到过这个问题,现在我要做的就是解决这个问题:

  1. 运行 flutter clean
  2. 运行 flutter pub get

after that delete your debug app from the device.

在做了大量研究之后,我找到了答案。在使用共享首选项之前,请将这些内容添加到代码中。

SharedPreferences.setMockInitialValues({});

It is because if you use getAll where there is nothing, it will go crazy. I don't think it is anything to do with iOS. If you even use normal getString, the internal program uses getAll so it will still crash

剪辑

I have been receiving a lot of comments on how it does not persist data b/w sessions. What you can do to fix that is put it in a try and catch statement. In try, call sharedPreferences.get and catch the error and then do setMockInitialValues. If sharedPreferences.get does not give an error, it means there is already data and no need to set mock values replacing the old ones.

I am not sure if that will work so if anyone tries it and it helps in persisting data, let me know so that I can validate it for others

EDIT 2

多亏了 Edwin Nyawoli,我现在知道为什么它不在会话之间持久化数据了。虽然我的方案只是暂时的,不是真正的解决方案,但它仍然可能有所帮助。如果有人能够帮助我在我的新设备上重现这个问题,我可以尝试找出一个新的解决方案。请让我知道,如果你愿意上传你的项目到 github,以便我可以重新创建它。现在,我做了更多的研究,相信这会对你有所帮助:-

在/android/app/build.gradle 中

buildTypes {
release {
signingConfig signingConfigs.release


minifyEnabled true
useProguard true


proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

变成

buildTypes {
release {
signingConfig signingConfigs.release


minifyEnabled true
useProguard true


proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

这个答案不是我的,它来自于对一个 github 问题的评论 Https://github.com/flutter/flutter/issues/65334#issuecomment-760270219

我收到这个问题的颤动软件包之一和升级软件包的最新版本有所帮助。

我在使用 VS 代码的调试模式中也出现了这个错误。 我只是停止,然后再次启动应用程序(没有直接重新启动)。

运行 > 停止调试

运行 > 开始调试

在我的解决方案中,我没有使用 SharedPreferences.setMockInitialValues({}); 正如其他人公平地说,它应该用于测试(IDE 也是这样说的) ,但不是用于生产应用程序。 So I noticed that Flutter says that my project uses old flutter android embedded version and I should upgrade to v2. And I did so, using this instruction: https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects

此后,关于 MissingPluginException的错误消失了。因此,与调用方法进行测试相比,这似乎是一个更好的解决方案。我希望我能知道为什么,但是现在我没有时间深究。不管怎样,这是解决这个问题的另一个办法。

对于机器人零件,你使用 不应该

SharedPreferences.setMockInitialValues({});

因为这不是坚持你的偏好。

相反,在 app/proguard-rules.pro中添加以下代码行:

-keep class androidx.lifecycle.DefaultLifecycleObserver

https://github.com/flutter/flutter/issues/58479#issuecomment-734099445

见相关问题: https://github.com/flutter/flutter/issues/65334

我在《颤网》上看到了这期。 I added the code, used "fast restart" and got this error. 停止和重新启动为我解决了这个问题。

SOLUTION

步骤1: 更新 /android/app/build.gradle中的 buildTypes


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

Step 2: Add file android/app/proguard-rules.pro:

-keep class androidx.lifecycle.DefaultLifecycleObserver

Step 3: Update 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
}
}


AndroidManifest.xml

    <activity
android:name="io.flutter.embedding.android.FlutterActivity">
</activity>
<meta-data
android:name="flutterEmbedding"
android:value="2" />

正确地标记这2个代码,因为我正在改变颤振嵌入到 v2它发生了,所以我正确地检查这2个代码,它删除了我的错误。

在我的例子中,我删除了 pubspec.yaml 文件中的包“ flutter _ facebook _ login: ^ 3.0.0”,然后它工作得很好..。

I have tried all the above solutions, but there is not any other better solution than removing the "flutter_facebook_login" package.

In some above solutions MissingPluginException could be fixed, but get() and set() of shared_preferences are not working properly.

Please let me know about a better solution.

这也给了我一个噩梦。

  • 启用假
  • 心理医生资源错误

    在 app/build.gradle 中的 buildType 中添加这两行对我来说很有用。 < br >
android {
//


defaultConfig {
...
}


buildTypes {
release {
signingConfig signingConfigs.debug
minifyEnabled false
shrinkResources false
}
}
}

我以前曾经使用过 share _ prefs,但是在最近的项目中陷入了这个问题。社区应该调查此事。

Just use

classpath 'com.android.tools.build:gradle:3.5.1'

在你的 android/build.gradle里面

运行 flutter clean and after that 运行 flutter pub get

通常,如果在调试期间实现了共享首选项包,可能会导致这个问题,因此尝试停止上述方法的调试,它应该会正常工作。

几天前我也遇到过同样的问题,在谷歌了几天之后,我发现共享首选项不起作用的原因是我有一个没有正确配置“ flutter _ facebook _ login”的包。因此,在 Facebook 之后的任何软件包,在这种情况下都不会起到“共享偏好”的作用。

解决方案: 确保您正在使用的每个包都已经完全配置,或者删除导致问题的包。

因此,在创建了一个虚拟项目颤振测试的解决方案 给你到‘ T’,这对我没有工作。最后,我通过更新 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

类主要活动: 扑动活动()

override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
flutterEngine.getPlugins().add(SharedPreferencesPlugin())


}

}

请注意: GeneratePluginRegistrant.java已经注册,但在我的情况下,如上所示添加它是解决问题的方法。

我试了所有能找到的方法,都没用。当我看到带有 -2的注释表明 flutter _ fackbook _ login 软件包导致了这个问题时,我有些不情愿。后来又发现 给你关于 flutter _ fackbook _ login 的问题。拆除包装后,它的工作!

未处理的异常: MissingPluginException (在通道 plugins.flutter.io/shared_preferences 上找不到 getAll 方法的实现

然后将其添加到 main.dart 文件的 in main()函数中

main(){
SharedPreferences.setMockInitialValues({});
...
}

这招对我很管用

This main.dart add line

SharedPreferences.setMockInitialValues({});

我破案了

面对这个问题,通过完全重新安装应用程序来解决

在我的例子中,我通过在/android/app/build.gradle 中添加 Bellow 行来解决这个问题

buildTypes {
release {
signingConfig signingConfigs.release
}
}

buildTypes {
release {
signingConfig signingConfigs.release
            

minifyEnabled true
useProguard true


proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

在14.02.2022中,我在后台服务中使用 share _ ferences ^ 2.0.8时遇到了这个问题。在 pubspec.yaml 中添加这些代码行解决了这个问题:

dependency_overrides:
shared_preferences_android: 2.0.10

对我来说,它只是增加了 minSdkVersion。当我从冷启动应用程序时(不是通过点击重启按钮) ,我发现了这个问题。-

The plugin flutter_webrtc requires a higher Android SDK version.
Fix this issue by adding the following to the file C:\Users\Piyush\Documents\filesfi\android\app\build.gradle:
android {
defaultConfig {
minSdkVersion 21
}
}

在与 Workmanager 一起进行背景提取时,我尝试了所有上述建议的解决方案,但没有解决问题

最后,我做了如下,问题解决了。

在 main.dart:

if (Platform.isAndroid) {
SharedPreferencesAndroid.registerWith();
} else if (Platform.isIOS) {
SharedPreferencesIOS.registerWith();
}

Yaml:

shared_preferences_ios:
shared_preferences_android:

我在使用 取背景时遇到过同样的问题,当应用程序终止时,使用一个想要访问 分享的首选项包的回调来执行 无头任务

import 'package:shared_preferences_ios/shared_preferences_ios.dart';
import 'package:shared_preferences_android/shared_preferences_android.dart';
import 'dart:io';


///Other code


//Add the check and registerWtih in your desired method.
if (Platform.isAndroid) {
SharedPreferencesAndroid.registerWith();
} else if (Platform.isIOS) {
SharedPreferencesIOS.registerWith();
}


使用 back _ get 的代码:

import 'package:shared_preferences_android/shared_preferences_android.dart';
import 'dart:io';


///Other code


void backgroundFetchHeadlessTask(HeadlessTask task) async {
SharedPreferencesAndroid.registerWith();
//No need to check OS because headless task works only for Android


///code code
}

在我的例子中,我在一个 iOS 应用程序中嵌入了一个 flutter MODULE。由于插件注册不正确,引发了 MissingPluginException问题。

下面的代码示例可以工作:

import Flutter
import FlutterPluginRegistrant


@main
class AppDelegate: FlutterAppDelegate {


...


var flutterEngine: FlutterEngine!


...


func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
{
// Override point for customization after application launch.
self.flutterEngine = FlutterEngine(name: "my flutter engine")
self.flutterEngine.run()
// register plugins onto engine, NOT AppDelegate itself;
GeneratedPluginRegistrant.register(with: self.flutterEngine)
return true
}


...


}

如果你在 扑网上遇到这个错误,在这里使用 用于调试的 Chrome是我所做的:

在我的情况下,我必须完全 关闭 Chrome 窗口扑动正在使用。

再次运行应用程序,错误消失了,分享的首选项工作正常!

希望能有帮助!

可以使用 try解决此错误。 这里有一个例子:

_checkLoginStatus() async {
try {
SharedPreferences localStorage = await SharedPreferences.getInstance();
var token = localStorage.getString('token');
if (token != null) {
setState(() {
_isLoggedIn = true;
});
}
} catch (e) {
//
}

}