我正在使用本地存储软件包-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)
,保存应用程序并重新运行该应用程序,该应用程序将打印出“存储级别:null”。
从上次运行应用程序起,如何使存储持久化?
我正在使用Xcode iPhone模拟器。
任何帮助将不胜感激!
答案 0 :(得分:2)
通过查看程序包的源代码,您似乎没有给它足够的时间来加载来自底层异步调用的数据。因此,它公开了一个flag属性供您检查是否准备好执行读/写操作。
仅在打印之前使用它,
storage.ready.then((_) => printStorage());
答案 1 :(得分:0)
我有类似的问题,但是经过数小时的测试和深入研究,我可以确认即使关闭了应用程序,localstorage包也确实保留了数据。如果您想查看实际的数据库文件以进行测试(您可以看到内容在iOS模拟过程中实时更改),请在macOS上查看:
/Users/YOURUSERNAME/Library/Developer/CoreSimulator/Devices/SOMEDEVICENUMBER/data/Containers/Data/Application/SOMEAPPLICATIONNUMBER/Documents/level.json
因此,这意味着在尝试读取和使用值之前,需要等待几纳秒的时间才能准备好本地存储连接。对Dart / Flutter来说,这是新手,对我来说,这意味着尝试使用异步/等待或未来/然后的正确组合和位置。
例如,此更改将在示例应用程序中正常运行:
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());
}
在我的实际应用中,如果忘记正确放置“ await”或“ then”,在获取/分配实际值之前,我会收到很多空错误。
在文件(level.json)中,顺便说一句,您只有一个元素{“ level”,“ 0”}。对于这种具有简单数据需求的方案,可以使用shared_preferences包。但是我喜欢localstorage,因为它干净整洁。