我有这个功能:
Future<String> load(SharedPreferences prefs, String fileName) async {
prefs = await SharedPreferences.getInstance();
String jsonString = prefs.getString(fileName) ?? "";
if (jsonString.isNotEmpty) {
return jsonString;
}else{
return ...
}
}
在其他情况下我应该返回什么?我尝试使用“”,但不起作用。
答案 0 :(得分:5)
在Flutter中,“共享首选项”用于存储原始数据(int
,double
,bool
,string
和stringList
)。此数据与该应用程序相关联,因此,当用户卸载您的应用程序时,该数据也将被删除。
来自pub的shared_preferences插件是Android SharedPreferences
和iOS NSUserDefaults
的包装。您可以通过在依赖项部分的 pubspec.yaml 文件中添加shared_preferences
行来获得此插件。
dependencies:
flutter:
sdk: flutter
shared_preferences: ^0.4.3
将版本号更改为current的版本号。
在您需要共享首选项的任何文件中,添加以下导入:
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']);
答案 1 :(得分:3)
答案是“取决于”。也就是说,这取决于您对该函数的结果执行的确切操作,以及在该情况下正确的空默认值意味着什么。
假设您将返回的JSON字符串decoding放入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");