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.
这是我在谷歌上读到的。为什么有必要声明不可为空的变量。Vscode 总是在显示错误的变量下划线。但是吃了修饰符。当我们将变量更改为后期时,我们需要更改什么。导致其制作以下教程非常困难。设置状态没有帮助。
解决方案
这是因为 Dart 中的 null 安全性。在引入 null 安全性之前,已经编写了很多指南。可以使用 将类成员声明为可为空?
,因此这是有效的,并且意味着i
可以具有 value null
,因此允许在不初始化其值的情况下使用:
int? i;
如果你不使用?
,你仍然可以声明一个成员,但你必须为它分配一个值,这也是有效的:
int i=1;
但这将是无效的,因为您说i
不能为空,并且您没有为其分配值:
int i;
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;
}
你必须遵守这个“承诺”,否则你会得到一个运行时错误。
另一种选择是为具有成员的类创建一个构造函数required
,它将确保这些值不会在任何创建的实例中丢失,所以 Dart 可以接受:
class MyClass {
int i;
MyClass({required this.i});
}
在最后一个例子中,如果你省略required
关键字,你会得到一个错误,因为i
它是不可为空的,如果构造函数不需要它,它可能是空的。尽管如此,required
如果您i
通过将其声明为可空,它仍然可以在没有int? i;
.
推荐阅读
- sql - 与有效的相比,这个嵌套的 SELECT 语句有什么问题?
- asp.net - asp.net (vb) gridview 如何计算两列并将值传递给第三列?
- azure - Azure API 管理 - 身份验证:OAuth2 与证书
- sql - SQL-解码函数大于
- react-native - 如何使 Alert.alert 消息可以复制和粘贴?
- c# - 在 Unity2D 中生成敌人
- css - 通过 CSS 填充透明轮廓字体
- swift - 将阴影添加到 UICollectionViewCell swift
- firebase - 在 Firebase Cloud 函数中获取请求 URL
- r - 根据包含负值和 NA (R) 的数字范围绘制具有颜色的国家/地区的状态