Flutter如何向单个页面传递两种不同对象类型并忽略必填限制
Flutter: 实现CategoryDetail页面接收二选一的参数(Category或TopCategories)
方案1:使用命名构造函数(推荐,语义更清晰)
修改CategoryDetail的代码,为两种参数分别创建命名构造函数,确保每次调用只能传入一种类型的参数:
class CategoryDetail extends StatefulWidget { final Category? category; final TopCategories? topCategories; // 用于传递Category类型参数的构造函数 CategoryDetail.fromCategory({Key? key, required this.category}) : topCategories = null, super(key: key); // 用于传递TopCategories类型参数的构造函数 CategoryDetail.fromTopCategories({Key? key, required this.topCategories}) : category = null, super(key: key); @override State<CategoryDetail> createState() => _CategoryDetailState(); }
修改后的调用方式:
- 传递
TopCategories时:
onTap: () { Navigator.push( context, PageTransition( alignment: Alignment.bottomRight, type: PageTransitionType.fade, child: CategoryDetail.fromTopCategories(topCategories: categories[i]) ) ); }
- 传递
Category时:
Navigator.of(context).push( PageTransition( alignment: Alignment.bottomRight, type: PageTransitionType.fade, child: CategoryDetail.fromCategory(category: categories[i]) ) );
方案2:使用可选参数+断言(兼容原有调用代码)
如果不想修改现有调用代码,可以将两个参数设为可选,同时通过断言确保只能传入其中一个:
class CategoryDetail extends StatefulWidget { final Category? category; final TopCategories? topCategories; CategoryDetail({ Key? key, this.category, this.topCategories, }) : assert( (category != null && topCategories == null) || (category == null && topCategories != null), "必须且只能传入category或topCategories其中一个参数" ), super(key: key); @override State<CategoryDetail> createState() => _CategoryDetailState(); }
这种方式下,你原有的调用代码可以直接保留不用修改,断言会在开发环境中检查参数是否符合要求,避免错误传入。
在State中使用参数
无论用哪种方案,在_CategoryDetailState中需要判断哪个参数非空,再做对应逻辑处理:
class _CategoryDetailState extends State<CategoryDetail> { @override Widget build(BuildContext context) { // 判断当前传入的参数类型 if (widget.category != null) { // 处理Category类型的逻辑 Category category = widget.category!; return // 对应UI; } else if (widget.topCategories != null) { // 处理TopCategories类型的逻辑 TopCategories topCat = widget.topCategories!; return // 对应UI; } // 理论上不会走到这里,因为构造函数已经做了限制 return const SizedBox(); } }
内容的提问来源于stack exchange,提问作者Digamber negi
相关产品推荐
相关产品推荐

