【问题标题】:Flutter: Unhandled exception: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)Flutter:未处理的异常:MissingPluginException(在通道 plugins.flutter.io/shared_preferences 上找不到方法 getAll 的实现)
【发布时间】:2018-11-14 05:09:53
【问题描述】:

我的 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 正在工作。

有人可以帮助我吗?

【问题讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat
  • @MartijnPieters 当我试图阅读对话时,它说找不到页面并且还提到“你需要 20 声望才能在这里交谈”
  • @Atul 我无法重现。聊天室还在;确保您在 chat.stackoverflow.com 上正确登录。
  • 我将 shared_prefs 替换为 flutter_secure_storage
  • 我只有在将我的应用程序部署到 Playstore 后才会遇到这个问题(在发布和调试模式下运行/构建都可以正常工作)。任何想法为什么会发生这种情况?

标签: ios sharedpreferences flutter


【解决方案1】:

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

第一次安装插件时会出现上述情况,所以必须重新安装。

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

【讨论】:

  • 我确实卸载并重新安装,flutter clean,但没有任何效果
  • 需要更多细节
【解决方案2】:

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

SharedPreferences.setMockInitialValues({});

这是因为如果你在什么都没有的地方使用 getAll,它会发疯的。我认为这与iOS无关。即使你使用普通的getString,内部程序使用getAll,所以它仍然会崩溃

编辑

我收到了很多关于它如何不保留数据 b/w 会话的 cmets。你可以做些什么来解决这个问题,就是把它放在一个 try and catch 语句中。在尝试中,调用sharedPreferences.get 并捕获错误,然后执行 setMockInitialValues。如果sharedPreferences.get没有报错,说明已经有数据,不需要设置mock值替换旧的。

我不确定这是否可行,所以如果有人尝试它并且它有助于持久化数据,请告诉我,以便我可以为其他人验证它

编辑 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

【讨论】:

  • 这样我们得到一个警告说这个 setMockInitialValues 应该只在内部或在测试中调用
  • 是的,但这不会造成任何问题。我已经使用了很长时间,并且运行良好
  • 这真的很奇怪,我宁愿不使用这个库而不是添加这样奇怪的解决方法
  • Shared Preferences 是一个非常好的库,它非常有用,但它取决于你。
  • 异常消失了,但如果应用程序关闭,它会失去价值。在重新启动应用程序时给出 null。
【解决方案3】:

解决方案?

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

第二步:添加文件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 步和第 2 步就足够了
  • tqvm。我在谷歌上搜索了很久。最后,当我运行“flutter run --release”时,这解决了我的问题
  • 糟糕,minifyEnabled false,shrinkResources false,对我有用!
  • (在我的情况下第 1 步和第 2 步就足够了)++
  • 我不必将 minifyEnabled 设置为 false 或 shrinkResources 设置为 false。仍然有效。非常感谢
【解决方案4】:

我之前遇到过这个问题,现在我已经解决了这个问题:

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

然后从设备中删除您的调试应用程序。

【讨论】:

    【解决方案5】:

    这也给了我一个噩梦。

    • minifyEnabled 错误
    • shrinkResources 错误

      在 app/build.gradle 的 buildTypes 中添加这两行对我有用。
    android {
        //
    
        defaultConfig {
            ...
        }
    
        buildTypes {
            release {
                signingConfig signingConfigs.debug
                minifyEnabled false
                shrinkResources false
            }
        }
    }
    

    我之前使用过 shared_prefs,但在我最近的项目中遇到了这个问题。社区应该对此进行调查。

    【讨论】:

    • 如果您在使用 APK 的发行版时遇到此问题,这是对我有帮助的解决方案。
    • 非常感谢,您的解决方案对我有用。这真是令人沮丧..
    【解决方案6】:

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

    1. 运行“flutter clean”
    2. 运行“flutter pub get”
    3. 从模拟器中删除应用程序

    【讨论】:

      【解决方案7】:

      对于android部分,你不应该使用

      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

      【讨论】:

      【解决方案8】:

      因此,在创建颤振后,一个虚拟项目来测试解决方案 here 到“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
      

      类 MainActivity: FlutterActivity() {

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

      }

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

      【讨论】:

      • 谢谢!你拯救了我的一天!
      【解决方案9】:

      遇到此问题并通过完全重新安装应用程序解决

      【讨论】:

        【解决方案10】:

        就我而言,我在 pubspec.yaml 文件中删除了包“flutter_facebook_login: ^3.0.0”,然后它运行良好...

        我已经尝试了上述所有解决方案,但没有比删除“flutter_facebook_login”包更好的解决方案了。

        在上述某些解决方案中,MissingPluginException 可以修复,但 shared_preferences 的 get() 和 set() 无法正常工作。

        请告诉我更好的解决方案。

        【讨论】:

        • 嗨,我遇到了同样的问题,可以确认“flutter_facebook_auth”导致了与其他包的共享首选项冲突。你找到解决这个问题的方法了吗?
        • 我通过在运行应用程序之前先在 Android 上设置 Facebook 身份验证解决了我的问题。如果不进行整个 Android facebook 设置,您将无法运行该应用程序。
        • 这也为我解决了这个问题。如果您使用的是“flutter_facebook_login”包,请按照该包网站中给出的步骤进行完整设置。
        【解决方案11】:

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

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

        【讨论】:

        • 嗨@Dmitry,你能帮忙看看带有firebase配置的object-c版本吗?目前我使用follow import UIKit;导入 Firebase;实现 AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [FIRApp configure];返回是; } 但我有像 OP 一样的错误
        • 这个答案无关紧要,因为它只影响 ios 构建,android 也受到影响它是不可行的
        【解决方案12】:

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

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

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

        这对我有用

        【讨论】:

          【解决方案13】:

          在我的情况下,重新安装应用程序不起作用。

          改为转到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
          

          然后从设备中删除您的应用程序,然后再次运行该应用程序。

          【讨论】:

          • 这个答案无关紧要,因为它只影响 ios 构建,android 也受到影响它是不可行的
          • @a11r 但这个问题特别提到了 ios。该线程上的问题仅与 iOS 构建有关,这就是我回答这个问题的原因。
          【解决方案14】:

          如果上述答案不起作用,也许这会有所帮助。 在创建 android studio flutter 项目时,我忘记勾选包括 kotlin 对 android 的支持 / swift 对 iOS 的支持。之所以如此,是因为在 flutter clean 和 flutter run 之后我的项目没有工作。

          【讨论】:

          • 我创建了一个全新的项目,复制了所有内容但仍然无法正常工作
          【解决方案15】:

          我在使用 VS Code 的调试模式下也遇到了这个错误。 我只是停止,然后重新启动应用程序(无需直接重新启动)。

          运行 > 停止调试

          运行 > 开始调试

          【讨论】:

            【解决方案16】:

            在我的解决方案中,我没有使用SharedPreferences.setMockInitialValues({}); 正如其他人所说的那样,它应该用于测试(IDE 也这么说),但不能用于生产应用程序。 所以我注意到 Flutter 说我的项目使用旧的 Flutter android 嵌入式版本,我应该升级到 v2。我这样做了,使用以下指令:https://github.com/flutter/flutter/wiki/Upgrading-pre-1.12-Android-projects

            之后关于MissingPluginException 的错误消失了。因此,这似乎比调用方法进行测试更好一些解决方案。我希望我能知道为什么,但此时我只是没有时间深入挖掘。无论如何,这是解决此问题的另一种方法。

            【讨论】:

              【解决方案17】:

              随便用

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

              在你的android/build.gradle里面

              【讨论】:

              • 为我工作。非常感谢
              【解决方案18】:

              运行flutter clean 在那之后 运行flutter pub get

              通常如果您在调试过程中实现了共享首选项包,可能会导致此问题,因此请尝试停止上述方法的调试,它应该可以工作。

              【讨论】:

                【解决方案19】:

                就我而言,我通过在 /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'
                        }
                }
                

                【讨论】:

                  【解决方案20】:

                  我收到了其中一个颤振包的问题,​​并将包升级到最新版本有所帮助。

                  【讨论】:

                    【解决方案21】:

                    我在 Flutter Web 中遇到了这个问题。 我添加了代码,使用了“快速重启”并得到了这个错误。 停止并重新启动解决了我的问题。

                    【讨论】:

                      【解决方案22】:

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

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

                      【讨论】:

                        【解决方案23】:

                        尝试了我能找到的一切,但都没有奏效。当我看到带有 -2 的评论表明 flutter_fackbook_login 包导致了问题时,我很不情愿。后来再次发现here 关于flutter_fackbook_login 是问题所在。删除包后它工作了!

                        【讨论】:

                          【解决方案24】:

                          当我尝试在 excel 文件中加载数据时,我也遇到了同样的问题。 尝试了上面建议的所有东西。 但是当我在我的模拟器中安装 Microsoft excel时,它立即解决了。

                          【讨论】:

                            【解决方案25】:

                            这个 main.dart 添加行

                            SharedPreferences.setMockInitialValues({});
                            

                            我解决了

                            【讨论】:

                            • 在 main.dart 中不支持使用它。您可以通过运行此代码在测试中使用初始值填充 SharedPreferences。只需重新安装应用程序。这应该可以解决问题。
                            【解决方案26】:

                            AndroidManifest.xml

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

                            正确标记这两个代码,因为我正在将颤振嵌入更改为 v2,所以我正确检查了这两个代码并删除了我的错误。

                            【讨论】:

                              猜你喜欢
                              • 2023-02-15
                              • 2020-04-14
                              • 2020-08-19
                              • 2021-07-18
                              • 1970-01-01
                              • 2021-07-10
                              • 2020-05-29
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多