Flutter列表对比问题:无法根据列表交集控制图片透明度
嗨,我一眼就发现问题出在哪了!你的所有图片都保持半透明,根源是Opacity的判断逻辑方向错了。
你现在写的是s.contains(biomes)——这相当于在问“整个biomes列表是不是s里的一个元素?”,但s里全是单个的字符串(比如"Aquatic"、"Grassland"),根本不可能包含另一个列表,所以这个条件永远是false,所有图片的opacity都被设成了0.3。
正确的逻辑应该是:检查当前循环到的那个生物群系(也就是s[i]),是否存在于biomes列表里。只要把判断条件改过来,问题就解决了!
修正后的代码
Widget BiomeElement(List<String> s, List<String> biomes) { List<Widget> list = []; for (var i = 0; i < s.length; i++) { final currentBiome = s[i]; // 提取当前元素,让代码更清晰 list.add( Padding( padding: const EdgeInsets.all(4.0), child: Opacity( // 核心修改:判断当前生物群系是否在目标列表中 opacity: biomes.contains(currentBiome) ? 1 : 0.3, child: Column( children: [ Image.asset( 'assets/biomes/biome_' + currentBiome.toLowerCase() + '.png', height: 35, width: 35, ), ], ), ), ), ); } return Row( children: list ); }
额外的小优化
- 给
biomes参数加上List<String>的类型标注,避免类型模糊带来的潜在bug; - 用
final currentBiome = s[i]把当前循环的元素提出来,既减少重复代码,也让逻辑更易读; - Dart里现在可以省略
new关键字,直接写List<Widget> list = []、Row(...)就行,代码更简洁。
这样改完之后,Grassland和Tropical对应的图片就会正常显示为完全不透明,其他图片保持半透明,完全符合你的预期~
内容的提问来源于stack exchange,提问作者lechnerio
相关产品推荐
相关产品推荐

