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

Flutter点击Expandable ListTile触发'!_debugLocked'异常求助

解决Flutter ExpansionPanelList点击时抛出'!_debugLocked': is not true异常

问题原因

你遇到的异常是因为在expansionCallback中调用setState后立刻触发SnackBar显示——此时Flutter正处于状态更新的锁定阶段(debugLocked为true),而SnackBar的显示需要修改ScaffoldMessenger的状态,两者操作冲突导致报错。

修复方案

将SnackBar的显示逻辑延迟到当前帧绘制完成后执行,避开状态锁定的时机。可以通过WidgetsBinding.instance.addPostFrameCallback实现:

修改后的expansionCallback代码:

expansionCallback: (index, isExpanded) {
  final tile = advancedTiles[index];
  setState(() => tile.isExpanded = isExpanded);

  // 延迟到当前帧绘制完成后显示SnackBar
  WidgetsBinding.instance.addPostFrameCallback((_) {
    Utils.showSnackBar(
      context,
      text: isExpanded
          ? '收起 ${tile.title}'
          : '展开 ${tile.title}',
      color: Colors.green,
    );
  });
},

也可以用Future.microtask替代,效果一致:

expansionCallback: (index, isExpanded) {
  final tile = advancedTiles[index];
  setState(() => tile.isExpanded = isExpanded);

  Future.microtask(() {
    Utils.showSnackBar(
      context,
      text: isExpanded
          ? '收起 ${tile.title}'
          : '展开 ${tile.title}',
      color: Colors.green,
    );
  });
},

原理说明

addPostFrameCallback会在当前Widget树的build、layout、paint流程全部完成后执行回调,此时Flutter的状态锁定已经解除,调用SnackBar就不会触发!_debugLocked异常。

内容的提问来源于stack exchange,提问作者Muhammad Zakari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:45:48