在Flutter中关闭应用程序后,如何使本地存储持久化?

时间:2019-03-10 01:03:02

标签: dart flutter

我正在使用本地存储软件包-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模拟器。

任何帮助将不胜感激!

2 个答案:

答案 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,因为它干净整洁。