Dart 颤振:共享偏好

Dart 颤振:共享偏好,dart,flutter,sharedpreferences,future,Dart,Flutter,Sharedpreferences,Future,我有这个功能: Future<String> load(SharedPreferences prefs, String fileName) async { prefs = await SharedPreferences.getInstance(); String jsonString = prefs.getString(fileName) ?? ""; if (jsonString.isNotEmpty) { return jsonString

我有这个功能:

  Future<String> load(SharedPreferences prefs, String fileName) async {
    prefs = await SharedPreferences.getInstance();
    String jsonString = prefs.getString(fileName) ?? "";
    if (jsonString.isNotEmpty) {
      return jsonString;
    }else{
      return ...
    }
  }
未来加载(SharedReferences优先级,字符串文件名)异步{
prefs=等待SharedReferences.getInstance();
字符串jsonString=prefs.getString(文件名)?“”;
if(jsonString.isNotEmpty){
返回jsonString;
}否则{
返回。。。
}
}
如果是其他情况,我应该退还什么?我用“”试过了,但不起作用

答案是“视情况而定”。也就是说,它取决于您对这个函数的结果到底做了什么,以及一个好的空默认值在该上下文中意味着什么

假设将返回的JSON字符串放入
映射
,那么一个好的默认值可能是空映射。在这种情况下,您可以按如下方式重新构造函数:

未来加载JSON(最终字符串文件名)异步{ final SharedReferences prefs=等待SharedReferences.getInstance(); 最终字符串jsonString=prefs.getString(文件名); if(jsonString!=null&&jsonString.isNotEmpty){ 返回jsonString; } 返回“{}”;//默认值 } 最后一个字符串jsonString=await loadJSON(“test.json”); 最终映射jsonData=json.decode(jsonString); 但是,将此过程重新表述为返回实际地图值的略高级别函数可能更有意义:

未来加载数据(最终字符串文件名)异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
最终字符串jsonString=prefs.getString(文件名);
if(jsonString!=null&&jsonString.isNotEmpty){
返回json.decode(jsonString);
}
return Map();//默认值
}
final Map jsonData=wait loadData(“test.json”);
共享首选项 在flatter中,共享首选项用于存储基本数据(
int
double
bool
string
、和
stringList
)。此数据与应用程序关联,因此当用户卸载应用程序时,数据也将被删除

获取插件 pub的插件是Android
SharedReferences
和iOS
NSUserDefaults
的包装器。您可以通过在dependencies部分的pubspec.yaml文件中添加
shared_preferences
行来获得此插件

dependencies:
  shared_preferences: '>=0.5.12+2 <2.0.0'
读写数据 要获取共享首选项对象,可以执行以下操作:

final prefs=wait SharedPreferences.getInstance();
这将用于以下所有示例

int
  • 阅读:
    final myInt=prefs.getInt('my_int_key')??0;
  • 写入:
    prefs.setInt('my_int_key',42)
双重的
  • 阅读:
    final myDouble=prefs.getDouble('my_double_key')??0.0;
  • 写入:
    prefs.setDouble('my_double_key',3.14)
布尔
  • 阅读:
    final myBool=prefs.getBool('my_bool_key')??虚假的
  • 写入:
    prefs.setBool('my\u bool\u key',true)
一串
  • 阅读:
    final myString=prefs.getString('my_string_key')
  • 写入:
    prefs.setString('my_string_key','hello')
字符串列表
  • 阅读:
    final myStringList=prefs.getStringList('my_string_list_key')??[];
  • 写:
    prefs.setStringList('my_string_list_key',['horse','cow','sheep')
删除数据 您可以通过提供密钥名称删除任何保存的数据:

prefs.remove('my_int_key');
不过,我很少觉得有必要这么做。我只是覆盖旧数据或忽略它。您不应该在共享首选项中存储任何敏感数据

另见
  • 文件:

什么是“不工作”的确切含义?
String jsonString=prefs.getString(文件名)??"";-错误,您必须执行
String jsonString=(wait prefs.getString(fileName))??"";因为,当我尝试加载时,它会给我“FormatException:输入的意外结束(在字符1处),如果我把wait放在那里,它会抱怨告诉我“只等待未来”“关于
wait
你说得对,我刚刚研究了prefs的不同实现。看起来很好。问题是否确实存在于
else
块中?这是您解释共享偏好的最令人惊讶的方式。如果这就是文档中的解释就好了。谢谢!
import 'package:shared_preferences/shared_preferences.dart';