簡體   English   中英

Dart class 構造函數初始化構造函數主體中的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM