Używam shared_preferences
w mojej aplikacji Flutter na iOS i Androida. W sieci używam samej http:dart
zależności ( window.localStorage
). Ponieważ Flutter dla sieci został włączony do repozytorium Flutter, chcę stworzyć rozwiązanie dla wielu platform.
Oznacza to, że muszę zaimportować dwa osobne interfejsy API. Wydaje się, że nie jest to jeszcze zbyt dobrze obsługiwane w Dart, ale to właśnie zrobiłem:
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';
W moim preference_utils_stub.dart
pliku zaimplementowałem wszystkie klasy / zmienne, które muszą być widoczne podczas kompilacji:
Window window;
class SharedPreferences {
static Future<SharedPreferences> get getInstance async {}
setString(String key, String value) {}
getString(String key) {}
}
class Window {
Map<String, String> localStorage;
}
Pozbywa się to wszystkich błędów przed kompilacją. Teraz zaimplementowałem jakąś metodę, która sprawdza, czy aplikacja korzysta z sieci, czy nie:
static Future<String> getString(String key) async {
if (kIsWeb) {
return window.localStorage[key];
}
SharedPreferences preferences = await SharedPreferences.getInstance;
return preferences.getString(key);
}
Daje to jednak mnóstwo błędów:
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];
I tak dalej. Jak można korzystać z różnych metod / klas w zależności od platformy bez tych błędów? Zauważ, że w ten sposób korzystam z większej liczby zależności, a nie tylko preferencji. Dzięki!
źródło
localstorage
ishared preferences
zależności w tej samej metodzie lub klasie. Oznacza to, że kompilator nie może wstrząsnąć żadną z tych zależności. Idealnie import powinien ukryć te implementacje. Spróbuję wymyślić jasny przykład implementacji.Odpowiedzi:
Oto moje podejście do twojego problemu. Jest to oparte na implementacjach z
http
pakietu, jak tutaj .Podstawowa idea jest następująca.
web
iandroid
zależne, które rozszerzają tę klasę abstrakcyjną.mobile
iweb
. Następnie w konstruktorze fabrycznym zwróć instancję konkretnej implementacji. Zostanie to obsłużone automatycznie przez import warunkowy, jeśli zostanie poprawnie napisany.Krok 1 i 4:
Krok 2.1: Wyszukiwarka kluczy internetowych
Krok 2.2: Wyszukiwarka kluczy mobilnych
Krok 3:
Następnie
main.dart
wykorzystajKeyFinder
klasę abstrakcyjną, jakby to była ogólna implementacja. To jest trochę jak wzorzec adaptera .main.dart
kilka zrzutów ekranu
Sieć
mobilny
źródło
dart:html' and
wspólnych preferencji w tej samej funkcji, kompilator wygeneruje błędy, ponieważ nie będzie wiedział odart:html
kompilacji na urządzeniu mobilnym, a wręcz przeciwnie, nie będzie wiedział osharedpreferences
kompilacji w sieci, chyba że jego autorzy radzić sobie z tym wewnętrznie. Udostępnij, jeśli masz działający przykład wykorzystujący tę flagę. Jestem również nowy, aby trzepotać :).