繁体   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