Saya menggunakan shared_preferences
dalam aplikasi Flutter saya untuk iOS dan Android. Di web saya menggunakan http:dart
dependensi ( window.localStorage
) itu sendiri. Karena Flutter untuk web digabungkan ke dalam repo Flutter, saya ingin membuat solusi lintas platform.
Ini berarti saya perlu mengimpor dua API terpisah. Ini sepertinya belum didukung dengan sangat baik di Dart, tapi inilah yang saya lakukan:
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';
Dalam preference_utils_stub.dart
file saya , saya menerapkan semua kelas / variabel yang perlu terlihat selama waktu kompilasi:
Window window;
class SharedPreferences {
static Future<SharedPreferences> get getInstance async {}
setString(String key, String value) {}
getString(String key) {}
}
class Window {
Map<String, String> localStorage;
}
Ini menghilangkan semua kesalahan sebelum kompilasi. Sekarang saya menerapkan beberapa metode yang memeriksa apakah aplikasi menggunakan web atau tidak:
static Future<String> getString(String key) async {
if (kIsWeb) {
return window.localStorage[key];
}
SharedPreferences preferences = await SharedPreferences.getInstance;
return preferences.getString(key);
}
Namun, ini memberikan banyak kesalahan:
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];
Dan seterusnya. Bagaimana seseorang dapat menggunakan metode / kelas yang berbeda tergantung pada platform tanpa kesalahan ini? Perhatikan bahwa saya menggunakan lebih banyak dependensi dengan cara ini, bukan hanya preferensi. Terima kasih!
sumber
localstorage
danshared preferences
dependensi dalam metode atau kelas yang sama. Ini berarti kompilator tidak dapat mengatur salah satu dari dependensi ini. Idealnya impor harus menyembunyikan implementasi ini. Saya akan mencoba memberikan contoh implementasi yang jelas.Jawaban:
Inilah pendekatan saya untuk masalah Anda. Ini didasarkan pada implementasi dari
http
paket seperti di sini .Gagasan intinya adalah sebagai berikut.
web
danandroid
dependensi yang memperluas kelas abstrak ini.mobile
danweb
. Kemudian dalam konstruktor pabriknya mengembalikan instance implementasi spesifik. Ini akan ditangani secara otomatis oleh impor bersyarat jika ditulis dengan benar.Langkah-1 dan 4:
Langkah-2.1: Pencari Kunci Web
Langkah-2.2: Pencari Kunci Seluler
Langkah-3:
Kemudian dalam Anda
main.dart
menggunakanKeyFinder
kelas abstrak seolah-olah ini merupakan implementasi generik. Ini agak seperti pola adaptor .main.dart
beberapa tangkapan layar
Web
ponsel
sumber
dart:html' and
sharedpreferences` dalam fungsi yang sama, kompiler akan menghasilkan kesalahan karena ia tidak akan tahu tentangdart:html
kapan kompilasi terhadap perangkat seluler dan sebaliknya itu tidak akan tahu tentangsharedpreferences
kapan kompilasi dengan web kecuali pembuatnya menanganinya secara internal. Silakan bagikan jika Anda memiliki contoh kerja menggunakan bendera ini. Saya juga baru mengepak :).