Estou usando shared_preferences
no meu aplicativo Flutter para iOS e Android. Na web, estou usando a própria http:dart
dependência ( window.localStorage
). Como o Flutter for web foi mesclado ao repositório do Flutter, desejo criar uma solução de plataforma cruzada.
Isso significa que eu preciso importar duas APIs separadas. Ainda não parece ser muito bom para o Dart, mas foi o que fiz:
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';
No meu preference_utils_stub.dart
arquivo, implementei todas as classes / variáveis que precisam estar visíveis durante o tempo de compilação:
Window window;
class SharedPreferences {
static Future<SharedPreferences> get getInstance async {}
setString(String key, String value) {}
getString(String key) {}
}
class Window {
Map<String, String> localStorage;
}
Isso elimina todos os erros antes da compilação. Agora eu implementei algum método que verifica se o aplicativo está usando a web ou não:
static Future<String> getString(String key) async {
if (kIsWeb) {
return window.localStorage[key];
}
SharedPreferences preferences = await SharedPreferences.getInstance;
return preferences.getString(key);
}
No entanto, isso fornece muitos erros:
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];
E assim por diante. Como se pode usar métodos / classes diferentes, dependendo da plataforma, sem esses erros? Observe que estou usando mais dependências dessa maneira, não apenas preferências. Obrigado!
fonte
localstorage
eshared preferences
no mesmo método ou classe. Isso significa que o compilador não pode agitar em árvore as duas dependências. Idealmente, a importação deve ocultar essas implementações. Vou tentar criar um exemplo claro de implementação.Respostas:
Aqui está a minha abordagem para o seu problema. Isso é baseado nas implementações do
http
pacote, como aqui .A idéia central é a seguinte.
web
eandroid
dependências que estendem essa classe abstrata.mobile
eweb
. Em seguida, em seu construtor de fábrica, retorne a instância da implementação específica. Isso será tratado automaticamente por importação condicional, se escrito corretamente.Etapa 1 e 4:
Etapa 2.1: Localizador de chave da Web
Etapa 2.2: Localizador de chave móvel
Etapa 3:
Então, no seu
main.dart
uso, aKeyFinder
classe abstract como se fosse uma implementação genérica. É um pouco como um padrão de adaptador .main.dart
algumas capturas de tela
Rede
Móvel
fonte
dart:html' and
preferências compartilhadas na mesma função, o compilador gerará erros porque não saberádart:html
quando estiver compilando em um dispositivo móvel e, pelo contrário, não saberásharedpreferences
quando estiver compilando na web, a menos que seus autores lidar com isso internamente. Compartilhe se você tiver um exemplo de trabalho utilizando esse sinalizador. Eu também sou novo em agitar :).