Dart链式调用removeWhere报void不匹配FutureOr<Iterable<_>>错误
错误原因
这个报错的核心原因是对Dart列表方法的返回值认知有误:
where()、toList()这类方法会返回新的集合对象,支持链式调用拿到处理结果- 但
removeWhere()是原地修改列表的方法,它没有返回值(返回值类型为void),只会直接修改它前面调用的那个列表对象,不会返回修改后的列表
你写的链式调用最终拿到的是removeWhere()的返回值也就是void,而这段代码所在的上下文要求闭包/表达式返回Iterable类型的结果,void类型自然无法匹配FutureOr<Iterable<_>>的类型要求,就触发了报错。
就算没有类型报错,原写法也拿不到处理后的列表:toList()生成的临时列表调用removeWhere()之后没有被变量持有,修改结果会直接被丢弃,根本无法后续使用。
修复方案
你可以选两种方式实现需求:
方案1:拆分逻辑(适合必须用removeWhere的场景)
先把where筛选的结果存到变量里,再对这个变量执行removeWhere操作,最后使用这个变量即可:
// 第一步:拿到名称匹配的筛选列表 final targetList = state.bank .where( (i) => i.name!.toLowerCase().contains(value.toLowerCase()), ) .toList(); // 第二步:移除指定code的元素 targetList.removeWhere((element) => element.code == '7788'); // 后续直接使用targetList就是最终结果
方案2:合并过滤条件(推荐,性能更好)
removeWhere的本质也是按条件过滤元素,完全可以把排除逻辑直接合并到where的判断条件里,不需要额外生成临时列表再做二次修改,单次遍历就能完成筛选,代码更简洁也不会出现返回值类型问题:
final targetList = state.bank .where( (i) => // 原名称匹配条件 i.name!.toLowerCase().contains(value.toLowerCase()) // 新增排除条件:过滤掉code为7788的元素 && i.code != '7788' ) .toList();
注意:Dart中所有会原地修改集合的方法(比如
removeWhere、add、clear、insert等)返回值都是void,不能放在链式调用的末尾作为结果返回。
内容的提问来源于stack exchange,提问作者Sasitha Dilshan
相关产品推荐
相关产品推荐

