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

cam*_*leB 4 sharedpreferences ios 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)
Run Code Online (Sandbox Code Playgroud)

如果我注释了将值发送到iOS端的函数,则不会显示错误,并且SharedPreferences可以正常工作。

有人可以帮我吗?

Sid*_*wal 41

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

SharedPreferences.setMockInitialValues({});
Run Code Online (Sandbox Code Playgroud)

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

编辑

我收到了很多关于它如何不持久化数据黑白会话的评论。你可以做些什么来解决这个问题,那就是把它放在一个 try 和 catch 语句中。在尝试中,调用sharedPreferences.get并捕获错误,然后执行 setMockInitialValues。如果sharedPreferences.get没有报错,说明已经有数据了,不需要设置模拟值来代替旧的。

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

编辑 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'
    }
}
Run Code Online (Sandbox Code Playgroud)

改成

buildTypes {
    release {
        signingConfig signingConfigs.release

        minifyEnabled true
        useProguard true

        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这样我们就收到一条警告,说这个 setMockInitialValues 只能在内部或测试中调用 (3认同)
  • 异常消失了,但如果应用程序关闭,它会丢失该值。重新启动应用程序时给出 null。 (2认同)

Pet*_*Học 33

解决方案

第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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

-keep class androidx.lifecycle.DefaultLifecycleObserver
Run Code Online (Sandbox Code Playgroud)

第 3 步:更新 MainActivity


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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,步骤 1 和步骤 2 就足够了 (5认同)
  • awosome,minifyEnabled false,shrinkResources false,对我有用! (5认同)
  • 第 1 步成功了 (4认同)
  • (就我而言,步骤 1 和步骤 2 就足够了)++ (2认同)

Amj*_*reh 22

我以前遇到过这个问题,这是我为解决它所做的:

  1. flutter clean
  2. flutter pub get

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

  • 那不行 (2认同)

Vic*_*r K 13

2022年2月14日,我在后台服务中使用shared_preferences^2.0.8时遇到了这个问题。在 pubspec.yaml 中添加这些行修复了问题:

dependency_overrides:
  shared_preferences_android: 2.0.10 
Run Code Online (Sandbox Code Playgroud)


kri*_*iss 10

在通道plugins.flutter.io上没有找到方法getAll的实现__首次安装插件时,将发生上述情况,因此必须重新安装...

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

  • 我确实卸载并重新安装,flutter clean,但没有任何效果 (31认同)
  • 需要更多细节 (3认同)
  • 它不起作用 (2认同)

小智 10

这也让我做了一个噩梦。

  • minifyEnabled false
  • shrinkResources false

    在 app/build.gradle 的 buildTypes 中添加这两行对我有用。
android {
    //

    defaultConfig {
        ...
    }

    buildTypes {
        release {
            signingConfig signingConfigs.debug
            minifyEnabled false
            shrinkResources false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我之前曾与 shared_prefs 合作过,但在我最近的项目中陷入了这个困境。社区将对此进行调查。


ikh*_*san 9

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


小智 8

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

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


ישו*_*ותך 7

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

SharedPreferences.setMockInitialValues({});
Run Code Online (Sandbox Code Playgroud)

因为它没有坚持你的偏好。

相反,将以下行添加到您的app/proguard-rules.pro

-keep class androidx.lifecycle.DefaultLifecycleObserver
Run Code Online (Sandbox Code Playgroud)

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

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


per*_*000 6

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

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

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

请让我知道更好的解决方案。

  • 我通过在运行应用程序之前先在 Android 上设置 Facebook 身份验证解决了我的问题。如果不完成整个 Android facebook 设置,您就无法运行该应用程序。 (3认同)

小智 6

因此,在创建 flutter 一个虚拟项目以测试此处对“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
Run Code Online (Sandbox Code Playgroud)

类 MainActivity: FlutterActivity() {

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

}
Run Code Online (Sandbox Code Playgroud)

}

请注意:GeneratePluginRegistrant.java已经注册但在我的情况下将其添加如上图所示就是解决这个问题。


ONe*_*ls' 6

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

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

主要的(){

SharedPreferences.setMockInitialValues({});

……

}

**这对我有用!**


Phi*_* D. 6

当应用程序终止并且使用想要访问shared_preferences包的回调执行无头任务时,我在使用background_fetch时遇到了同样的问题。

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();
}

Run Code Online (Sandbox Code Playgroud)

使用background_fetch的代码:

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
}
Run Code Online (Sandbox Code Playgroud)


小智 4

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

...
@objc class AppDelegate: FlutterAppDelegate {

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