Dart 2.1.0 智能转换使用“is”不起作用

AnE*_*Bug 3 dart flutter

我正在使用 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。

jam*_*lin 9

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了解可能不会发生自动类型提升的其他一些原因。