我正在使用 Bloc 模式,并使用以下代码来定义我的状态:
import 'package:meta/meta.dart'
@immutable
abstract class UiState {}
class Loading extends UiState {}
class Success extends UiState {
Success(this.message);
final String message;
}
class Failure extends UiState {}
我尝试使用UiState
如下:
class MyWidget extends StatelessWidget {
const MyWidget({
Key key,
@required this.uiState,
}) : super(key: key);
final UiState uiState;
Widget build(BuildContext context) {
if (uiState is Success) {
return Text(uiState.message);
}
...
}
}
但 VSCode 告诉我“没有为类 'UiState' 定义 getter 'message'”。
我以前使用过智能转换,它们确实有效。但在这种情况下,我无法弄清楚为什么它不起作用。
我的 pubspec 有以下内容:
environment:
sdk: ">=2.1.0 <3.0.0"
所以,我假设我的 dart 版本至少是 2.1.0。
is
仅对局部变量和(从 Dart 3.2 开始)实例变量执行隐式类型提升final
和私人的。
对于此类变量,编译器可以推断出该变量的值在检查其类型期间不会改变is
并且在使用变量之前。
对于可以重新分配或公共变量或其他非局部变量的实例变量,编译器无法轻易做出这种保证。所有非局部变量都隐式提供 getter 函数,这些函数可以由派生类重写,并且可以从一次访问到下一次访问返回不同的值。
另请参阅:
- https://github.com/dart-lang/sdk/issues/21530
- https://github.com/dart-lang/sdk/issues/34480
作为显式强制转换的替代方法,您当然可以首先将非局部变量存储在局部变量中。例如:
void memberFunction() {
final memberVariable = this.memberVariable;
if (memberVariable is Person) {
memberVariable.firstName = 'Bob';
}
}
注意这也适用于从可为空类型到不可为空类型的类型提升,比如当做if (someNullableVariable != null)
.
另请参阅https://dart.dev/tools/non-promotion-reasons由于其他一些原因,自动类型升级可能不会发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)