构造函数可选参数

时间:2018-09-21 18:45:35

标签: dart flutter

是否可以设置构造函数的可选参数? 我的意思是:

User.fromData(this._name, 
  this._email, 
  this._token, 
  this._refreshToken,  
  this._createdAt,  
  this._expiresAt,  
  this._isValid,  
  {this.id});

它表示

  

命名选项参数不能以下划线开头。

但是我需要将此字段设置为私有字段,因此,我现在迷路了。

3 个答案:

答案 0 :(得分:4)

除了出色的Suragch的answer外,我还想提到@require注释。您可以将其用于多个构造函数或函数参数以指定必需的参数。

class User {
  int _id;
  String _firstName;
  String _lastName;
  User({@required int id, String firstName = "", String lastName}) 
    : _id = id,  // required parameter
      _firstName = firstName,  // optional parameter with default value ""
      _lastName = lastName;  // optional parameter without default value
}

User user1 = User(id: 1);
User user2 = User(id: 2, firstName: "John");
User user3 = User(id: 3, lastName: "Snow");

相关的Dart文档here

答案 1 :(得分:2)

您需要使用一个简单的参数,并在初始化列表中初始化您的私有字段。

class User {
  final String _id;
  final String _name;
  User.fromData(this._name, {String id})
      : _id = id;
}

答案 2 :(得分:1)

对于将来的观看者来说,这是更笼统的答案。

位置可选参数

[ ]方括号包裹可选参数。

class User {

  String name;
  int age;
  String home;

  User(this.name, this.age, [this.home = 'Earth']);
}

User user1 = User('Bob', 34);
User user2 = User('Bob', 34, 'Mars');

命名的可选参数

{ }大括号括住可选参数。

class User {

  String name;
  int age;
  String home;

  User(this.name, this.age, {this.home = 'Earth'});
}

User user1 = User('Bob', 34);
User user2 = User('Bob', 34, home: 'Mars');

注意

如果需要私有字段,则可以使用[]方括号:

class User {
  int _id;
  User([this._id]);
}

User user = User(3);

或按照公认的答案进行操作,并使用初始化列表:

class User {
  int _id;
  User({int id}) 
    : _id = id;
}

User user = User(id: 3);