【问题标题】:Initialise class parameter with default value使用默认值初始化类参数
【发布时间】:2020-04-19 11:33:42
【问题描述】:

如何用默认值初始化类参数

void main() {
  Test t = Test();
  print(t.l); //<-prints null, should print []
}

class Test{
  List l=[];
  Test({this.l});
}

我认为这以前对我有用,但由于某种原因它现在不起作用

void main() {
  Test t = Test();
  print(t.l); 
}

class Test{
  List l;
  Test({this.l}) : l = l ?? []; //<- as from GitHub this doesn't work either
}

【问题讨论】:

  • @user 这不完全是一个答案...我有大约 5 个参数需要具有默认值...该解决方法很糟糕...抱歉.. 必须有更好的方法这样做
  • 如果你不想保持默认值,没有更好的办法。
  • @VyacheslavEgorov 出于某种原因,当我删除构造函数时它可以工作。我很肯定这以前可以工作。并且由于某种原因,我已经删除了我的类中的所有构造函数,这些构造函数以前需要并且一切正常。飞镖语言有什么变化吗?

标签: flutter dart


【解决方案1】:

如果您想要么采用参数,或者在省略参数时使用默认值,那么您需要使用类似于第二个示例的内容:

class MyListClass {
  final List myList;
  MyListClass({List myList}) : myList = myList ?? [];
}

(注意,构造函数参数列表中不是this.myList,因为它是由初始化列表条目初始化的)。

如果默认值是编译时常量,可以将其作为实参默认值:

class MyListClass {
  final List myList;
  MyListClass({this.myList = const []});
}

这仅在默认值不变的情况下有效,并且它仍然(直到发布 Null Safety)存在将null 作为显式参数传递的风险。第一个示例将null 替换为[],无论null 来自省略参数还是显式传递null。

(我更喜欢前一种方法,即使默认值是常量,因为它处理显式空值。使用空值安全,这将不再是必要的)。

【讨论】:

  • 谢谢...这很有帮助..说实话,我在写这个问题的时候有点困惑。也许来自其他编程语言或其他东西......
【解决方案2】:

VyacheslavEgorov 评论说,如果您不想要 const 默认值,最好的方法是使用初始化程序

根据this github 的问题,删除构造函数时它起作用的原因是:

当你写 f({this.x}) 时,这意味着 f({this.x : null})。

默认初始化器只能是常量,所以最好的选择是 f({列表 x}) : x = x ?? [];

应该是这样的:

class MyListClass {
  List myList;

  MyListClass({List myList}) : this.myList = myList ?? [];
}

【讨论】:

猜你喜欢
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多