Flutter点击ListTile尾部图标弹窗报错:build期间调用setState/重绘标记
Flutter解决「setState() or markNeedsBuild() called during build」及自动弹出对话框问题
问题根源
- 初始构建错误:你在
IconButton的onPressed里直接写了checkCard(card, context),这会在组件构建时立即执行checkCard函数,而非把它作为点击回调。此时组件还在build流程中,调用showDialog会触发「setState() or markNeedsBuild() called during build」错误。 - 自动弹出对话框:你尝试用
addPostFrameCallback延迟执行,但因为还是直接调用了checkCard,组件构建完成后会自动触发showDialog,导致无需点击就弹出对话框、屏幕变黑。
修复方案
给onPressed传递一个匿名函数,让它仅在用户点击时才调用checkCard。此时无需addPostFrameCallback(点击事件发生在组件构建完成后,不会触发初始错误)。
修改后的代码
1. 修正buildCard中的IconButton部分
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), // 改为匿名函数,点击时才执行checkCard onPressed: () => checkCard(card, context)), ), const SizedBox(height: 18), ], ); }
2. 恢复checkCard函数(移除addPostFrameCallback)
static void checkCard(MyCard card, BuildContext context) { showDialog( context: context, builder: (context) => const AlertDialog( content: Text("Hello"), )); // 注意:原代码直接返回Text会导致对话框样式异常,建议用AlertDialog包裹内容 }
额外优化提示
你的FutureBuilder存在一个潜在问题:future参数直接在build方法中创建(MyCard.getData(3, Utils.ddfDropdown)!),会导致每次组件重建时都重新发起异步请求。建议将future初始化移到initState中:
late final Future<List<Map<String, dynamic>>> _dataFuture; @override void initState() { super.initState(); _dataFuture = MyCard.getData(3, Utils.ddfDropdown)! .whenComplete(() => setState(() { isLoading = false; })); } @override Widget build(BuildContext context) => FutureBuilder<List<Map<String, dynamic>>>( future: _dataFuture, // 后续代码保持不变 );
内容的提问来源于stack exchange,提问作者FlutterBuilder
相关产品推荐
相关产品推荐

