如何自动为类的静态属性拼接默认前缀
如何自动为类的静态属性拼接默认前缀
嘿,手动给每个静态属性拼接baseDir确实有点麻烦,尤其是属性多了之后重复劳动还容易出错。给你几个更优雅的方案,完美解决这个问题:
方案一:枚举+扩展方法(优化版,告别长switch)
你之前尝试枚举觉得要写长switch?其实可以用扩展方法帮你自动拼接路径,甚至能根据枚举名自动生成文件名,省得手动写每个文件名:
// 先定义枚举,用驼峰命名对应文件名的下划线格式 enum AssetImageType { logoWhite, access, successful, unsuccessful, } // 给枚举加扩展方法,自动处理路径拼接 extension AssetImagePath on AssetImageType { String get path { const baseDir = '/assets/images/'; // 把驼峰枚举名转成下划线格式的文件名,比如logoWhite → logo_white.png final fileName = name.replaceAllMapped( RegExp(r'([A-Z])'), (match) => '_${match.group(0)!.toLowerCase()}' ) + '.png'; return '$baseDir$fileName'; } }
用的时候直接调用就行:
// 拿到完整路径:/assets/images/logo_white.png final logoPath = AssetImageType.logoWhite.path;
如果有个别文件名不符合驼峰转下划线的规则,也可以单独处理,不用写全量switch:
String get path { const baseDir = '/assets/images/'; switch(this) { // 特殊文件名单独指定 case AssetImageType.logoWhite: return '$baseDir/logo_white_custom.png'; // 其他的自动生成 default: final fileName = name.replaceAllMapped( RegExp(r'([A-Z])'), (match) => '_${match.group(0)!.toLowerCase()}' ) + '.png'; return '$baseDir$fileName'; } }
方案二:封装私有映射+统一getter
如果还是想用类的静态属性的形式,可以把文件名存在私有映射里,然后用统一的方法拼接路径,避免重复写${baseDir}:
class AssetImages { AssetImages._(); static const _baseDir = '/assets/images/'; // 把文件名存在映射里,key对应属性名 static const _imageFiles = { 'logoWhite': 'logo_white.png', 'access': 'access.png', 'successful': 'successful.png', 'unsuccessful': 'unsuccessful.png', }; // 每个属性调用统一的拼接方法 static String get logoWhite => _getFullPath('logoWhite'); static String get access => _getFullPath('access'); static String get successful => _getFullPath('successful'); static String get unsuccessful => _getFullPath('unsuccessful'); // 统一处理路径拼接的逻辑 static String _getFullPath(String key) => '$_baseDir${_imageFiles[key]}'; }
这样以后要改baseDir或者某个文件名,只需要改映射或者baseDir就行,不用逐个修改属性。
方案三:直接封装AssetImage(Flutter专属)
如果你是在Flutter项目里用,还可以直接返回AssetImage实例,用的时候更省心:
class AssetImages { AssetImages._(); static const _baseDir = 'assets/images/'; static AssetImage get logoWhite => AssetImage('$_baseDir/logo_white.png'); static AssetImage get access => AssetImage('$_baseDir/access.png'); static AssetImage get successful => AssetImage('$_baseDir/successful.png'); static AssetImage get unsuccessful => AssetImage('$_baseDir/unsuccessful.png'); }
用的时候直接拿AssetImages.logoWhite就能用,不用再手动创建AssetImage对象。
这几个方案都能帮你省去手动拼接路径的麻烦,选哪个看你项目的具体需求啦~
备注:内容来源于stack exchange,提问作者Huzaifa Imran
相关产品推荐
相关产品推荐

