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

时间:2018-06-04 19:48:27

标签: ios sharedpreferences flutter

我的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正在运行。

有人可以帮助我吗?

27 个答案:

答案 0 :(得分:25)

解决方案?

第 1 步:更新 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'
        }
    }
}

第 2 步:添加文件 android/app/proguard-rules.pro

-keep class androidx.lifecycle.DefaultLifecycleObserver

第 3 步:更新 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)

我以前有这个问题,这是我为解决此问题所做的事情:

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

之后,从设备中删除调试应用。

答案 2 :(得分:9)

经过大量研究,我找到了答案。使用共享首选项之前,请将其添加到您的代码中。

SharedPreferences.setMockInitialValues({});

这是因为如果在没有任何内容的地方使用getAll,它将变得很疯狂。我认为这与iOS无关

答案 3 :(得分:9)

这也让我做了一个噩梦。

  • minifyEnabled 假
  • shrinkResources false

    在 app/build.gradle 的 buildTypes 中添加这两行对我有用。
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

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

答案 5 :(得分:5)

插件版本shared_preferences: ^0.5.12

添加SharedPreferences.setMockInitialValues({}); 在Flutter App主要功能中的runApp()函数之前

为我修复此错误

enter image description here

答案 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)

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

  1. 运行“干净整洁”
  2. 运行“ flutter pub get”
  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 个代码并消除了我的错误。