Dart中类构造函数语法的差异
我正在创建一个类,它如下所示:Dart中类构造函数语法的差异,dart,flutter,Dart,Flutter,我正在创建一个类,它如下所示: 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['overvi
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';
}
}
我收到一条警告,说“最终变量‘概述’、‘posterPath’、‘1’等必须初始化。每个变量周围都有警告,说‘title’不能用作setter,因为它是最终变量
当我使用此语法编写构造函数时,警告消失了:
Movie.fromJson(Map json)
: title = json["title"],
posterPath = json["poster_path"],
overview = json['overview'];
这里到底发生了什么?我刚刚找到了一些关于这方面的文档,&第二个版本的
:
是所谓的“初始值设定项列表”,它允许您在构造函数主体运行之前初始化实例变量
文档中对此有更详细的说明。Dart将属性初始化与构造函数体分离 建造师有三个部分:
- 名称/参数定义
- 属性初始化/超级调用/断言
- 一个实体,类似于在构造上立即运行的函数
final
变量必须在前两个部分上初始化。它们不能在主体内部初始化
完整构造函数将如下所示:
MyClass(int value)
: assert(value > 0),
property = value,
super();
{
print("Hello World");
}
此初始值设定项部分的主要用途是用于无主体构造函数,它允许常量构造函数,这是一种特定于dart的功能。有关这些特性的详细信息,请参阅。在任何人获得对新对象的引用之前,必须完全初始化dart对象。由于构造函数主体可以访问
this
,因此对象需要ini在进入构造器主体之前初始化
这样,生成的DART构造函数有一个初始化列表,看起来类似于C++,在这里你可以初始化字段,包括最终字段,但是你不能访问对象本身。
Movie.fromJson(Map json)
: title = json["title"],
posterPath = json["poster_path"],
overview = json['overview'];
使用初始值设定项列表(在:
之后的赋值列表)初始化最终实例变量title
、posterPath
和overview
第一个构造函数使用“initializing formal”this.title
将参数直接放入字段中
构造器
Movie(this.title, this.posterPath, this.overview);
实际上是以下内容的简写:
Movie(String title, String posterPath, String overview)
: this.title = title, this.posterPath = posterPath, this.overview = overview;
您的构造函数可以将所有这些内容与主体结合起来:
Movie(this.title, this.posterPath, String overview)
: this.overview = overview ?? "Default Overview!" {
if (title == null) throw ArgumentError.notNull("title");
}
(常量构造函数不能有一个主体,但它可以有一个初始值设定项列表,对允许的表达式有一些限制,以确保它们可以在编译时进行计算)。谢谢,这非常有帮助!