Flutter Dart中的零安全性是什么?
我听说过新的Dart空安全语言功能(NNBD),目前是“非空”实验。默认情况下,它应该引入不可为空的 特性规范可以是和语言 它是如何工作的?我在哪里可以尝试它?1。空安全/不可空(默认) 空安全/非空(默认情况下)功能,简称NNBD,当前可在中找到 请记住,您可以阅读和。现在,声音零安全也得到了改善Flutter Dart中的零安全性是什么?,flutter,dart,Flutter,Dart,我听说过新的Dart空安全语言功能(NNBD),目前是“非空”实验。默认情况下,它应该引入不可为空的 特性规范可以是和语言 它是如何工作的?我在哪里可以尝试它?1。空安全/不可空(默认) 空安全/非空(默认情况下)功能,简称NNBD,当前可在中找到 请记住,您可以阅读和。现在,声音零安全也得到了改善 2.1. 默认情况下不可为null意味着什么? void main(){ 字符串字; 打印(word);//非法 word=‘你好’; 打印(word);//合法 } 如上所述,默认情况下不可为
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
中定义的现有类型(notnull
)。这两个类都不能扩展、实现或混合,因此不打算使用它们
const phonefield({
Key? key,required this.onchanged,
}) : super(key: key);
final ValueChanged<String>onchanged;