自定义Flutter资源变体(variant)

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的适配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值