我启用了 dart 2.8 nullsafety 实验。
我已将我的应用程序转换为 nullsafety,但它使用的是旧的 pre-nullsafety 包。
问题是旧包有一个可以返回null的方法:
/// Returns the environment variable with [name] or null if it doesn't
/// exist
String env(String name);
Run Code Online (Sandbox Code Playgroud)
用法如下:
var home = env('HOME');
Run Code Online (Sandbox Code Playgroud)
如果 HOME 环境变量丢失,则env返回 null。
问题是它env被声明为返回 a String。
所以当我写
var home = env('HOME');
home ??= '/home';
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
The operand can't be null, so the condition is always false.
Try removing the condition, an enclosing condition, or the whole conditional statement.
Run Code Online (Sandbox Code Playgroud)
鉴于所有 nullsaftey 发布公告都说您可以将 nullsaftey 与较旧的包一起使用,我猜有某种方法可以将导入的包声明为非 nullsafe。
问题是我找不到有关如何执行此操作的任何文档。
Jon*_*ams 22
空安全尚未发布!这就是您需要提供实验标志的原因。
默认情况下,库中是否支持空安全由其语言版本决定。任何语言版本 2.8 或更低版本都被视为选择退出空安全,并且选择了 2.9 或更高版本(可能会发生变化)。语言版本本身可以来自以下两个位置之一:
name: foo
env:
sdk:
">=2.8.0 <3.0.0"
Run Code Online (Sandbox Code Playgroud)
// @dart=2.8
class Foo {}
Run Code Online (Sandbox Code Playgroud)
语言覆盖注释将优先于 SDK 约束,但仅在声明它的单个库中。
您遇到的问题在没有不同包或不正确的语言版本的情况下可以重现,并且与空安全和非空安全代码之间的交互有关。考虑以下示例:
// @dart=2.8
String foo() {
return null;
}
Run Code Online (Sandbox Code Playgroud)
// @dart=2.9
import 'a.dart';
void main() {
var value = foo();
value ??= 'asd';
}
Run Code Online (Sandbox Code Playgroud)
的返回类型foo不会变成String?,而是被标记为String*- 这被称为遗留类型。在 opted in libraries 中,遗留类型被视为非空类型。遗留类型的目标是通过有序迁移更容易地迁移到空安全考虑以下示例:
// @dart=2.9
void foo(String value) {
// do something with non-null String.
}
Run Code Online (Sandbox Code Playgroud)
// @dart=2.8
import 'a.dart';
void main() {
foo(getStringFromAPI());
}
Run Code Online (Sandbox Code Playgroud)
虽然foo需要一个非空字符串,但入口点不可能实际传递它 - 因为它尚未选择加入。如果不将遗留类型视为不可为空类型,就不可能逐步迁移——因为所有库都需要一次更新,或者只更新为接受可空类型。
通过调用尚未从空安全库迁移到空安全的代码,您会增加在依赖项最终迁移时被破坏的风险。在您的示例中,如果home被视为不可为空,则更新到具有更新返回值的依赖项版本String?将导致编译错误。
对于您的具体情况,我建议专门注释homeas的类型String?。这是一个完全有效的类型注释,因为通常T并且T*总是可以分配给T?. 它也更正确,因为您知道 API 可以返回 null。
String? home = env('HOME');
home ??= '/home';
Run Code Online (Sandbox Code Playgroud)
空安全已经发布,耶!默认情况下启用空安全的 Dart 的第一个版本最终2.12不是2.9如上述问题中所记录的那样。
| 归档时间: |
|
| 查看次数: |
9361 次 |
| 最近记录: |