Как сохранить в локальное хранилище с помощью Flutter?

103

В Android, если у меня есть информация, которую я хочу сохранять в сеансах, я знаю, что могу использовать SharedPreferences или создать базу данных SQLite или даже записать файл на устройство и прочитать его позже.

Есть ли способ сохранить и восстановить такие данные, просто используя Flutter? Или мне нужно написать код для конкретного устройства для Android и iOS, как в примере с услугами ?

Reagankm
источник

Ответы:

122

Есть несколько вариантов:

Сет Лэдд
источник
Я написал службу флаттера в SQLite доступа см github.com/ripple182/FlutterSQLiteSample
ripple182
возможно ли использование комнаты? что произойдет с ios, если я использую Room?
MNFS
1
Кажется, это лучше работает для общих предпочтений: pub.dev/packages/shared_preferences
Yster
Новый пакет github.com/lesnitsky/flutter_localstorage
Пабло Диас
54

Если вы находитесь в ситуации, когда вы хотите сэкономить небольшую сумму, о которой вы хотите обратиться позже. тогда вы должны хранить свои данные как данные ключ-значение, используя shared_preferences

но если вы хотите хранить большие данные, вам следует использовать SQLITE

однако вы всегда можете использовать базу данных firebase, которая доступна в автономном режиме

Поскольку мы говорим о локальном хранилище, вы всегда можете читать и записывать файлы на диск

Другие решения:

Рауф Рахиш
источник
как решить, когда использовать sqflite или firebase?
застрял overflow
1
sqfliteхранит только в телефоне. firebaseсинхронизируется в центральной базе данных, где вы можете выполнять запросы в своем бэкэнде. firebaseтакже упрощает синхронизацию между устройствами.
Feu
Обратите внимание, что Firebase Firestore по умолчанию имеет значение 10 МБ, может быть установлено не менее 1 МБ и не более 100 МБ. Не рекомендуется использовать только автономный доступ. Если вы планируете использовать это только в качестве локального хранилища и объем данных велик, вам, возможно, придется пересмотреть решение. firebase.google.com/docs/reference/android/com/google/firebase/…
Lander
Это должен быть предпочтительный ответ, потому что он просто объясняет, где искать в разных сценариях.
janpeterka
12

Вы можете использовать общие настройки из официальных плагинов flutter. https://github.com/flutter/plugins/tree/master/packages/shared_preferences

Он использует общие настройки для Android, NSUserDefaults для iOS.

Фуркан Тектас
источник
1
Это идеально подходит для больших баз данных?
temp_
1
@temp_ Я мало что знаю об iOS. Однако общие настройки на Android категорически не подходят для больших баз данных. Они записываются в файловую систему как простые XML-файлы и читаются из файловой системы, если требуется. В основном они используются для хранения настроек приложений и подобных вещей.
forgemo
Кажется, это лучше работает для общих настроек: pub.dev/packages/shared_preferences
Истер,
9

Если вам нужно хранить только простые значения, такие как токен 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
Джордж
источник
8

Поздний ответ, но я надеюсь, что он поможет и тем, кто приедет сюда позже😁 ..

Я предоставлю категории для сохранения и их соответствующие лучшие методы ...

  1. Общие настройки Используйте это при сохранении простых значений в хранилище, например цветовой темы, языка приложения, последней позиции прокрутки (в приложениях для чтения) .. это простые настройки, которые вы хотели бы сохранить при перезапуске приложения .. Однако вы можете использовать это для хранения больших объектов (списков, карт, изображений), но это потребует сериализации и десериализации .. Чтобы узнать больше об этой десериализации и сериализации, перейдите сюда .
  2. Файлы Это очень помогает, когда у вас есть данные, которые определены вами в большей степени, например файлы журналов, файлы изображений и, возможно, вы хотите экспортировать файлы csv. Я слышал, что этот тип сохраняемости может быть смыт очистителями хранилища, когда на диске закончится пространство .. Не уверен, так как я никогда не видел его .. Он также может хранить почти все, но с помощью сериализации и десериализации ..
  3. Сохранение в базу данных. Это очень полезно для немного сложных данных. И я думаю, что это не вымывается очистителями дисков, поскольку они хранятся в AppData (для Android). В этом случае ваши данные хранятся в базе данных SQLite. Его плагин - SQFLite . Виды данных, которые вы можете захотеть ввести сюда, похожи на все, что может быть представлено базой данных.
Эмануэль Санга
источник
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

Ишан Фернандо
источник
0

Вы можете использовать Localstorage

1- Добавить зависимость к pubspec.yaml( изменить версию на основе последней )

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');
}
AbolfazlR
источник
0

Вы можете использовать SharedPreferences для небольшого количества данных. Но если у вас есть большие и сложные данные, вам следует использовать базу данных Sqlite для локального хранения в приложениях flutter.

Друмил Шах
источник