Estoy usando shared_preferences
mi aplicación Flutter para iOS y Android. En la web estoy usando la http:dart
dependencia ( window.localStorage
) en sí. Como Flutter para web se fusionó con el repositorio de Flutter, quiero crear una solución multiplataforma.
Esto significa que necesito importar dos API separadas. Parece que esto todavía no es muy bueno en Dart, pero esto es lo que hice:
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';
En mi preference_utils_stub.dart
archivo, implementé todas las clases / variables que deben ser visibles durante el tiempo de compilación:
Window window;
class SharedPreferences {
static Future<SharedPreferences> get getInstance async {}
setString(String key, String value) {}
getString(String key) {}
}
class Window {
Map<String, String> localStorage;
}
Esto elimina todos los errores antes de la compilación. Ahora implementé algún método que verifica si la aplicación está usando la web o no:
static Future<String> getString(String key) async {
if (kIsWeb) {
return window.localStorage[key];
}
SharedPreferences preferences = await SharedPreferences.getInstance;
return preferences.getString(key);
}
Sin embargo, esto da muchos errores:
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];
Y así. ¿Cómo se pueden usar diferentes métodos / clases dependiendo de la plataforma sin estos errores? Tenga en cuenta que estoy usando más dependencias de esta manera, no solo preferencias. ¡Gracias!
fuente
localstorage
yshared preferences
en el mismo método o clase. Esto significa que el compilador no puede sacudir los árboles de ninguna de estas dependencias. Idealmente, la importación debería ocultar estas implementaciones. Trataré de llegar a un claro ejemplo de implementación.Respuestas:
Aquí está mi enfoque a su problema. Esto se basa en las implementaciones del
http
paquete como aquí .La idea central es la siguiente.
web
yandroid
dependencias que extiendan esta clase abstracta.mobile
yweb
. Luego, en su constructor de fábrica, devuelva la instancia de la implementación específica. Esto se manejará automáticamente mediante importación condicional si se escribe correctamente.Paso 1 y 4:
Paso 2.1: buscador de claves web
Paso 2.2: buscador de clave móvil
Paso 3:
Luego, en su
main.dart
uso, laKeyFinder
clase abstracta como si fuera una implementación genérica. Esto es algo así como un patrón adaptador .main.dart
algunas capturas de pantalla
Web
móvil
fuente
dart:html' and
preferencias compartidas en la misma función, el compilador generará errores porque no sabrádart:html
cuando compila contra un dispositivo móvil y, por el contrario, no sabrásharedpreferences
cuando compila contra la web a menos que sus autores manejarlo internamente. Comparta si tiene un ejemplo de trabajo que utiliza esta bandera. También soy nuevo en aleteo :).