Поиск по сайту:

Как использовать SharedPreferences для хранения настроек приложения с помощью Flutter


SharedPreferences — это модуль, обеспечивающий функциональность одноименного API Android для ваших кроссплатформенных приложений Flutter. Он использует аналогичный API NSUserDefaults от Apple при работе на iOS и macOS. Реализации также включены для Linux и Windows, поэтому он будет работать везде, где могут приложения Flutter.

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

Добавление общих настроек

Добавьте модуль SharedPreferences в свое приложение с помощью команды Flutter CLI pub add:

flutter pub add shared_preferences

Ссылайтесь на библиотеку в своем коде, импортировав ее в верхнюю часть файлов Dart:

import 'package:shared_preferences/shared_preferences.dart';

Вы сможете получить доступ к API SharedPreferences в файлах, содержащих этот оператор import.

Добавление данных в SharedPreferences

Чтобы начать использовать SharedPreferences, вы должны сначала получить экземпляр класса SharedPreferences, который подключен к файлу конфигурации вашего приложения на диске. Вызовите статический метод getInstance(), чтобы загрузить и проанализировать файл в экземпляре SharedPreferences. Это асинхронный метод, поэтому используйте ключевое слово await внутри функции async, чтобы упростить доступ.

void main() async {
    var prefs = await SharedPreferences.getInstance();
}

Теперь вы можете использовать методы экземпляра prefs для хранения и извлечения ваших данных. SharedPreferences работает с парами ключ-значение. Он поддерживает пять типов данных: int, String, bool, double и List. . Значения добавляются в хранилище с помощью методов установки; каждый метод принимает имя ключа в качестве первого параметра и значение в качестве второго:

prefs.setBool("darkTheme", true);

Чтобы работать с другими типами значений, вызовите соответствующие методы установки:

prefs.setString("theme", "dark");
 
prefs.setInt("sessionId", 1000);
 
prefs.setDouble("lastTemperature", 18.5);
 
prefs.setStringList("featureFlags", ["darkTheme", "redesign"]);

Сеттеры не принимают null в качестве значения. Используйте отдельный метод remove(), чтобы удалить элемент из магазина:

prefs.remove("sessionId");

Чтобы удалить все сохраненные настройки, вызовите метод clear(). Очистка — это асинхронные операции, которые разрешаются после удаления файла настроек на диске.

await prefs.clear();

Сложные типы

Вы не можете изначально сохранять сложные типы, такие как объекты, карты и нестроковые списки. Чтобы сохранить один из них, вы можете закодировать его как JSON и использовать метод setString():

import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';
 
void main () async {
    var bookmarkedArticles = [10, 15, 18];
    var prefs = await SharedPreferences.getInstance();
    prefs.setString("bookmarks", jsonEncode(bookmarkedArticles));
}

Вызовите jsonDecode(), когда вы извлекаете значение с помощью getString() (см. ниже), чтобы преобразовать его обратно в соответствующий тип Dart.

Получение постоянных данных

Значения извлекаются с помощью методов получения. Как и в случае с сеттерами, для каждого поддерживаемого типа данных существует уникальный геттер. Это означает, что вы можете безопасно использовать возвращаемые значения без необходимости ручного приведения типов.

var theme = prefs.getString("theme");
// "dark"
 
var sessionId = prefs.getInt("sessionId");
// 1000
 
var lastTemperature = prefs.getDouble("lastTemperature");
// 18.5

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

Null возвращается, когда ключ не существует в сохраненных данных. Вы можете заранее проверить наличие товара в магазине, вызвав containsKey():

if (prefs.containsKey("theme")) {
    // ...
}

Также можно перечислить все ключи в хранилище:

var keys = pref.getKeys();

Это полезно, когда вам нужно знать, что в настоящее время сохранено на диске, чтобы вы могли выполнить соответствующие миграции после обновления приложения.

Предостережения и ограничения

С SharedPreferences легко работать, когда вы храните простые пары ключ-значение. Однако вы не должны полагаться на него для критически важных данных или значений, важных для безопасности.

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

SharedPreferences — это асинхронный API. Хотя методы получения и установки выглядят так, как будто они синхронны, это не распространяется на уровень диска. Запись на диск может быть асинхронной, поэтому закрытие приложения сразу после установки значения может привести к его потере.

Лучше выбрать другой API, если вы храните большие объемы данных, записываете сложные значения или вам нужна более надежная операционная модель с устойчивой обработкой ошибок. Вы можете использовать Files API для записи пользовательского файла конфигурации в место с ограниченным доступом или создать базу данных SQLite для своего приложения. Последний подход идеален, когда вы хотите выполнять расширенные запросы к сохраненным данным.

Написание модульных тестов

SharedPreferences включает утилиту, помогающую писать модульные тесты без реального хранилища настроек. Статический метод setMockInitialValues() позволяет вводить значения, которые будут заполнять экземпляр, возвращаемый getInstance():

void main() async {
 
    Map<String, Object> values = <String, Object>{"foo": "bar"};
    SharedPreferences.setMockInitialValues(values);
 
    var instance = await SharedPreferences.getInstance();
    var foo = instance.getString("foo");
    // bar
 
}

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

Краткое содержание

SharedPreferences — это удобный способ сохранить простое состояние внутри вашего приложения Flutter. Основное внимание уделяется хранению и извлечению пар ключ-значение с использованием наиболее распространенных типов данных. SharedPreferences лучше всего использовать для несущественных настроек, когда сбой записи не окажет негативного влияния на ваше приложение.

Может быть эффективно использовать SharedPreferences аналогично файлам cookie в веб-приложениях. Основные счетчики, логические значения и ключи конфигурации имеют смысл в SharedPreferences; все остальное относится к четко определенной структуре данных, которой вы можете более точно управлять.




Все права защищены. © Linux-Console.net • 2019-2024