shared_preferences
iOSおよびAndroid用のFlutterアプリケーションで使用しています。Webでは、http:dart
依存関係(window.localStorage
)自体を使用しています。Flutter for webがFlutterリポジトリに統合されたので、クロスプラットフォームソリューションを作成したいと考えています。
つまり、2つの別個のAPIをインポートする必要があります。これはまだDartでサポートされているようには見えませんが、これは私がやったことです:
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';
私のpreference_utils_stub.dart
ファイルでは、コンパイル時に表示する必要があるすべてのクラス/変数を実装しました。
Window window;
class SharedPreferences {
static Future<SharedPreferences> get getInstance async {}
setString(String key, String value) {}
getString(String key) {}
}
class Window {
Map<String, String> localStorage;
}
これにより、コンパイル前にすべてのエラーが取り除かれます。次に、アプリケーションがWebを使用しているかどうかをチェックするメソッドを実装しました。
static Future<String> getString(String key) async {
if (kIsWeb) {
return window.localStorage[key];
}
SharedPreferences preferences = await SharedPreferences.getInstance;
return preferences.getString(key);
}
ただし、これにより多くのエラーが発生します。
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];
等々。これらのエラーなしで、プラットフォームに応じて異なるメソッド/クラスをどのように使用できますか?この方法では、設定だけでなく、より多くの依存関係を使用していることに注意してください。ありがとう!
アプリがウェブ上で実行するようにコンパイルされているかどうかを通知できるグローバルブールkIsWebを使用できます。ドキュメント:api.flutter.dev/flutter/foundation/kIsWeb-constant.html if(kIsWeb){// Web上で実行されます!ウェブデータベースの初期化} else {//共有設定を使用}
—
Shamik Chodankar
localstorage
とshared preferences
依存関係の両方を持つべきではありません。これは、コンパイラがこれらの依存関係のいずれかをツリーシェークできないことを意味します。理想的には、インポートはこれらの実装を隠す必要があります。明確な実装例を考え出します。