Flutter目前没有支持到像andrid一样自动获取对应环境的变体资源,代码区分多语言取图片资源麻烦且代码可读性不高,为此封装了一个简单的ImageProvider 用来自动匹配资源 。
先讲下用法规则 assets目录下面创建带多语言环境名的目录例如en_xxx
将英文的图片放在此目录下
使用Image控件的时候传入图片路径并且传入自定义的FitAssetImage
Image( image : FitAssetImage('assets/images/lucky_text_icon.png'), fit: BoxFit.fitWidth, width: constraints.biggest.width, )
用法规则和android开发使用基本一致
原理
Flutter的AssetBundle内部根据图片路径最后一节目录匹配n倍图这里我们继承AssetBundle根据ImageConfiguration.local去优先匹配带有locale文案的路径然后返回
核心代码
final SplayTreeMap<double, String> mapping = SplayTreeMap<double, String>();
for (final String candidate in candidates){
Uri url = Uri.parse(candidate);
var path = url.pathSegments[url.pathSegments.length - 2];
if(path.contains('${config.locale}')){
mapping[_parseScale(candidate)] = candidate;
}
}
if(mapping.isEmpty){
for (final String candidate in candidates.reversed)
if(!Uri.parse(candidate).pathSegments[Uri.parse(candidate).pathSegments.length - 2].contains('_'))
mapping[_parseScale(candidate)] = candidate;
}
时间原因 写的比较粗略 源码文件放在下方附件中 后面有时间补充对深色主题和sw的适配