Flutter Shared Preferences. Как сохранять и получать данные из локального хранилища

Flutter Shared Preferences. Как сохранять и получать данные из локального хранилища

Введение

Рано или поздно приходит необходимость сохранять информацию и иметь к ней доступ даже после перезапуска приложения. Как правило, для больших объемов информации используется база данных, но ее использование не целесообразно, например, для хранения пользовательских настроек. В данном примере больше подошло бы другое хранилище, что-то вроде словаря, в котором по одному ключу мы бы сохранили, например, выбранный пользователем язык, по другому - выбранную тему, по третьему - еще что-то, и так далее. Такие хранилища существуют в Android, iOS и других платформах.

Platform      Location
Android SharedPreferences
iOS NSUserDefaults
Linux In the XDG_DATA_HOME directory
macOS NSUserDefaults
Web LocalStorage
Windows In the roaming AppData directory

Для того чтобы взаимодействовать с данными хранилищами, используя Flutter необходим пакет shared_preferences.

Установка

Для добавления пакета в проект необходимо воспользоваться командой:

flutter pub add shared_preferences

Либо добавить в файл pubspec.yaml в секцию dependencies следующую строку:

shared_preferences: ^2.0.15

Вместо ^2.0.15 указывается последняя версия.

Далее, в начале функции main() необходимо добавить:

  WidgetsFlutterBinding.ensureInitialized();

Использование

Изначально, необходимо создать переменную:

final prefs = await SharedPreferences.getInstance();

Для сохранения разных типов данных используются методы:

// Сохраняет целочисленное значение по ключу 'counter'.
await prefs.setInt('counter', 10);
// Сохраняет значение типа Bool по ключу 'repeat'.
await prefs.setBool('repeat', true);
// Сохраняет значение типа Double по ключу 'decimal'.
await prefs.setDouble('decimal', 1.5);
// Сохраняет строку по ключу 'action'.
await prefs.setString('action', 'Start');
// Сохраняет список строк по ключу 'items'.
await prefs.setStringList('items', <String>['Earth', 'Moon', 'Sun']);

Для чтения разных типов данных используются методы:

// Считывает целочисленное значение по ключу 'counter'.
await prefs.getInt('counter', 10);
// Считывает значение типа Bool по ключу 'repeat'.
await prefs.getBool('repeat', true);
// Считывает значение типа Double по ключу 'decimal'.
await prefs.getDouble('decimal', 1.5);
// Считывает строку по ключу 'action'.
await prefs.getString('action', 'Start');
// Считывает список строк по ключу 'items'.
await prefs.getStringList('items', <String>['Earth', 'Moon', 'Sun']);

Проверка, что данные по ключу существуют:

await prefs.containsKey('counter');

Удаление данных по ключу:

await prefs.remove('counter');

 Полное удаление всех данных:

await prefs.clear();

Пример

Flutter демо приложение, которое сохраняет значение счетчика даже после перезапуска приложения:

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static const counterKey = 'counter';

  int _counter = 0;

  @override
  void initState() {
    _initCounter();
    super.initState();
  }

  Future _initCounter() async {
    _counter = await _getCounter();
  }

  void _incrementCounter() async {
    setState(() {
      _counter++;
    });

    await _setCounter();
  }

  Future _setCounter() async {
    final prefs = await SharedPreferences.getInstance();
    prefs.setInt(counterKey, _counter);
  }

  Future<int> _getCounter() async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.getInt(counterKey) ?? 0;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

Полезные ссылки

Как сохранять объекты используя shared preferences
Как сохранять DateTime используя shared preferences

Телеграм: https://t.me/the_cybermania
Исходный код: https://github.com/AlexeyShpavda/shared_preferences
Видео: https://www.youtube.com/watch?v=Y4moxaiDoEg

 

Read More