我正在使用包localstorage - https://pub.dartlang.org/packages/localstorage#-installing-tab-
这是我的代码:
import 'package:flutter/material.dart';
import 'package:localstorage/localstorage.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
_MyHomePageState createState() => _MyHomePageState();
}
final LocalStorage storage = new LocalStorage("level");
class _MyHomePageState extends State<MyHomePage> {
void initState() {
super.initState();
//storage.setItem("level", 0);
printStorage();
}
void printStorage() {
print("level stored: " + storage.getItem("level").toString());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("LocalStorage Example"),
),
body: Center(
),
);
}
}
当storage.setItem("level", 0)
没有被注释掉时,应用程序工作正常并打印出“等级存储:0”。然而,关闭应用程序后,评论出storage.setItem("level", 0)
,保存应用程序并重新运行应用程序,应用程序打印出“level stored:null”。
从上次运行应用程序开始,如何使存储保持不变?
我正在使用Xcode iPhone模拟器。
任何帮助是极大的赞赏!
通过查看软件包的源代码,您似乎没有给它足够的时间来加载来自底层异步调用的数据。这就是为什么它为您公开一个标志属性,以检查它是否已准备好执行读/写操作。
只需在打印前使用它:
storage.ready.then((_) => printStorage());
我有类似的问题,但经过几个小时的测试和挖掘,我可以确认即使在应用程序关闭后,localstorage包仍会保留数据。如果您想查看实际的数据库文件以进行测试(您可以在iOS模拟期间看到内容实时更改),请在macOS上查看:
/Users/YOURUSERNAME/Library/Developer/CoreSimulator/Devices/SOMEDEVICENUMBER/data/Containers/Data/Application/SOMEAPPLICATIONNUMBER/Documents/level.json
所以这意味着在尝试读取和使用这些值之前,只需要等待几纳秒就可以准备好localstorage连接。作为Dart / Flutter的新手,对我而言,这意味着要尝试async / await或Future / then的正确组合和位置。
例如,此更改将在您的示例应用中正常运行:
void printStorage() async {
//this will still print null:
print("before ready: " + testDb.getItem("level").toString());
//wait until ready
await storage.ready;
//this will now print 0
print("after ready: " + testDb.getItem("level").toString());
}
在我的实际应用程序中,如果我忘记正确放置“等待”或“然后”,我会在检索/分配实际值之前得到很多空错误。
BTW在你的文件(level.json)中你只有一个元素,{“level”,“0”}。对于具有简单数据需求的此方案,使用shared_preferences包是另一种考虑因素。但我喜欢本地存储,因为它干净而简单。