Dart 在Flatter中关闭应用程序后,如何保持本地存储?

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

我正在使用localstorage包-

这是我的代码:

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,因为它干净、简单。

在我感到困惑之后,我可以确认这是有效的。非常感谢。