Flutter:使用pushReplacement后如何将数据返回至原页面?
问题分析
你遇到的核心问题是:使用Navigator.pushReplacement从PinPointPage跳转到AddressPage时,PinPointPage会被直接从导航栈中移除。这导致CreatePrelovedPage中通过Navigator.push打开PinPointPage的then回调永远无法获取返回值——因为原页面已经不存在,后续从AddressPage返回时,没有途径将数据传递回CreatePrelovedPage。
解决方案
方案一:通过中间页传递返回数据
保留PinPointPage在导航栈中,用push而非pushReplacement跳转至AddressPage,再让AddressPage将数据返回给PinPointPage,最后由PinPointPage把数据传递回CreatePrelovedPage。用户从AddressPage返回时会直接回到CreatePrelovedPage,不会看到PinPointPage的过渡。
- 修改
PinPointPage的跳转逻辑
// 替换原pushReplacement为push,并监听AddressPage的返回值 Navigator.push( context, MaterialPageRoute( builder: (context) => ShoppingCreatePrelovedAddressPage( pickResult: result, ), ), ).then((addressModel) { // 拿到AddressPage返回的数据,直接传递回CreatePrelovedPage if (addressModel != null) { Navigator.pop(context, addressModel); } });
- 在
AddressPage完成编辑后返回数据
// 假设用户完成编辑后得到最终的addressModel实例 Navigator.pop(context, finalAddressModel);
方案二:使用回调函数直接传递数据
如果坚持使用pushReplacement,可以通过回调函数绕开导航栈的限制,让AddressPage直接将数据传递给CreatePrelovedPage。
- 在
CreatePrelovedPage跳转时传入回调
Navigator.push( context, MaterialPageRoute( builder: (context) => ShoppingCreatePrelovedPinPage( onAddressDone: (AddressModel model) { setState(() { _addressModel = model; }); }, ), ), );
- 在
PinPointPage中定义回调参数
class ShoppingCreatePrelovedPinPage extends StatelessWidget { final Function(AddressModel) onAddressDone; const ShoppingCreatePrelovedPinPage({super.key, required this.onAddressDone}); // ... 其他代码 }
PinPointPage跳转时将回调传递给AddressPage
Navigator.pushReplacement( context, MaterialPageRoute( builder: (context) => ShoppingCreatePrelovedAddressPage( pickResult: result, onAddressDone: widget.onAddressDone, ), ), );
AddressPage完成编辑后调用回调并返回
// 获取到最终的addressModel后 widget.onAddressDone(finalAddressModel); Navigator.pop(context);
内容的提问来源于stack exchange,提问作者ItsIskandar
相关产品推荐
相关产品推荐

