如何使用Flutter保存到本地存储?

时间:2016-12-28 20:58:57

标签: flutter

在Android中如果我有信息我希望跨会话持续存在,我知道我可以使用SharedPreferences或创建SQLite数据库,甚至可以将文件写入设备并在以后阅读。

有没有办法只使用Flutter保存和恢复这样的数据?或者我是否需要像services example

那样为Android和iOS编写特定于设备的代码

11 个答案:

答案 0 :(得分:74)

有几个选择:

答案 1 :(得分:30)

如果你想要保存一个你想稍后提到的小值的情况。那么你应该使用shared_preferences

将你的数据存储为键值数据

但如果你想存储大数据,你应该使用SQLITE

但是,您始终可以使用可离线使用的firebase数据库

由于我们讨论的是本地存储,您始终可以读取和写入磁盘文件

其他解决方案:

答案 2 :(得分:10)

您可以使用flutter官方插件中的共享偏好。  https://github.com/flutter/plugins/tree/master/packages/shared_preferences

它使用Android的共享首选项,适用于iOS的NSUserDefaults。

答案 3 :(得分:8)

一个较晚的答案,但我希望它也会对以后访问此地的人有所帮助?..

我将提供要保存的类别及其各自的最佳方法...

  1. 共享的首选项 在存储中存储简单值时使用此设置,例如颜色主题,应用程序语言,上一个滚动位置(在阅读应用程序中)。这些是您希望在应用程序重新启动时保留的简单设置。 但是,您可以使用它来存储大型内容(列表,地图,图像),但需要进行序列化和反序列化。。要了解有关这种反序列化和序列化的更多信息,请转到here。 / li>
  2. 文件 当您拥有更多由您定义的数据(例如日志文件,图像文件,也许您想导出csv文件)时,这很有用。我听说一旦磁盘空间不足,存储清理器可以清除这种持久性..不确定,因为我从未见过.. 除了序列化和反序列化之外,它还可以存储几乎所有内容。
  3. 保存到数据库 这对于有点复杂的数据非常有帮助。而且我认为这不会被光盘清洁器冲走,因为它存储在 AppData (适用于android)中。 这样,您的数据将存储在SQLite数据库中。其插件为SQFLite。 您可能希望在此处输入的数据种类类似于可以由数据库表示的所有内容。

答案 4 :(得分:2)

如果您只需要存储API令牌或登录数据之类的简单值(而不是密码!),这就是我使用的方法:

import 'package:shared_preferences/shared_preferences.dart';

asyncFunc() async { // Async func to handle Futures easier; or use Future.then
  SharedPreferences prefs = await SharedPreferences.getInstance();
}
...

// Set
prefs.setString('apiToken', token);

// Get
String token = prefs.getString('apiToken');

// Remove
prefs.remove('apiToken');

别忘了在您的pubspec.yaml(保留间隔格式)中添加shared_preferences依赖项:

dependencies:

  shared_preferences: any

答案 5 :(得分:1)

有一些选择:

Moor:Dart的持久性库

读写文件

颤振的共享首选项插件

SQlite扑扑

答案 6 :(得分:1)

您可以使用 Localstorage

1-pubspec.yamlChange the version based on the last)添加依赖项

dependencies:
  ...
  localstorage: ^3.0.0

2-然后运行以下命令

flutter packages get

3-导入本地存储:

import 'package:localstorage/localstorage.dart';

4-创建实例

class MainApp extends StatelessWidget {
  final LocalStorage storage = new LocalStorage('localstorage_app');
  ...
}

添加项目到lcoalstorage:

void addItemsToLocalStorage() {
  storage.setItem('name', 'Abolfazl');
  storage.setItem('family', 'Roshanzamir');

  final info = json.encode({'name': 'Darush', 'family': 'Roshanzami'});
  storage.setItem('info', info);
}

获取来自lcoalstorage的物品:

void getitemFromLocalStorage() {
  final name = storage.getItem('name'); // Abolfazl
  final family = storage.getItem('family'); // Roshanzamir
  
  Map<String, dynamic> info = json.decode(storage.getItem('info'));
  final info_name=info['name'];
  final info_family=info['family'];
}

删除来自本地存储的项目:

void removeItemFromLocalStorage() {
  storage.deleteItem('name');
  storage.deleteItem('family');
  storage.deleteItem('info');
}

答案 7 :(得分:0)

我认为,如果要在本地存储中存储大量数据,则可以使用sqflite库。设置非常容易,我亲自使用过一些测试项目,效果很好。

https://github.com/tekartik/sqflite 本教程-https://proandroiddev.com/flutter-bookshelf-app-part-2-personal-notes-and-database-integration-a3b47a84c57

如果要将数据存储在云中,则可以使用firebase。这是Google提供的可靠服务。

https://firebase.google.com/docs/flutter/setup

答案 8 :(得分:0)

对于那些来自android并错过 Room 的人,您可以使用 Floor ,它与android中的Room库相同。

您可以在pubgithub

中看到它

答案 9 :(得分:0)

您可以使用SharedPreferences处理少量数据。但是,如果您有庞大而复杂的数据,则应使用Sqlite Database在Flutter应用程序中进行本地存储。

答案 10 :(得分:0)

我一直在寻找相同,简单的本地存储,但又具有合理的安全级别。我发现最有意义的两个解决方案是:flutter_secure_storage(如Raouf所述)用于小型数据集,hive用于大型数据集。