Flutter中3个页面(2个Bottom Sheet+1个屏幕)的值传递问题
问题根源分析
- Choose House Bottom Sheet提前返回默认值:拍照完成后你先调用了
Navigator.pop(context);,此时会直接将初始的isTicketCreated=false返回给Home Screen,后续调用Create Ticket Bottom Sheet拿到的true根本无法传递回去。 - 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
相关产品推荐
相关产品推荐

