Flutter中按分类与星期筛选ListView失败的问题排查
每周菜单应用双筛选参数类型转换错误解决办法
问题场景
开发每周菜单应用,支持按分类(Category)和星期(DayOfWeek)筛选餐品(Meal)。已创建对应三个类,Meal类包含idCategory和idDayOfWeek字段。单独筛选单个参数时功能正常,但同时筛选两个参数时触发错误:
'type 'DayOfWeek' is not a subtype of type 'Category' in type cast'
错误原因
同一ModalRoute.of(context)!.settings.arguments被重复读取并强制转换为不同类型:第一次读取时该参数是DayOfWeek实例,第二次强行将其转换为Category类型,导致类型不匹配报错。
解决方案
需要将两个筛选参数打包成集合(如Map)传递,再从路由参数中解构出对应值,具体步骤如下:
1. 跳转页面时传递包含双参数的Map
在触发页面跳转的Navigator.push代码中,将选中的Category和DayOfWeek放入Map作为路由参数:
Navigator.push( context, MaterialPageRoute( builder: (context) => DaysOfWeekMealsPage(meals: DUMMY_MEALS), settings: RouteSettings( arguments: { 'category': selectedCategory, // 选中的Category实例 'dayOfWeek': selectedDay, // 选中的DayOfWeek实例 }, ), ), );
2. 在目标页面读取并解构参数
修改_DaysOfWeekMealsScreenState中的代码,从Map中分别取出两个参数:
class _DaysOfWeekMealsScreenState extends State<DaysOfWeekMealsPage> { var status = StatusReserva.n; @override Widget build(BuildContext context) { // 读取路由参数并转为Map类型 final args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>; final DayOfWeek dayOfWeek = args['dayOfWeek']; final Category category = args['category']; final DateTime date = DateTime.now(); // 筛选餐品:用==判断ID更准确(原代码contains适用于多ID场景,此处无需) final dayOfWeekMeals = widget.meals.where((meal) { return meal.idDayOfWeek == dayOfWeek.id && meal.idCategory == category.id; }).toList(); // 后续UI构建代码... } }
补充说明
原代码中使用contains判断ID属于冗余写法,因为idCategory和idDayOfWeek都是单个ID字符串,直接用==比较更准确高效。
内容的提问来源于stack exchange,提问作者pedro.curti
相关产品推荐
相关产品推荐

