Estoy usando shared_preferencesmi aplicación Flutter para iOS y Android. En la web estoy usando la http:dartdependencia ( 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.dartarchivo, 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

localstorageyshared preferencesen 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
httppaquete como aquí .La idea central es la siguiente.
webyandroiddependencias que extiendan esta clase abstracta.mobileyweb. 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.dartuso, laKeyFinderclase abstracta como si fuera una implementación genérica. Esto es algo así como un patrón adaptador .main.dartalgunas capturas de pantalla
Web

móvil
fuente
dart:html' andpreferencias compartidas en la misma función, el compilador generará errores porque no sabrádart:htmlcuando compila contra un dispositivo móvil y, por el contrario, no sabrásharedpreferencescuando 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 :).