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
Pet*_*Học 33
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)
android/app/proguard-rules.pro:-keep class androidx.lifecycle.DefaultLifecycleObserver
Run Code Online (Sandbox Code Playgroud)
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)
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的实现__首次安装插件时,将发生上述情况,因此必须重新安装...
请卸载并重新安装您的应用程序。
小智 10
这也让我做了一个噩梦。
android {
//
defaultConfig {
...
}
buildTypes {
release {
signingConfig signingConfigs.debug
minifyEnabled false
shrinkResources false
}
}
}
Run Code Online (Sandbox Code Playgroud)
我之前曾与 shared_prefs 合作过,但在我最近的项目中陷入了这个困境。社区将对此进行调查。
小智 8
将共享首选项添加到我的项目并在模拟器上运行后遇到了同样的问题。以下步骤为我解决了问题:
对于 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
就我而言,我删除了 pubspec.yaml 文件中的包“flutter_facebook_login: ^3.0.0”,然后它运行良好......
我已经尝试了上述所有解决方案,但没有比删除“flutter_facebook_login”包更好的解决方案了。
在上面的一些解决方案中,MissingPluginException 可以修复,但是 share_preferences 的 get() 和 set() 无法正常工作。
请让我知道更好的解决方案。
小智 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已经注册但在我的情况下将其添加如上图所示就是解决这个问题。
未处理的异常:MissingPluginException(在通道plugins.flutter.io/shared_preferences上找不到方法 getAll 的实现
然后将其添加到 main.dart 文件的 main() 函数中
主要的(){
SharedPreferences.setMockInitialValues({});
……
}
**这对我有用!**
当应用程序终止并且使用想要访问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)
| 归档时间: |
|
| 查看次数: |
5044 次 |
| 最近记录: |