【问题标题】:Flutter - Conditional library import in flutter-webFlutter - flutter-web 中的条件库导入
【发布时间】:2020-02-28 09:47:29
【问题描述】:

假设 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 中只为移动设备导入了一个库。详情here(感谢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/');

【问题讨论】:

  • 我知道这不是问题的核心,只是一个例子,但我刚刚更新了 audioplayers 包中的 AudioCache 类以完全支持 web :)

标签: flutter dart import flutter-web


【解决方案1】:

在与您的要求相似的堆栈溢出question 中,我根据http 包中的此实现编写了一个答案。

我认为您也可以使用类似的方法来处理这种条件依赖。我提供了一个工作示例there。我在这里引用答案。

核心思想如下。

  1. 创建一个抽象类来定义您需要在一般情况下使用的方法。
  2. 创建特定于 webandroid 依赖项的实现,以扩展此抽象类。
  3. 创建一个存根,它公开一个方法以返回此抽象实现的实例。这只是为了让飞镖分析工具满意。
  4. 在抽象类中导入此存根文件以及特定于mobileweb 的条件导入。然后在其工厂构造函数中返回具体实现的实例。如果编写正确,这将通过条件导入自动处理。

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 2017-11-26
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2020-05-15
    • 2019-01-13
    • 2021-06-21
    相关资源
    最近更新 更多