[英]Dart class constructor initialise fields in constructor body
我正在嘗試在以下代碼中初始化字段任務,但出現錯誤: Non-nullable instance field 'tasks' must be initialized.
. 我可以使用Example(this.tasks) {}
或Example(String json): this.tasks = [json]
類的語法成功初始化字段,但是當我需要使用多行來計算值時,我不確定如何初始化字段就像下面的代碼一樣。
import 'dart:convert';
class Example {
List<String> tasks;
Example(String json) {
List<String> data = jsonDecode(json);
this.tasks = data;
}
}
在此示例中,您不需要多行來計算該值。 你可以這樣做:
Example(String json) : this.tasks = jsonDecode(json);
在您確實需要多個語句的更一般情況下,如果字段初始化值不相關,我會為每個語句使用輔助函數:
Example(String json) : this.tasks = _computeTasks(json);
static List<String> _computeTasks(String json) {
List<String> result;
// compute compute compute
return result;
}
如果您有多個字段需要使用來自同一計算的值進行初始化,我首先嘗試將其設為工廠構造函數:
final Something somethingElse;
Example._(this.tasks, this.somethingElse);
factory Example(String json) {
List<String> tasks;
Something somethingElse;
// compute compute compute
return Example._(tasks, somethingElse);
}
如果構造函數需要生成,並且您需要在同一計算中計算多個值,並且不更改這一點非常重要,那么我可能會制作一個中間 object 來保存這些值:
Example(String json) : this._(_computeValues(json));
Example._(_Intermediate values)
: tasks = values.tasks, somethingElse = values.somethingElse;
static _Intermediate _computeValues(String json) {
List<String> tasks;
Something somethingElse;
// compute compute compute
return _Intermediate(tasks, somethingElse);
}
...
}
// Helper class.
class _Intermediate {
final List<String> tasks;
final Something somethingElse;
_Intermediate(this.tasks, this.somethingElse);
}
如果類型相同,您也許可以使用List
而不是 helper class 作為中間值。 或者,您可以重用 class 之類的
class Pair<S, T> {
final S first;
final T second;
Pair(this.first, this.second);
}
你怎么做並不是很重要,用戶永遠不會看到中間值。
你是正確的,不可為空的值必須首先在 object 構造時初始化為 arguments,或者在初始化列表中。
但是,在初始化完成之前,您不能在 object 上調用方法。 (你可能不應該反正 object 結構應該保持盡可能輕量級)
如果在構造 object 之前(或之后)有任何處理需要完成,可以使用factory
構造函數。 實際上,您似乎正在嘗試從 json 創建一個 object ,這正是官方文檔中所舉例說明的。
為了簡化該示例,我已鏈接到並刪除有關緩存的任何內容,它看起來像這樣:
class Logger {
String name;
bool mute = false;
factory Logger.fromJson(Map<String, Object> json) {
return Logger._internal(json['name'].toString());
}
Logger._internal(this.name);
}
Irn 的解決方案很好。 如果您同意,您也可以使tasks
為空:
List<String>? tasks;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.