Dart中List.contains判断元素存在返回false 列表项颜色不更新问题
问题原因与解决方案
核心问题点
- 逻辑类型不匹配错误
你代码中生成的_namesList是通过controller.selectedAntigens.map((e) => e['name']).toList()得到的,列表内存储的是所有选中抗原的名称字符串,但你后续判断逻辑写的是_namesList.contains(item),这里的item是完整的Map对象,用字符串列表判断是否包含Map对象,永远会返回false。 - Dart引用类型比较规则问题
即使你修正了上述逻辑,直接用controller.selectedAntigens.contains(item)也会得到false的结果。Dart中Map属于引用类型,默认的contains方法比较的是内存地址而非内部键值对内容,你inhalantPanel里的STRAW DUST Map和selectedAntigens里的STRAW DUST Map是两个不同的实例,哪怕键值对内容完全一致,比较结果也是不相等,这就是你打印发现内容存在但contains返回0的原因。
修复方案
1. 快速修复(直接用名称匹配)
直接判断当前条目的名称是否存在于已选名称列表中即可,修改Text组件的style部分代码:
style: TextStyle( color: _namesList.contains(item['name']) ? Colors.red : Colors.black, ),
2. 完整Map内容匹配方案(可选)
如果后续业务需要完整比对Map的所有键值对,不要直接用contains方法,可以引入官方collection库的mapEquals工具实现内容比对:
首先导入依赖:
import 'package:collection/collection.dart';
然后修改判断逻辑:
bool isSelected = controller.selectedAntigens.any((element) => mapEquals(element, item)); style: TextStyle( color: isSelected ? Colors.red : Colors.black, ),
3. 动态更新兼容排查
你当前使用的是StatelessWidget,如果selectedAntigens是后续用户操作动态更新的,StatelessWidget不会自动响应状态变化,需要改成StatefulWidget,或者配合GetX的响应式特性,用Obx包裹ListView组件,监听selectedAntigens的变化自动刷新UI。
内容的提问来源于stack exchange,提问作者Aman Rawat
相关产品推荐
相关产品推荐

