gpt4 book ai didi

dart - Dart 中类构造函数语法的区别

转载 作者:IT王子 更新时间:2023-10-29 06:47:27 25 4
gpt4 key购买 nike

我正在创建一个如下所示的类:

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';
}
}

我收到一条警告,指出“最终变量‘overview’、‘posterPath’和‘1’ more must be initialized。每个变量周围也有警告说‘title’不能用作setter 因为它是最终的。

当我使用这种语法编写构造函数时,警告消失了:

Movie.fromJson(Map json)
: title = json["title"],
posterPath = json["poster_path"],
overview = json['overview'];

这里到底发生了什么?

最佳答案

Dart 对象必须在任何人获得对新对象的引用之前完全初始化。由于构造函数的主体可以访问 this,因此对象需要在进入构造函数主体之前进行初始化。

为此,生成式 Dart 构造函数有一个初始化列表,看起来类似于 C++,您可以在其中初始化字段,包括最终字段,但您还不能访问对象本身。语法:

Movie.fromJson(Map json)
: title = json["title"],
posterPath = json["poster_path"],
overview = json['overview'];

使用初始化列表(: 之后的赋值列表)初始化最终实例变量titleposterPath概述

第一个构造函数使用“初始化形式”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");
}

(const 构造函数不能有主体,但它可以有一个初始化列表,对允许的表达式有一些限制,以确保它们可以在编译时求值)。

关于dart - Dart 中类构造函数语法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52528818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com