我正在使用 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 {}
Run Code Online (Sandbox Code Playgroud)
我尝试使用 aUiState如下:
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);
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是 VSCode 告诉我“没有为类 'UiState' 定义 getter 'message'”。
我以前使用过智能演员,他们确实有效。但在这种情况下,我无法弄清楚为什么它不起作用。
我的 pubspec 有以下内容:
environment:
sdk: ">=2.1.0 <3.0.0"
Run Code Online (Sandbox Code Playgroud)
所以,我假设我的 dart 版本至少是 2.1.0。
is 仅对局部变量执行隐式类型提升。
对于局部变量,编译器可以推断出局部变量的类型在检查其类型的时间is和使用变量之前之间不会改变。
对于非局部变量,编译器无法轻易做出保证。非局部变量隐式地提供了 getter 函数,这些函数可以被派生类覆盖,并且可以从一次访问到下一次访问返回不同的值。
另见:
作为显式转换的替代方法,您当然可以先将非局部变量存储在局部变量中。例如:
void memberFun() {
final emp = _emp;
if (emp is Person) {
emp.firstName = 'Bob';
}
}
Run Code Online (Sandbox Code Playgroud)
另请参阅https://dart.dev/tools/non-promotion-reasons了解可能不会发生自动类型提升的其他一些原因。