Flutter中如何向映射遍历的类方法传递BuildContext?
问题解决方法
错误原因
你在调用map时的写法card.map(MyCard.buildCard(context))是错误的:
map方法需要接收一个接收单个MyCard参数并返回Widget的函数,但你现在直接执行了buildCard(context),相当于把执行后的Widget对象传给了map,类型完全不匹配,导致报错。
另外还有一个隐藏问题:onPressed: checkCard(card, context)会在构建组件时直接执行checkCard,而不是点击按钮时执行,这会导致弹窗提前弹出,必须修正。
修正后的代码
1. 修正buildCard中的onPressed逻辑
static Widget buildCard(MyCard card, BuildContext context) { var dateFormat = DateFormat('MM/dd/yyyy'); return Column( children: [ Align( alignment: Alignment.centerRight, child: Text(dateFormat.format(card.createdOn.toDate()))), const SizedBox(height: 6), ListTile( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), tileColor: Colors.white, leading: CircleAvatar(child: Text(card.subCategory)), title: Text("Score: " + card.score + " Misses: " + card.misses), subtitle: card.comment.isNotEmpty ? Text("Comment(s): " + card.comment) : null, trailing: IconButton( icon: const Icon(Icons.arrow_forward_ios), onPressed: () => checkCard(card, context)), // 用匿名函数包裹,点击时才执行checkCard ), const SizedBox(height: 18), ], ); }
2. 修正map的调用方式
return FutureBuilder<List<MyCard>>( future: MyCard.readData(snapshot.data), builder: (context, cards) { if (cards.hasData) { final cardList = cards.data!; return Expanded( child: ListView( padding: const EdgeInsets.all(16), // 用匿名函数包装,将每个card和context传入buildCard children: cardList.map((singleCard) => MyCard.buildCard(singleCard, context)).toList())); } else { return const Text("No data"); } });
这样修改后,既解决了context传递的类型匹配问题,也修复了按钮点击逻辑的错误。
内容的提问来源于stack exchange,提问作者FlutterBuilder
相关产品推荐
相关产品推荐

