You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter参数类型不匹配错误:无法将void Function(Map<String, bool>)分配给Map<String, bool>类型参数

解决参数类型不匹配错误及相关问题

首先咱们直接揪出核心问题:你给FiltersScreen传递参数的顺序完全搞反了!

看FiltersScreen的构造函数:

FiltersScreen(this.applyfilter, this.currentfilter);

它要求第一个参数是回调函数,第二个是筛选状态的Map,但你在主页面路由里是这么传的:

FiltersScreen(_filter, _applyfilter)

把Map当成了第一个参数,函数当成了第二个,这就直接触发了void Function(Map<String, bool>)不能赋值给Map<String, bool>的类型错误。

接下来咱们一步步修复所有问题:

1. 修正参数传递顺序

在主页面的路由配置里,把参数顺序调换过来:

FiltersScreen.routeName: (ctx) => FiltersScreen(_applyfilter, _filter),

2. 同步筛选页面的初始状态

现在筛选页面的开关状态没有和主页面传入的currentfilter同步,咱们需要在initState里初始化这些变量:

@override
void initState() {
  super.initState();
  isGlutenFree = widget.currentfilter['gluton'] ?? false;
  isLactoseFree = widget.currentfilter['lactose'] ?? false;
  isVegan = widget.currentfilter['vrgan'] ?? false;
  isVegetarian = widget.currentfilter['vegetarian'] ?? false;
}

3. 修正拼写错误(避免筛选逻辑失效)

你在主页面的_filter里把vegan拼成了vrgan,这个小错误会导致素食筛选逻辑完全失效,统一修正为正确的拼写:

  • 主页面的_filter:
Map<String, bool> _filter = {
  'gluton': false,
  'lactose': false,
  "vegan": false,
  "vegetarian": false
};
  • 筛选页面保存筛选结果时:
final selectedfilter = {
  'gluton': isGlutenFree,
  'lactose': isLactoseFree,
  "vegan": isVegan,
  "vegetarian": isVegetarian
};
  • 主页面_applyfilter方法里的判断条件同步修正:
if (_filter['vegan']! && !meals.isVegan) {
  return false;
}

另外你原来的第一个判断条件if (_filter['gluton']! && !meals.isGlutenFree) {}没有返回值,要补上return false;才能生效。

4. 明确函数类型定义(代码更严谨)

把筛选页面的函数参数类型从模糊的Function(Map)改成更明确的类型:

class FiltersScreen extends StatefulWidget {
  final void Function(Map<String, bool>) applyfilter;
  final Map<String, bool> currentfilter;
  
  FiltersScreen(this.applyfilter, this.currentfilter);
  // ...
}

做完这些修改后,参数类型错误会彻底消失,而且筛选状态也能在主页面和筛选页面之间正确同步啦。

内容的提问来源于stack exchange,提问作者Syed Rehan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:43:12