Я использую shared_preferences
в своем приложении Flutter для iOS и Android. В Интернете я использую саму http:dart
зависимость ( window.localStorage
). Поскольку Flutter для веб-сайтов был объединен с репозиторием Flutter, я хочу создать кроссплатформенное решение.
Это означает, что мне нужно импортировать два отдельных API. Кажется, это еще не очень хорошо поддерживается в Dart, но это то, что я сделал:
import 'package:some_project/stub/preference_utils_stub.dart'
if (dart.library.html) 'dart:html'
if (dart.library.io) 'package:shared_preferences/shared_preferences.dart';
В моем preference_utils_stub.dart
файле я реализовал все классы / переменные, которые должны быть видны во время компиляции:
Window window;
class SharedPreferences {
static Future<SharedPreferences> get getInstance async {}
setString(String key, String value) {}
getString(String key) {}
}
class Window {
Map<String, String> localStorage;
}
Это избавляет от всех ошибок перед компиляцией. Теперь я реализовал некоторый метод, который проверяет, использует ли приложение Интернет или нет:
static Future<String> getString(String key) async {
if (kIsWeb) {
return window.localStorage[key];
}
SharedPreferences preferences = await SharedPreferences.getInstance;
return preferences.getString(key);
}
Тем не менее, это дает массу ошибок:
lib/utils/preference_utils.dart:13:7: Error: Getter not found:
'window'.
window.localStorage[key] = value;
^^^^^^ lib/utils/preference_utils.dart:15:39: Error: A value of type 'Future<SharedPreferences> Function()' can't be assigned to a
variable of type 'SharedPreferences'.
- 'Future' is from 'dart:async'.
- 'SharedPreferences' is from 'package:shared_preferences/shared_preferences.dart'
('../../flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-0.5.4+3/lib/shared_preferences.dart').
SharedPreferences preferences = await SharedPreferences.getInstance;
^ lib/utils/preference_utils.dart:22:14: Error: Getter not found:
'window'.
return window.localStorage[key];
И так далее. Как можно использовать разные методы / классы в зависимости от платформы без этих ошибок? Обратите внимание, что таким образом я использую больше зависимостей, а не просто настройки. Спасибо!
источник
localstorage
и другоеshared preferences
в одном методе или классе. Это означает, что компилятор не может согласовать любую из этих зависимостей. В идеале импорт должен скрывать эти реализации. Я постараюсь придумать четкий пример реализации.Ответы:
Вот мой подход к вашей проблеме. Это основано на реализациях из
http
пакета, как здесь .Основная идея заключается в следующем.
web
иandroid
зависимостей, расширяющих этот абстрактный класс.mobile
иweb
. Затем в конструктор фабрики возвращают экземпляр конкретной реализации. Это будет автоматически обработано условным импортом, если написано правильно.Шаг 1 и 4:
Шаг 2.1: Поиск ключей в Интернете
Шаг-2.2: Мобильный ключ поиска
Шаг 3:
Затем вы
main.dart
используетеKeyFinder
абстрактный класс, как если бы это была универсальная реализация. Это похоже на шаблон адаптера .main.dart
несколько скриншотов
Web
мобильный
источник
dart:html' and
sharedpreferences` в одной и той же функции, компилятор выдаст ошибки, потому что он не будет знать оdart:html
компиляции с мобильным устройством и, наоборот, не будет знать об этомsharedpreferences
при компиляции против веба, если только его авторы справиться с этим внутренне. Пожалуйста, поделитесь, если у вас есть рабочий пример, использующий этот флаг. Я также новичок, чтобы трепетать :).