为什么showDialog后添加<Null>后catchError逻辑才能正常执行?
关于showDialog泛型作用的解答
核心本质:Dart泛型匹配与Future链式调用的类型校验规则
- 首先明确
showDialog的泛型定义:
它本身是泛型方法Future<T?> showDialog<T>(...),返回的Future携带的泛型T,是你关闭弹窗时调用Navigator.pop(context, 返回值)带回的返回值类型。如果不手动指定泛型,Dart会自动根据上下文推断类型。 - 未加
<Null>时逻辑卡住的原因:catchError回调的返回值要求必须和上游调用catchError的原Future(也就是你这里addProduct方法返回的Future)的泛型兼容,否则Dart会在运行时抛出隐式类型转换异常,这个异常不会被当前的catchError捕获,直接打断整个Future链式调用,表现就是后续then永远不会执行,isLoading一直为true,加载动画停不下来。
你没有给showDialog指定泛型时,Dart推断出的返回值泛型和addProduct返回的Future泛型不匹配,就触发了上述问题。 - 加
<Null>后的改动:
手动指定showDialog的泛型为Null后,相当于明确告知Dart该方法返回的是Future<Null?>,和addProduct返回的Future<void>/Future<Null>完全兼容,不会触发类型校验异常。当用户点击弹窗按钮关闭弹窗后,showDialog返回的Future正常完成,就会顺利走到后续的then回调,你的加载状态重置、页面回退逻辑也就可以正常执行了。
补充说明:你的弹窗关闭逻辑是
Navigator.of(context).pop()没有携带任何返回值,刚好匹配Null泛型的要求,没有适配问题。
内容的提问来源于stack exchange,提问作者Shanu
相关产品推荐
相关产品推荐

