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

Flutter中3个页面(2个Bottom Sheet+1个屏幕)的值传递问题

问题根源分析
  1. Choose House Bottom Sheet提前返回默认值:拍照完成后你先调用了Navigator.pop(context);,此时会直接将初始的isTicketCreated=false返回给Home Screen,后续调用Create Ticket Bottom Sheet拿到的true根本无法传递回去。
  2. Create Ticket Bottom Sheet值传递链路断裂:你用Navigator.popUntil直接跳回Home,既没有通过pop传递布尔值,还跳过了Choose House的层级,导致后续值无法正常回传。
修复步骤

1. 调整Choose House Bottom Sheet的返回逻辑

删除提前pop的操作,等拿到Create Ticket的结果后,再统一返回给Home Screen:

bool isTicketCreated = false;

onTap: () {
  setState(() {
    onOptionSelected(selectedOption);
  });

  Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => TakePicturePage(
        locationName: locationName,
      ),
    )).then((value) async {
    if (value != null) {
      _originalImageFile = value as File;
      setState(() {});

      // 先不关闭当前BottomSheet,等待工单创建结果
      isTicketCreated = await ReusableCreateTemuanBottomSheet.buildModalBottom(
        context: context,
        imageFile: _originalImageFile,
        userLocationJoined: userLocationJoined,
        selectedLocationData: selectedOption,
      );
      
      // 拿到结果后再返回给Home Screen
      Navigator.pop(context, isTicketCreated);
    } else {
      // 拍照取消时返回false
      Navigator.pop(context, false);
    }
  });
},

2. 修正Create Ticket Bottom Sheet的返回逻辑

不要直接跳回Home,而是先将创建结果返回给Choose House,再由它统一处理:

onTap: () async {
  bool createSuccess = false;
  
  setState2(() {
    isLoading2 = true;
  });
  
  try {
    await ProfileDatabase.createTemuan(
      temuanTitle: temuanTitle,
      temuanDescription: _textControllerDescription.text,
      temuanLocation: _selectedLocationValue as String,
      temuanLocationId: _selectedLocationId as String,
    );
    
    createSuccess = true;
    ReusableSnackBar.buildSnackBar(
      context2,
      'Berhasil menyimpan temuan',
      backgroundColor: successBackgroundColor,
      messageColor: primaryText,
    );
  } catch (e) {
    // 处理创建失败场景
    createSuccess = false;
    ReusableSnackBar.buildSnackBar(
      context2,
      'Gagal menyimpan temuan',
      backgroundColor: errorBackgroundColor,
      messageColor: primaryText,
    );
  } finally {
    setState2(() {
      isLoading2 = false;
    });
    // 将结果返回给Choose House Bottom Sheet
    Navigator.pop(context2, createSuccess);
  }
},

3. 确保Choose House的buildModalBottom正确返回值

你的buildModalBottom方法需要返回Future<bool>,并在关闭时传递参数:

static Future<bool> buildModalBottom({
  required BuildContext context,
  required List userLocationJoined,
  required String source,
  required Function(Map<dynamic, dynamic>) onOptionSelected,
}) async {
  return await showModalBottomSheet<bool>(
    context: context,
    builder: (context) => _ChooseTemuanLocationBottomSheet(
      userLocationJoined: userLocationJoined,
      source: source,
      onOptionSelected: onOptionSelected,
    ),
  ) ?? false; // 处理用户直接关闭BottomSheet的情况
}
关键注意点
  • 不要在值传递链路中途提前执行pop,需等拿到最终结果后再统一返回给上一层
  • 每个pop都要明确传递返回值,避免依赖默认的null或初始值
  • 异常场景(比如用户取消操作、接口调用失败)也要返回对应布尔值,保证链路完整性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:35:06