Flutter中Navigator.pop返回null时如何让push返回的Future为null
核心结论
无法实现让Navigator.pop返回null时,Navigator.push返回的Future本身直接为null,这是Flutter Navigator的底层设计决定的:Navigator.push() 方法的返回值类型固定为 Future<T?>,只要成功触发了页面跳转逻辑,不管目标页返回什么内容,这个Future对象一定存在,只会出现Future携带的解析值为null的情况,不会出现Future本身为null的情况。
你之前校验逻辑失效的核心原因是直接拿Future对象本身做非空判断,只要触发跳转逻辑,这个Future对象就永远非空,和页面返回的实际内容无关。
替代实现方案
如果你不想写复杂的校验逻辑,可以选择以下两种极简方案:
方案1:用async/await语法糖复用原有校验逻辑
只需给触发跳转的方法加上async修饰,用await接收返回值,即可直接拿到目标页pop携带的实际内容,原有if(result != null)的校验逻辑可以直接复用:
// 注意调用该方法的函数需要加上async修饰 final result = await Navigator.push( context, MaterialPageRoute( builder: (context) => PlayerNames( _currentBoySliderValue, _currentGirlSliderValue ) ) ); // 此处result为pop返回的实际值,直接使用原有校验即可 if(result != null) { // 后续正常业务逻辑 }
方案2:自定义返回类型完全规避null值
如果你的业务场景完全不允许处理null值,可以自定义封闭类作为返回值类型,从根源上避免null判断:
- 首先定义返回类型:
sealed class PlayerNamesResult {} // 提交成功的返回类型 class SuccessNamesResult extends PlayerNamesResult { final List<String> names; SuccessNamesResult(this.names); } // 取消/关闭的返回类型 class CancelNamesResult extends PlayerNamesResult {}
- 目标页修改
pop逻辑:
- 提交按钮:
Navigator.pop(context, SuccessNamesResult(widget._names)); - 关闭/取消按钮:
Navigator.pop(context, CancelNamesResult());
- 调用页接收返回值,直接做类型判断即可:
final result = await Navigator.push<PlayerNamesResult>( context, MaterialPageRoute(builder: (context) => PlayerNames(_currentBoySliderValue, _currentGirlSliderValue)) ); if(result is SuccessNamesResult) { final names = result.names; // 直接处理业务逻辑,不需要判断null }
内容的提问来源于stack exchange,提问作者Danzon2504
相关产品推荐
相关产品推荐

