我使用的是Flutter 2.5.2。我有一个项目,这是用于网络和移动(安卓/ iOS)。
有一个特殊的小部件,在为web部署时,我需要使用一个版本的小部件,它使用JS和HTML包。当部署到移动设备时,我需要使用一个不同的版本,它只使用标准的Flutter小部件。(原因很复杂--我在flutter中嵌入了Unity )。
举个例子,我有一个用于web的web_player.dart
版本:
import 'dart:html' as html;
import 'package:js/js.dart';
import 'package:flutter/material.dart';
@JS('loadPlayer')
external String loadPlayer();
class WebVersion extends StatelessWidget {
const WebVersion({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
// Use the HTML package and return an HtmlElementView
}
}
这个mobile_player.dart
版本适用于移动设备:
class MobileVersion extends StatelessWidget {
const MobileVersion({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text("Mobile version")
}
}
为web构建是很好的。问题是,当我为移动端构建时,构建会中断:
Error: Not found: 'dart:js'
和
Error: Not found: 'dart:html'
我知道这些包在移动平台中并不存在,我正在尝试找到一种解决方法。我最初尝试根据kIsWeb
标志有条件地使用WebPlayer
或MobilePlayer
小部件,但这没有任何区别(我猜是因为kIsWeb不是一个编译时间常量?)
因此,我尝试使用条件导入来解决这个问题。因此,我创建了一个存根player_stub.dart
import 'package:flutter/material.dart';
Widget getPlayer() => throw UnsupportedError("This is a stub");
我将此存根导入到包装器Player
小部件中:
import 'package:mypackage/player_stub.dart'
if (dart.library.io) 'package:mypackage/mobile_player.dart'
if (dart.library.js) 'package:mypackage/web_player.dart';
class Player extends StatelessWidget {
const Player ();
@override
Widget build(BuildContext context) {
return getPlayer();
}
}
然后在我的mobile_player.dart
中添加了存根实现
Widget getPlayer() => MobilePlayer();
在我的web_player.dart
中
Widget getPlayer() => WebPlayer();
我希望这能通过编译时树抖动或其他方式解决构建错误,但它没有。
我该如何解决这个问题?我完全被难住了。
发布于 2021-10-08 04:09:41
我只想为其他寻找答案的人回答我自己的问题:解决方案是将存根、移动小部件和web小部件移动到单独的dart库中。
该库在其根my_player_package.dart
文件中使用如下条件导出:
export 'src/player_stub.dart'
if (dart.library.js) 'src/web_player.dart'
if (dart.library.io) 'src/mobile_player.dart';
因此,现在我在pubspec.yaml
中引用了单独的库
dependencies:
...
my_player_package:
path: ../my_player_package
我现在可以为web和移动设备进行import 'package:my_player_package/my_player_package.dart'
和构建。
https://stackoverflow.com/questions/69485846
复制相似问题