在Flutter关闭应用程序后,如何使本地存储保持不变?

问题描述 投票:2回答:2

我正在使用包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模拟器。

任何帮助是极大的赞赏!

dart flutter
2个回答
2
投票

通过查看软件包的源代码,您似乎没有给它足够的时间来加载来自底层异步调用的数据。这就是为什么它为您公开一个标志属性,以检查它是否已准备好执行读/写操作。

只需在打印前使用它:

storage.ready.then((_) => printStorage());

0
投票

我有类似的问题,但经过几个小时的测试和挖掘,我可以确认即使在应用程序关闭后,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包是另一种考虑因素。但我喜欢本地存储,因为它干净而简单。

© www.soinside.com 2019 - 2024. All rights reserved.