web-dev-qa-db-fra.com

Flutter - Importation conditionnelle de bibliothèque dans flutter-web

En supposant que audioplayers|lib/audio_cache.Dart ne fonctionnait que sur Android/iOS, j'exclus conditionnellement l'importation suivante à partir d'un fichier Dart:

import "package:audioplayers/audio_cache.Dart"

de la manière suivante:

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

où "Dart: math" peut être n'importe quel fichier Dart fake_stub. En bref, cela importe une bibliothèque uniquement pour les appareils mobiles dans Flutter. Détails ici (merci Alois Deniel !).

Quelle serait la meilleure façon de masquer le code spécifique à la plate-forme dans l'implémentation de 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');
         }
     }
 }

Cet essai naïf échoue sur AudioCache référence bien sûr.

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

Dans ce débordement de pile question qui a des exigences similaires aux vôtres, j'ai écrit une réponse basée sur cette implémentation de http package.

Je pense que vous pouvez également utiliser une approche similaire pour gérer ces dépendances conditionnelles. J'ai fourni un exemple de travail . Je cite la réponse ici.

L'idée centrale est la suivante.

  1. Créez une classe abstraite pour définir les méthodes que vous devrez utiliser en général.
  2. Créez des implémentations spécifiques aux dépendances web et Android qui étendent cette classe abstraite.
  3. Créez un stub qui expose une méthode pour renvoyer l'instance de cette implémentation abstraite. C'est seulement pour garder l'outil d'analyse Dart heureux.
  4. Dans la classe abstraite, importez ce fichier de raccord avec les importations conditionnelles spécifiques à mobile et web. Ensuite, dans son constructeur d'usine, retournez l'instance de l'implémentation spécifique. Cela sera géré automatiquement par importation conditionnelle s'il est écrit correctement.
1