假设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/');
在这个与您有类似要求的堆栈溢出问题中,我从http包中编写了一个基于此实现的答案。
我认为您也可以使用类似的方法来处理这种条件依赖关系。我在那里提供了一个工作示例。我在这里引用答案。
核心思想如下。
- 创建一个抽象类来定义需要在genral中使用的方法
- 创建特定于扩展此抽象类的
web
和android
依赖项的实现- 创建一个存根,该存根公开一个方法以返回该抽象实现的实例。这只是为了让飞镖分析工具满意
- 在抽象类中,导入此存根文件以及特定于
mobile
和web
的条件导入。然后在其工厂构造函数中返回特定实现的实例。如果写入正确,这将由条件导入自动处理