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
相关产品推荐
相关产品推荐

