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

Flutter中Navigator.pop报错:'!_debugLocked'断言失败求助

问题解决方案

错误原因

这个断言错误是因为**在setState内部调用了Navigator.pop**导致的。setState会触发组件树的重建流程,此时Flutter框架处于_debugLocked锁定状态,不允许执行导航类操作(这类操作会直接修改组件树结构),两者操作冲突就抛出了这个错误。

修复方案

把导航操作移出setState块,或者延迟到当前帧绘制完成后执行,以下是两种可行的修改方式:

方案1:直接分离setState和Navigator.pop

修改RadioListTile的onChanged回调:

onChanged: (val) {
  setState(() {
    initialValue = data.id!;
    print(data.name);
  });
  // 把导航操作移出setState
  Navigator.pop<OccupationsResponseDto>(context, data);
},

方案2:使用addPostFrameCallback延迟执行导航

如果担心状态更新和导航的时序问题,可以用框架的回调确保当前帧完成后再执行导航:

onChanged: (val) {
  setState(() {
    initialValue = data.id!;
    print(data.name);
  });
  // 延迟到当前帧绘制完成后执行导航
  WidgetsBinding.instance.addPostFrameCallback((_) {
    Navigator.pop<OccupationsResponseDto>(context, data);
  });
},

完整修改后的代码片段(方案1版本)

Expanded(
  child: SizedBox(
    height: AppMargin.dm_350,
    child: StatefulBuilder(builder: (context, setState) {
      return Container(
        padding: const EdgeInsets.only(right: AppMargin.dm_20),
        child: Scrollbar(
          interactive: true,
          thumbVisibility: true,
          thickness: AppMargin.dm_10,
          radius: Radius.circular(AppMargin.dm_20),
          scrollbarOrientation: ScrollbarOrientation.right,
          child: SingleChildScrollView(
            child: Column(
              children: [
                for (int i = 0; i < list.length; i++)
                  Theme(
                    data: Theme.of(context).copyWith(dividerColor: Colors.transparent),
                    child: CustomExpansionTile(
                      title: BasicText(
                        text: list[i].name!,
                        textColor: AppColor.black,
                        fontSize: AppMargin.dm_17,
                        fontWeight: AppFont.fontWeightSemiBold),
                      initiallyExpanded: true,
                      trailing: SizedBox.shrink(),
                      children: [
                        Column(
                          children: list[i].occupationsResponseDto!.map((data) => RadioListTile(
                            title: Text(data.name!, style: const TextStyle(fontSize: 14)),
                            visualDensity: const VisualDensity(
                              horizontal: VisualDensity.minimumDensity + 2,
                              vertical: VisualDensity.minimumDensity + 2,
                            ),
                            groupValue: initialValue,
                            value: data.id!,
                            onChanged: (val) {
                              setState(() {
                                initialValue = data.id!;
                                print(data.name);
                              });
                              Navigator.pop<OccupationsResponseDto>(context, data);
                            },
                          )).toList(),
                        ),
                      ],
                    ),
                  ),
              ],
            ),
          ),
        ),
      );
    }),
  ),
)

内容的提问来源于stack exchange,提问作者kapil tk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:42:38