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");
}

(常量构造函数不能有一个主体,但它可以有一个初始值设定项列表,对允许的表达式有一些限制,以确保它们可以在编译时进行计算)。

谢谢,这非常有帮助!