Dart/Flutter中如何同时按ID和名称含指定字符过滤数组
问题根因与解决方法
1. 现有代码的核心错误
你写的名称过滤逻辑完全不符合需求:代码里的element.stTitle.toUpperCase().contains('А') == element.stTitle.toUpperCase().contains("A")是判断「包含西里尔字母A」和「包含拉丁字母A」的布尔值相等,既不是你要的「包含A」,更不是「同时包含A和B」,这是导致过滤结果不符合预期的首要原因。
2. 加ID过滤后页面空白的问题排查
- 首先确认过滤用的
stId和接口返回的Stop.stId类型是否匹配:比如接口返回的是字符串类型的ID,你传入的是int类型,==判断会直接返回false,导致无匹配结果。 - 你可以在过滤前先打印所有
Stop的stId和你用来过滤的stId值,确认是否真的存在匹配项。
3. 仅返回单条数据的原因
Stop模型里的stId是唯一主键,同一个stId只会对应一条Stop数据,所以用stId == 固定值过滤的结果天然最多只有一条。如果你需要获取某条Routes下所有符合名称条件的Stop,说明你的模型设计缺少关联字段:Stop需要新增routeId字段关联Routes的mrid,否则你无法把两个模型的数据做关联过滤。
修正后的代码
List<Stop> filteredStops = Provider.of<List<Stop>>(context) .skip(1) // 名称过滤逻辑修正:转大写后同时包含A和B .where((element) => element.stTitle.toUpperCase().contains('A') && element.stTitle.toUpperCase().contains('B')) // 若stId类型不匹配,这里做类型转换,比如stId是字符串的话写成element.stId.toString() == stId .where((element) => element.stId == stId) .toList();
如果是要匹配指定Routes下的所有符合条件的Stop,补全关联字段后的代码:
// 先获取你要匹配的目标Routes对象 Routes targetRoute = // 你的目标Routes实例 List<Stop> filteredStops = Provider.of<List<Stop>>(context) .skip(1) .where((element) => element.stTitle.toUpperCase().contains('A') && element.stTitle.toUpperCase().contains('B')) // 用关联字段匹配Routes的id .where((element) => element.routeId == targetRoute.mrid) .toList();
内容的提问来源于stack exchange,提问作者user16357470
相关产品推荐
相关产品推荐

