Ich verwende shared_preferences
in meiner Flutter-Anwendung für iOS und Android. Im Web verwende ich die http:dart
Abhängigkeit ( window.localStorage
) selbst. Da Flutter for Web in das Flutter-Repo integriert wurde, möchte ich eine plattformübergreifende Lösung erstellen.
Dies bedeutet, dass ich zwei separate APIs importieren muss. Dies scheint in Dart noch nicht sehr gut unterstützt zu werden, aber das habe ich getan:
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';
In meiner preference_utils_stub.dart
Datei habe ich alle Klassen / Variablen implementiert, die während der Kompilierungszeit sichtbar sein müssen:
Window window;
class SharedPreferences {
static Future<SharedPreferences> get getInstance async {}
setString(String key, String value) {}
getString(String key) {}
}
class Window {
Map<String, String> localStorage;
}
Dadurch werden alle Fehler vor dem Kompilieren beseitigt. Jetzt habe ich eine Methode implementiert, die überprüft, ob die Anwendung das Web verwendet oder nicht:
static Future<String> getString(String key) async {
if (kIsWeb) {
return window.localStorage[key];
}
SharedPreferences preferences = await SharedPreferences.getInstance;
return preferences.getString(key);
}
Dies führt jedoch zu einer Vielzahl von Fehlern:
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];
Und so weiter. Wie kann man ohne diese Fehler je nach Plattform unterschiedliche Methoden / Klassen verwenden? Beachten Sie, dass ich auf diese Weise mehr Abhängigkeiten verwende, nicht nur Einstellungen. Vielen Dank!
quelle
localstorage
als auch dieshared preferences
Abhängigkeiten in derselben Methode oder Klasse haben. Dies bedeutet, dass der Compiler keine dieser Abhängigkeiten baumschütteln kann. Idealerweise sollte der Import diese Implementierungen verbergen. Ich werde versuchen, ein klares Implementierungsbeispiel zu finden.Antworten:
Hier ist meine Herangehensweise an Ihr Problem. Dies basiert auf den Implementierungen aus dem
http
Paket wie hier .Die Kernidee lautet wie folgt.
web
undandroid
Abhängigkeiten, die diese abstrakte Klasse erweitern.mobile
und spezifischen bedingten Importenweb
. Geben Sie dann in seinem Factory-Konstruktor die Instanz der spezifischen Implementierung zurück. Dies wird automatisch durch bedingten Import behandelt, wenn es richtig geschrieben ist.Schritt 1 und 4:
Schritt 2.1: Web Key Finder
Schritt 2.2: Mobile Key Finder
Schritt 3:
main.dart
Verwenden Sie dann in Ihrer Verwendung dieKeyFinder
abstrakte Klasse, als wäre sie eine generische Implementierung. Dies ähnelt einem Adaptermuster .main.dart
Einige Screenshots
Netz
Handy, Mobiltelefon
quelle
dart:html' and
der Compiler , wenn wir beide gemeinsam genutzten Einstellungen in derselben Funktion verwenden, Fehler generiert, da erdart:html
beim Kompilieren auf einem mobilen Gerät nichts darüber weiß und im Gegensatz dazu nichts über dassharedpreferences
Kompilieren gegen das Web weiß , es sei denn, seine Autoren intern damit umgehen. Bitte teilen Sie uns mit, wenn Sie ein funktionierendes Beispiel haben, das dieses Flag verwendet. Ich bin auch neu im Flattern :).