Flutter:共享偏好设置

15

我有这个函数:

  Future<String> load(SharedPreferences prefs, String fileName) async {
    prefs = await SharedPreferences.getInstance();
    String jsonString = prefs.getString(fileName) ?? "";
    if (jsonString.isNotEmpty) {
      return jsonString;
    }else{
      return ...
    }
  }

在else情况下我应该返回什么?我尝试了""但它不起作用。


1
“doesn't work” 究竟是指什么? - Günter Zöchbauer
String jsonString = prefs.getString(fileName) ?? ""; - is wrong, You have to do String jsonString = (await prefs.getString(fileName)) ?? ""; - Andrii Turkovskyi
因为当我尝试加载时,它会给出"FormatException: Unexpected end of input (at character 1)"的错误提示。 - Little Monkey
1
如果我在那里放置await,它会抱怨告诉我“仅等待未来”。 - Little Monkey
1
关于await你是正确的,我刚刚查看了不同实现的首选项。它看起来完全没有问题。问题确切地在else块中吗? - Andrii Turkovskyi
显示剩余2条评论
2个回答

36

共享首选项

在Flutter中,共享首选项用于存储基本数据类型(intdoubleboolstringstringList)。这些数据与应用程序相关联,因此当用户卸载应用程序时,数据也将被删除。

获取插件

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

dependencies:
  shared_preferences: '>=0.5.12+2 <2.0.0'

您可以将版本号更改为当前的任何版本,但小于2.0的任何版本均应兼容。

导入软件包

在需要使用共享首选项的任何文件中,添加以下导入:

import 'package:shared_preferences/shared_preferences.dart';

读写数据

要获取共享首选项对象,可以执行以下操作:

final prefs = await SharedPreferences.getInstance();

这将用于以下所有示例。

整数

  • 读取: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') ?? false;
  • 写入:prefs.setBool('my_bool_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');

虽然我很少发现有必要这样做,但我会覆盖旧数据或忽略它。您不应将任何敏感数据存储在共享首选项中。

另请参阅


1
这是你解释Shared Preference的最棒方式。如果文档能像这样解释就好了。非常感谢! - Maruf Hassan

9
答案是“这取决于情况”。具体而言,它取决于您对此函数的结果做什么,以及在该上下文中什么是一个好的默认空值。
假设您正在解码返回的JSON字符串为Map<String,dynamic>,那么一个好的默认值可能是空映射。在这种情况下,您可以将函数重新表述如下:
Future<String> loadJSON(final String fileName) async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  final String jsonString = prefs.getString(fileName);
  if (jsonString != null && jsonString.isNotEmpty) {
    return jsonString;
  }
  return "{}"; // default value
}

final String jsonString = await loadJSON("test.json");

final Map<String, dynamic> jsonData = json.decode(jsonString);

然而,将此过程重构为一个稍微高级的函数并返回实际映射值可能更有意义:

Future<Map<String, dynamic>> loadData(final String fileName) async {
  final SharedPreferences prefs = await SharedPreferences.getInstance();
  final String jsonString = prefs.getString(fileName);
  if (jsonString != null && jsonString.isNotEmpty) {
    return json.decode(jsonString);
  }
  return Map(); // default value
}

final Map<String, dynamic> jsonData = await loadData("test.json");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接