131

在 Android 中,如果我有想要在会话中保留的信息,我知道我可以使用 SharedPreferences 或创建 SQLite 数据库,甚至将文件写入设备并稍后读取。

有没有办法只使用 Flutter 来保存和恢复这样的数据?或者我是否需要像服务示例中那样为 Android 和 iOS 编写特定于设备的代码?

4

10 回答 10

146

There are a few options:

于 2017-01-03T16:55:57.243 回答
73

如果您处于想要保存稍后想要参考的小值的情况。那么您应该使用 shared_preferences 将数据存储为键值数据

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

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

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

其他解决方案:

于 2018-06-14T04:49:28.677 回答
17

一个迟到的答案,但我希望它对以后访问这里的人也有帮助..

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

  1. 共享首选项 在存储中存储简单值时使用此选项,例如颜色主题、应用程序语言、最后滚动位置(在阅读应用程序中)。这些是您希望在应用程序重新启动时保留的简单设置。但是,您可以使用此选项存储大的东西(列表、地图、图像),但这需要序列化和反序列化。要了解更多关于这种反序列化和序列化的信息,请访问此处
  2. 文件 当您拥有更多由您定义的数据时,这很有帮助,例如日志文件、图像文件,也许您想导出 csv 文件。我听说一旦磁盘用完,这种类型的持久性可以被存储清理器清洗空间..我不确定,因为我从未见过它..除了序列化和反序列化的帮助之外,这也可以存储几乎任何东西..
  3. 保存到数据库 这对于有点复杂的数据非常有用。而且我认为这不会被磁盘清洁器洗掉,因为它存储在AppData(适用于 android)中。在这种情况下,您的数据存储在 SQLite 数据库中。它的插件是SQFLite。您可能想要放在这里的各种数据就像可以由数据库表示的所有数据一样。
于 2020-03-13T07:56:59.990 回答
13

您可以使用来自 Flutter 官方插件的 共享首选项。https://github.com/flutter/plugins/tree/master/packages/shared_preferences

它对 Android 使用 Shared Preferences,对 iOS 使用 NSUserDefaults。

于 2017-05-23T23:22:47.717 回答
10

如果您只需要存储简单的值,例如 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');

不要忘记shared_preferences在 pubspec.yaml 中添加依赖项(保留间距格式):

dependencies:

  shared_preferences: any
于 2019-04-04T08:46:46.710 回答
7

有几个选项:

Moor:Dart 的持久性库

读写文件

颤振的共享首选项插件

颤振的 SQlite

于 2019-10-24T13:22:12.663 回答
4

您可以使用本地存储

flutter pub add localstorage

1-添加依赖项pubspec.yaml根据最后一个更改版本

dependencies:
  ...
  localstorage: ^4.0.0+1

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'];
}

从 localstorage 中删除一个项目:

void removeItemFromLocalStorage() {
  storage.deleteItem('name');
  storage.deleteItem('family');
  storage.deleteItem('info');
}
于 2020-10-07T21:58:41.750 回答
1

我认为如果您要在本地存储中存储大量数据,您可以使用 sqflite 库。它很容易设置,我个人用于一些测试项目,效果很好。

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

如果您想将数据存储在云中,您可以使用 firebase。这是谷歌提供的可靠服务。

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

于 2018-07-30T16:48:00.400 回答
1

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

于 2020-12-08T21:38:26.290 回答
0

您可以将SharedPreferences用于少量数据。但是如果你有大而复杂的数据,那么你应该在 Flutter 应用程序中使用Sqlite 数据库进行本地存储。

于 2020-11-02T16:33:01.107 回答