我正在将名称列表保存到 flutter 中的共享首选项中,场景是以前应用程序在键“flutter.savedName”下保存名称列表,但请求已更改为获取“flutter”下所有以前保存的名称.savedName”并保存在“models”键下,以下是代码
Future<void> migratePreviousName() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> namelist = prefs.getStringList("flutter.savedName") ?? [];
if (namelist.isNotEmpty) {
prefs.remove("flutter.savedName");
await addNames(namelist);
}
}
Future<void> addNames(List<String> models) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String>? namelist = (await getAllNames() as List<String>?) ?? [];
namelist.addAll(models);
prefs.setStringList("models", namelist.toList());
}
Future<List<String>> getAllNames() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getStringList("models") ?? [];
}
以下是测试用例,
test(
'Migrate Names',
() async {
SharedPreferences.setMockInitialValues({
"flutter.savedName": ["Nokia", "Pixel"].toList()
});
await handler.migratePreviousName();
await handler.addNames(["iPhone", "Samsung"]);
final list = await handler.getAllNames();
expect(list.length, 4);
},
);
测试用例失败,但是如果我将键名从 "flutter.savedName" 更改为 "savedName",测试用例就会通过。由于密钥已存在,我需要使用“flutter.savedName”,了解这是由于密钥名称中的点造成的。有解决办法吗
我认为您错过了等待设置该列表的时间:
prefs.setStringList("models", namelist.toList());
await prefs.setStringList("models", namelist.toList());
等待获取该异步操作的完成结果。
希望对您有帮助。