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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:16:07