相关疑难解决方法(0)

迁移到 Dart 空安全后,“无法无条件调用运算符,因为接收器可以为空”错误

我正在升级一个基于 Flutter 框架的个人包。我在 Flutter Text 小部件源代码中注意到这里有一个空检查:

if (textSpan != null) {
  properties.add(textSpan!.toDiagnosticsNode(name: 'textSpan', style: DiagnosticsTreeStyle.transition));
}
Run Code Online (Sandbox Code Playgroud)

但是,textSpan!仍然使用!运算符。不textSpan应该在不必使用!运算符的情况下提升为不可为空的类型吗?但是,尝试删除运算符会出现以下错误:

An expression whose value can be 'null' must be null-checked before it can be dereferenced.
Try checking that the value isn't 'null' before dereferencing it.
Run Code Online (Sandbox Code Playgroud)

这是一个独立的示例:

An expression whose value can be 'null' must be null-checked before it can be dereferenced.
Try checking that the value isn't 'null' before dereferencing it.
Run Code Online (Sandbox Code Playgroud)

我收到一个编译时错误:

错误:“字符串?”类型的值 …

dart type-promotion flutter dart-null-safety

18
推荐指数
2
解决办法
1万
查看次数

Dart null 安全性不适用于类字段

我已将我的 Dart 代码迁移到 NNBD / Null Safety。其中一些看起来像这样:

class Foo {
  String? _a;
  void foo() {
    if (_a != null) {
      _a += 'a';
    }
  }
}

class Bar {
  Bar() {
    _a = 'a';
  }
  String _a;
}
Run Code Online (Sandbox Code Playgroud)

这会导致两个分析错误。对于_a += 'a';

值可以为“空”的表达式必须先进行空检查,然后才能取消引用。尝试在取消引用之前检查该值是否为“空”。

对于Bar() {

不可为空的实例字段 '_a' 必须被初始化。尝试添加初始化表达式,或在此构造函数中添加字段初始化器,或将其标记为“迟到”。

在这两种情况下,我已经完全按照错误提示做了!那是怎么回事?

我正在使用 Dart 2.12.0-133.2.beta(12 月 15 日星期二)。

编辑:我发现这个页面说:

分析器无法对整个应用程序的流程进行建模,因此它无法预测全局变量或类字段的值。

但这对我来说没有意义 -在这种情况下只有一个可能的流控制路径从if (_a != null)_a += 'a';- 没有异步代码并且 Dart 是单线程的 …

dart dart-null-safety

11
推荐指数
1
解决办法
2万
查看次数

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

我正在使用 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: …
Run Code Online (Sandbox Code Playgroud)

dart flutter

3
推荐指数
1
解决办法
1135
查看次数

标签 统计

dart ×3

dart-null-safety ×2

flutter ×2

type-promotion ×1