Flutter:共享偏好

Posted

技术标签:

【中文标题】Flutter:共享偏好【英文标题】:Flutter: shared preferences 【发布时间】:2019-03-20 18:13:13 【问题描述】:

我有这个功能:

  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 情况下我应该返回什么?我尝试使用“”,但它不起作用。

【问题讨论】:

“不起作用”到底是什么意思? String jsonString = prefs.getString(fileName) ?? ""; - 错了,你必须这样做String jsonString = (await prefs.getString(fileName)) ?? ""; 因为,当我尝试加载时,它给了我“FormatException: Unexpected end of input (at character 1) 如果我把那个 await 放在那里,它会抱怨告诉我“await only futures” 你说得对await 我刚刚研究了首选项的不同实现。看起来完全没问题。问题完全出在else 块中吗? 【参考方案1】:

共享偏好

在 Flutter 中,Shared Preferences 用于存储原始数据(intdoubleboolstringstringList)。此数据与应用相关联,因此当用户卸载您的应用时,这些数据也会被删除。

获取插件

来自 pub 的 shared_preferences 插件是 android SharedPreferencesios NSUserDefaults 的封装。您可以通过在依赖项部分的 pubspec.yaml 文件中添加 shared_preferences 行来获取此插件。

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

您可以将版本号更改为 current 的任何版本号,但任何低于 2.0 的版本都应该兼容。

导入包

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

import 'package:shared_preferences/shared_preferences.dart';

读写数据

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

final prefs = await 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') ?? 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');

不过,我很少发现需要这样做。我只是覆盖旧数据或忽略它。您不应在共享首选项中存储任何敏感数据。

另见

Shared Preferences Service in Flutter for Code Maintainability 文档:Storing key-value data on disk What are the ?? double question marks in Dart? How to create an empty list in Dart

【讨论】:

这是您解释共享偏好的最令人惊奇的方式。如果文档是这样解释的就好了。非常感谢!【参考方案2】:

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

假设您将 decoding 返回的 JSON 字符串转换为 Map&lt;String, dynamic&gt;,那么一个好的默认值可能是空映射。在这种情况下,您可以按如下方式重新构造您的函数:

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");

【讨论】:

以上是关于Flutter:共享偏好的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:使用共享首选项时对 null 的方法调用

Flutter 抓包 MAC

Flutter 抓包 MAC

Flutter 抓包 MAC

Flutter 抓包 MAC

如何在详细屏幕中查看项目的详细信息 - Flutter