Flutter_web文档中提到了dart:svg被移植了,但是如何在flutter资产/小部件系统中使用呢?
说实话,我发现最好的解决办法是通过网络加载图像。在CDN上存储资产,在Web版中从CDN获取它,并在iOS / Android上从本地资产中检索它。
我使用这个库创建了一个CrossPlatformSvg小部件:https://pub.dev/packages/flutter_svg,类似于:
class CrossPlatformSvg {
static Widget asset(
String assetPath, {
double width,
double height,
BoxFit fit = BoxFit.contain,
Color color,
alignment = Alignment.center,
String semanticsLabel,
}) {
// `kIsWeb` is a special Flutter variable that just exists
// Returns true if we're on web, false for mobile
if (kIsWeb) {
return Image.network(
assetPath,
width: width,
height: height,
fit: fit,
color: color,
alignment: alignment,
);
} else {
return SvgPicture.network(
assetPath,
width: width,
height: height,
fit: fit,
color: color,
alignment: alignment,
placeholderBuilder: (_) => Container(
width: 30,
height: 30,
padding: EdgeInsets.all(30),
child: CircularIndicator(),
),
);
}
}
}
@aterenshkov的方法对我很有效(请参阅Jack答案下方的评论)。以下是实现细节...
iOS/Android
child: SvgPicture.asset('assets/yourimage.svg')
网络
// remove assets folder reference
child: SvgPicture.asset('yourimage.svg')
将这两者合并在一起...
import 'package:flutter/foundation.dart'; // provides kIsWeb property
...
child: kIsWeb ? SvgPicture.asset('yourimage.svg') : SvgPicture.asset('assets/yourimage.svg')
我的Flutter Web应用程序可以在桌面Web浏览器中呈现SVG,但在移动Web浏览器中不能使用 flutter_svg。我发现必须构建Canvaskit支持,才能使SVG在移动设备上呈现:
flutter build web --web-renderer canvaskit
@RumbleFish的代码虽然使用三元操作符很好,但是在许多情况下会使代码变得混乱。
我的解决方法是:
assets/
。
extension ForWeb on String {
String forWeb({required bool web}) => web ? this.replaceFirst('assets/','') : this;
}
SvgPicture.asset("assets/images/logo.png".forWeb(web: kIsWeb));