Flutter Dart中的零安全性是什么?

Flutter Dart中的零安全性是什么?,flutter,dart,Flutter,Dart,我听说过新的Dart空安全语言功能(NNBD),目前是“非空”实验。默认情况下,它应该引入不可为空的 特性规范可以是和语言 它是如何工作的?我在哪里可以尝试它?1。空安全/不可空(默认) 空安全/非空(默认情况下)功能,简称NNBD,当前可在中找到 请记住,您可以阅读和。现在,声音零安全也得到了改善 2.1. 默认情况下不可为null意味着什么? void main(){ 字符串字; 打印(word);//非法 word=‘你好’; 打印(word);//合法 } 如上所述,默认情况下不可为

我听说过新的Dart空安全语言功能(NNBD),目前是“非空”实验。默认情况下,它应该引入不可为空的

特性规范可以是和语言

它是如何工作的?我在哪里可以尝试它?

1。空安全/不可空(默认) 空安全/非空(默认情况下)功能,简称NNBD,当前可在中找到

请记住,您可以阅读和。现在,声音零安全也得到了改善


2.1. 默认情况下不可为null意味着什么?
void main(){
字符串字;
打印(word);//非法
word=‘你好’;
打印(word);//合法
}
如上所述,默认情况下不可为null的变量意味着正常声明的每个变量都不能为
null
。因此,在分配变量之前访问该变量的任何操作都是非法的。
此外,也不允许将
null
赋值给不可为null的变量:

void main(){
字符串字;
word=null;//禁止
world='world!';//允许
}
2.1.1. 这对我有什么帮助? 如果变量不可为null,则可以确保它从不为
null
。因此,你永远不需要事先检查它

int number=4;
void main(){
if(number==null)返回;//冗余
int sum=number+2;//允许,因为number也不可为null
}
2.1.2. 记得 类中的实例字段如果不可为空,则必须初始化

class-Foo{
字符串字;//禁止
字符串句子='你好,世界!';//允许
}
请参见下面的
late
,以修改此行为

2.2. 可为空的类型(
) 通过在变量类型后面添加问号
,可以使用可为空的类型

class-Foo{
字符串字;//禁止
字符串?句子;//允许
}
可为空的变量在使用前不需要初始化。默认情况下,它初始化为
null

void main(){
字符串?单词;
打印(word);//打印空值
}
2.2.2. <代码> 追加
e
为空,则对任何变量
e
进行编码>
将抛出运行时错误,否则将其转换为不可为空的
v

void main(){
int?e=5;
int v=e!;//v不可为null;如果e为null,则会引发错误
字符串?单词;
print(word!);//如果word为null,则抛出运行时错误
打印(null!);//引发运行时错误
}
2.3. <代码>迟到
关键字
late
可用于标记稍后将初始化的变量,即不是在声明变量时,而是在访问变量时。这也意味着我们可以拥有稍后初始化的不可为空的实例字段:

class ExampleState扩展状态{
最后一个字符串字;//不可为空
@凌驾
void initState(){
super.initState();
//此处打印(word)将引发运行时错误
word=‘你好’;
}
}
在初始化之前访问word将抛出运行时错误

2.3.1. <代码>后期期末考试 最终变量现在也可以标记为延迟:

late final int x=heavycompution();
在这里,只有在访问
x
时才会调用
heavycompution
。此外,您还可以在不使用初始值设定项的情况下声明
late final
,这与只声明
late
变量相同,但只能指定一次

后期最终整数x;
//w/e
x=5;//允许
x=6;//被禁止的
请注意,所有带有初始值设定项的顶级或静态变量现在都将在
late
时进行求值,无论它们是否为
final

2.4. <代码>必填项 以前是注释(
@required
),现在作为修改器内置。它允许将任何命名参数(用于函数或类)标记为
必需
,这使它们不可为空:

void-allowed({required String word})=>null;
这也意味着,如果某个参数应不可为空,则需要将其标记为
必需
或具有默认值:

void-allowed({String-word='World'})=>null;
无效禁止({int x})//编译时错误,因为x可以为null(未赋值)
=>
无效的
任何其他命名参数必须是可为空的

voidbaz({int?x})=>null;
2.5. <代码>?[] 为索引运算符添加了空感知的
?[]
运算符
[]

void main(){
列表?列表=[1,2,3];
int?x=列表?[0];//1
}
另见

2.5.1. <代码>?… 级联运算符现在还有一个新的空感知运算符:
?…

它使以下级联操作仅在收件人不为null时执行。因此,
?…
必须是级联序列中的第一个级联运算符:

void main(){
路径?路径;
//如果路径为空,则不会执行任何操作。
路径
?移动到(3,4)
…lineTo(4,3);
//这是一个角落。
(列表为空)
?增加(4)
…添加(2)
…添加(0);
}

2.6. <代码>从不 下面的解释很糟糕。阅读以获得一个好的答案

为了避免混淆:开发人员不必担心这一点。为了完整起见,我想提一下

Never
将是一种类似于先前在
dart:core
中定义的现有类型(not
null
)。这两个类都不能扩展、实现或混合,因此不打算使用它们const phonefield({ Key? key,required this.onchanged, }) : super(key: key); final ValueChanged<String>onchanged;