我正在创建一个类,如下所示:
class Movie {
final String title, posterPath, overview;
Movie(this.title, this.posterPath, this.overview);
Movie.fromJson(Map json) {
title = json["title"];
posterPath = json["poster_path"];
overview = json['overview';
}
}
Run Code Online (Sandbox Code Playgroud)
我收到一条警告,指出“必须初始化最终变量“概述”,“ posterPath”和“ 1”。每个变量周围也有警告说“标题”不能用作设置器,因为它是最终的。
当我使用这种语法编写构造函数时,警告消失了:
Movie.fromJson(Map json)
: title = json["title"],
posterPath = json["poster_path"],
overview = json['overview'];
Run Code Online (Sandbox Code Playgroud)
这到底是怎么回事?
Dart 将属性初始化与构造函数体分开。
构造函数有 3 个部分:
初始化和正文部分都是可选的。
final变量必须在前两部分初始化。它们不能在体内初始化。
完整的构造函数如下所示:
MyClass(int value)
: assert(value > 0),
property = value,
super();
{
print("Hello World");
}
Run Code Online (Sandbox Code Playgroud)
这个初始化部分的主要目的是用于无体构造函数,它允许 const 构造函数,这是一个 dart 特定的特性。请参阅const 构造函数实际上是如何工作的?有关这些的更多详细信息。
在任何人获得对新对象的引用之前,必须完全初始化Dart对象。由于构造函数的主体可以访问this,因此需要在进入构造函数的主体之前初始化该对象。
为此,生成的Dart构造函数具有一个初始化程序列表,看起来类似于C ++,您可以在其中初始化字段(包括final字段),但是您尚不能访问对象本身。语法:
Movie.fromJson(Map json)
: title = json["title"],
posterPath = json["poster_path"],
overview = json['overview'];
Run Code Online (Sandbox Code Playgroud)
使用了初始化列表(分配后的列表:)来初始化最后的实例变量title,posterPath和overview。
第一个构造函数使用“初始化形式” this.title将参数直接放入字段中。
构造函数
Movie(this.title, this.posterPath, this.overview);
Run Code Online (Sandbox Code Playgroud)
实际上是以下方面的简写:
Movie(String title, String posterPath, String overview)
: this.title = title, this.posterPath = posterPath, this.overview = overview;
Run Code Online (Sandbox Code Playgroud)
您的构造函数可以将所有这些与主体结合起来:
Movie(this.title, this.posterPath, String overview)
: this.overview = overview ?? "Default Overview!" {
if (title == null) throw ArgumentError.notNull("title");
}
Run Code Online (Sandbox Code Playgroud)
(const构造函数不能具有主体,但是可以具有对允许的表达式有一些限制的初始化列表,以确保可以在编译时对其进行求值)。
| 归档时间: |
|
| 查看次数: |
2244 次 |
| 最近记录: |