Flutter: Unhandled exception: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)
No implementation found for method
getAll
on channelplugins.flutter.io
.
The above will occur when you setup the plugin for the first time, so it has to be reinstalled.
Therefore, uninstall and reinstall your application.
After doing a lot of research, I found the answer. Add this to your code before you use shared preferences.
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
EDIT
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
Thanks to Edwin Nyawoli, I now know why it did not persist data in between sessions. While mine is a temporary and not a real solution, it still may help. If someone can help me recreate this issue on my new device, I can try to figure out a new solution. Please let me know if you are willing to upload your project to github so that I can recreate it. For now, I did some more research and believe this might help you:-
In /android/app/build.gradle
buildTypes { release { signingConfig signingConfigs.release minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }}
change to
buildTypes { release { signingConfig signingConfigs.release minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' }}
This answer is not mine, its from this comment on a github issuehttps://github.com/flutter/flutter/issues/65334#issuecomment-760270219
SOLUTION 😍
Step 1: Update buildTypes
in /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' } }}
Step 2: Add file android/app/proguard-rules.pro
:
-keep class androidx.lifecycle.DefaultLifecycleObserver
Step 3: Update MainActivity
import io.flutter.embedding.android.FlutterActivityimport io.flutter.embedding.engine.FlutterEngineimport io.flutter.plugins.GeneratedPluginRegistrantclass MainActivity: FlutterActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine) // add this line }}