doc*_*doc 11 dart flutter dart-null-safety
这是一个普遍问题。与编码无关。在我关注 flutter 教程的每个地方,我都会看到简单的变量声明。但是当我编写相同的代码时(我认为是因为更新),它需要添加 Late 修饰符。
late modifier can be used while declaring a non-nullable variable that's initialized after its declaration. Declaration of variables that will be initialize later is done using late modifier.
这是我在谷歌上读到的。为什么需要声明不可为 null 的变量。vscode 总是在显示错误的变量下划线。但吃了修饰剂。当我们改变变量到late的时候我们需要改变什么。因为它使得接下来的教程变得非常困难。设置状态没有帮助。
Pet*_*tai 26
这是因为 Dart 中的空安全性。在引入空安全之前,已经写了很多指南。可以使用 声明一个类成员为可为空?,因此这是有效的,并且意味着i可以具有值null,因此允许在不初始化其值的情况下使用:
int? i;
Run Code Online (Sandbox Code Playgroud)
如果你不使用?,你仍然可以声明一个成员,但是你必须给它赋值,这也是有效的:
int i=1;
Run Code Online (Sandbox Code Playgroud)
但这将是无效的,因为您说它i不能为空,并且您没有为其赋值:
int i;
Run Code Online (Sandbox Code Playgroud)
关键词来了late。通过使用这个,你“承诺”Dart,你稍后将初始化这个值,例如在initState这样的方法中:
class MyWidget extends StatefulWidget {
const MyProfile({Key? key}) : super(key: key);
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late int _i;
@override
void initState() {
super.initState();
_i = 1;
}
Run Code Online (Sandbox Code Playgroud)
你必须遵守这个“承诺”,否则你会得到运行时错误。
另一种选择是为具有required成员的类创建一个构造函数,它将确保这些值在创建的任何实例中都不会丢失,因此 Dart 可以接受:
class MyClass {
int i;
MyClass({required this.i});
}
Run Code Online (Sandbox Code Playgroud)
在最后一个示例中,如果省略required关键字,则会收到错误,因为i不可为空,并且如果构造函数不需要它,则它可能为空。required尽管如此,如果您i通过将其声明为 nullable 来使其为 null,那么即使没有 ,它也可以工作int? i;。
Late 修饰符是 dart 新空安全的一部分,它用于告诉编译器将此变量视为不可为空,并且稍后将进行初始化,如果没有它,编译器会将变量视为可空并给出错误
late String name;
@override
void initState() {
super.initState();
name = "example";//the compiler will not see this to know that you have initialized the variable
}
@override
Widget build(BuildContext context) {
if(name=="example"){
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14237 次 |
| 最近记录: |