You need to enable JavaScript to run this app. Dart/Flutter中如何同时按ID和名称含指定字符过滤数组
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:45:00