Dart 在Flatter中关闭应用程序后,如何保持本地存储?
我正在使用localstorage包- 这是我的代码:Dart 在Flatter中关闭应用程序后,如何保持本地存储?,dart,flutter,Dart,Flutter,我正在使用localstorage包- 这是我的代码: import 'package:flutter/material.dart'; import 'package:localstorage/localstorage.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { Widget build(BuildContext context) { return Material
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(
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:localstorage/localstorage.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
小部件构建(构建上下文){
返回材料PP(
主页:MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
_MyHomePageState createState()=>\u MyHomePageState();
}
最终本地存储=新本地存储(“级别”);
类_MyHomePageState扩展状态{
void initState(){
super.initState();
//存储。设置项(“级别”,0);
打印存储();
}
无效打印存储(){
打印(“存储级别:”+storage.getItem(“级别”).toString());
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“本地存储示例”),
),
正文:中(
),
);
}
}
当未注释掉storage.setItem(“级别”,0)
时,应用程序工作正常并打印出“存储的级别:0”。但是,关闭应用程序后,注释出storage.setItem(“level”,0)
,保存应用程序并重新运行应用程序,应用程序将打印出“level stored:null”
如何使应用程序上次运行时的存储保持不变
我正在使用Xcode iPhone模拟器
非常感谢您的帮助 通过查看包的源代码,您似乎没有给它足够的时间从底层异步调用加载数据。这就是为什么它会公开一个flag属性,让您检查它是否准备好执行读/写操作 只需在打印前使用它,如下所示:
storage.ready.then((_) => printStorage());
我也有类似的问题,但经过数小时的测试和深入研究,我可以确认localstorage软件包即使在应用程序关闭后也能保存数据。如果您想查看实际数据库文件以进行测试(您可以在iOS模拟过程中实时看到内容更改),请在macOS上查看以下内容:
/Users/YOURUSERNAME/Library/Developer/CoreSimulator/Devices/SOMEDEVICENUMBER/data/Containers/Data/Application/SOMEAPPLICATIONNUMBER/Documents/level.json
因此,这意味着在尝试读取和使用这些值之前,只需等待几纳秒本地存储连接就可以了。作为Dart/颤振新手,对我来说,这意味着要尝试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());
}
在我的实际应用程序中,如果我忘记正确地放置“wait”或“then”,那么在检索/分配实际值之前,我会收到很多空错误
顺便说一句,在文件(level.json)中只有一个元素,{“level”,“0”}。对于这种具有简单数据需求的场景,使用shared_preferences包是另一种考虑。但我喜欢localstorage,因为它干净、简单。在我感到困惑之后,我可以确认这是有效的。非常感谢。