web-dev-qa-db-ja.com

Flutter-flutter-webでの条件付きライブラリのインポート

audioplayers|lib/audio_cache.DartはAndroid/iOSでのみ機能しました条件付きで除外 Dartファイルからの次のインポート:

import "package:audioplayers/audio_cache.Dart"

次のように:

import "Dart:math" if (Dart.library.io) "package:audioplayers/audio_cache.Dart";

ここで、「Dart:math」は任意のfake_stub Dartファイルです。つまり、これはFlutterのモバイルデバイスのライブラリのみをインポートするです。詳細 ここ (ありがとうAlois Deniel!).

Flutter-Web実装でプラットフォーム固有のコードを非表示にする最良の方法は何ですか?

 import 'Dart:io' show Platform;

 bool isMobile() => Platform.isAndroid || Platform.isIOS;

 class _MyPageState extends State<MyPage> {
     dynamic _audioPlayer;

     @override
     void initState() {
         if (isMobile()) {
            _audioPlayer = AudioCache(prefix: 'sounds/');
            _audioPlayer.load('mysound.mp3');
         }
     }
 }

もちろん、この素朴な試みはAudioCache参照では失敗します。

 Error: Method not found: 'AudioCache'.
  _audioPlayer = AudioCache(prefix: 'sounds/');

このスタックオーバーフロー question には、あなたと同じ要件があります http パッケージから、この実装に基づいて回答を書きました。

同様のアプローチを使用して、この条件付き依存関係を処理することもできると思います。実用的な例 there を提供しました。ここで答えを引用します。

基本的な考え方は次のとおりです。

  1. ジェネラルで使用する必要があるメソッドを定義する抽象クラスを作成します。
  2. この抽象クラスを拡張するwebおよびAndroid依存関係に固有の実装を作成します。
  3. この抽象実装のインスタンスを返すメソッドを公開するスタブを作成します。これは、Dart分析ツールの満足度を維持するためだけのものです。
  4. 抽象クラスでは、mobileおよびwebに固有の条件付きインポートとともに、このスタブファイルをインポートします。次に、そのファクトリコンストラクタで、特定の実装のインスタンスを返します。これは、正しく記述されていれば、条件付きインポートによって自動的に処理されます。
1