flutter - Dart 2.12 中以前使用带有 runtimeType 的 switch 的可能性是什么?
问题描述
我曾经在 Flutter 2.0 / Dart 2.12 之前能够做到:
return BlocBuilder<MediaBloc, MediaState>(builder: (context, videoState) {
switch (videoState.runtimeType) {
case ReadyVideoState:
return buildVideoWidget(context, videoState);
default:
throw ArgumentError.value(videoState);
}
});
调用带有签名的函数:
Widget buildVideoWidget(
BuildContext context, ReadyVideoState readyVideoState) {
现在,我得到了错误:
The argument type 'MediaState' can't be assigned to the parameter type 'ReadyVideoState'.
ReadyVideoState
是 的子类MediaState
。编译器现在抱怨这个调用并说它不起作用,因为 videoState 的类型是 MediaState 而不是 ReadyVideoState。有没有新的成语来表达我想表达的?
解决方案
除了调试之外,您永远不应该使用runtimeType
它。问题是它总是只返回对象的特定类型,并没有告诉我们这个对象是否与给定的接口兼容。因此,如果您有一个从它延伸的对象,ReadyVideoState
则不会ReadyVideoState
查看runtimeType
该对象。这很少是你想要的。
相反,您应该始终使用 eg if (videoState is ReadyVideoState)
。这实际上将检查videoState
是否与类型兼容,ReadyVideoState
因此适用于实现/扩展的对象ReadyVideoState
。
是的,不幸的是,这意味着您不能使用开关进行类型识别,因此在某些情况下您需要大量else if (...)
.
推荐阅读
- nginx - 无法在 aws 中配置 ingress-nginx-controller(kubeadm 设置不是 eks)
- reactjs - react-hook-form 使用 useController 时为自定义验证设置错误消息
- javascript - 尽管编解码器兼容且正确,为什么透明视频无法在 Safari 上运行?
- javascript - javascript 获取函数命名空间,如 chrome 调试器中所示?
- dataframe - 列和别名上的数据框分组
- python - 未能使用 ETS 进行预测
- java - 我想在后台服务中添加颜色效果或设备摄像头的任何其他更改
- python - 将一列熊猫数据框的值分配给另一列中的参数列表
- javascript - 通过 npm 运行时 Expo 发布失败
- angular - 对 Url 的 post 请求给出了被 cors 策略阻止的错误