J'utilise shared_preferences
dans mon application Flutter pour iOS et Android. Sur le Web, j'utilise lehttp:dart
dépendance ( window.localStorage
) elle-même. Depuis que Flutter pour le Web a été fusionné dans le référentiel Flutter, je souhaite créer une solution multiplateforme.
Cela signifie que je dois importer deux API distinctes. Cela ne semble pas encore très bien pris en charge dans Dart, mais c'est ce que j'ai fait:
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';
Dans mon preference_utils_stub.dart
fichier, j'ai implémenté toutes les classes / variables qui doivent être visibles lors de la compilation:
Window window;
class SharedPreferences {
static Future<SharedPreferences> get getInstance async {}
setString(String key, String value) {}
getString(String key) {}
}
class Window {
Map<String, String> localStorage;
}
Cela supprime toutes les erreurs avant la compilation. Maintenant, j'ai implémenté une méthode qui vérifie si l'application utilise le Web ou non:
static Future<String> getString(String key) async {
if (kIsWeb) {
return window.localStorage[key];
}
SharedPreferences preferences = await SharedPreferences.getInstance;
return preferences.getString(key);
}
Cependant, cela donne beaucoup d'erreurs:
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];
Etc. Comment peut-on utiliser différentes méthodes / classes selon la plateforme sans ces erreurs? Notez que j'utilise plus de dépendances de cette façon, pas seulement des préférences. Merci!
la source
localstorage
etshared preferences
dans la même méthode ou classe. Cela signifie que le compilateur ne peut pas secouer l'arborescence de ces dépendances. Idéalement, l'importation devrait masquer ces implémentations. Je vais essayer de trouver un exemple de mise en œuvre clair.Réponses:
Voici mon approche de votre problème. Ceci est basé sur les implémentations du
http
package comme ici .L'idée centrale est la suivante.
web
et desandroid
dépendances qui étendent cette classe abstraite.mobile
etweb
. Ensuite, dans son constructeur d'usine, retournez l'instance de l'implémentation spécifique. Cela sera géré automatiquement par importation conditionnelle s'il est écrit correctement.Étape 1 et 4:
Étape 2.1: Recherche de clé Web
Étape 2.2: Recherche de clé mobile
Étape 3:
Ensuite, dans votre
main.dart
utilisation, laKeyFinder
classe abstraite comme si c'était une implémentation générique. C'est un peu comme un modèle d'adaptateur .main.dart
quelques captures d'écran
la toile
mobile
la source
dart:html' and
préférences partagées dans la même fonction, le compilateur générera des erreurs car il ne saura pasdart:html
lors de la compilation sur un appareil mobile et au contraire il ne saura passharedpreferences
lors de la compilation sur le Web à moins que ses auteurs gérer en interne. Veuillez partager si vous avez un exemple de travail utilisant ce drapeau. Je suis également nouveau pour flotter :).