Constructor Optional Params

DartFlutter

Dart Problem Overview


Is there a way to set a constructor optional param? I mean something like:

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

It indicates that >Named option parameters can't start with an underscore.

But I need this field as private, so, I'm lost now.

Dart Solutions


Solution 1 - Dart

This is a more general answer for future viewers.

Positional optional parameters

Wrap the optional parameter with [ ] square brackets.

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');

Optional parameters need to be nullable if you don't provide a default value:

class User {

  String name;
  int age;
  String? home; //    <-- Nullable

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

Named optional parameters

Wrap the optional parameter with { } curly braces.

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');

The default for home is "Earth", but like before, if you don't provide a default then you need to change String home to String? home.

Private fields

If you need private fields then you can use [] square brackets:

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

User user = User(3);

or do as the accepted answer says and use an initializer list:

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

User user = User(id: 3);

Named required parameters

Named parameters are optional by default, but if you want to make them required, then you can use the required keyword:

class User {
  final String name;
  final int age;
  final String home;

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

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

Solution 2 - Dart

You need to use a simple parameter and initialize your private field in initializer list.

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

Solution 3 - Dart

In addition to great Suragch's answer I wanted to mention required word. You can use it for multiple constructor or function named parameters to specify required ones.

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");

Related Dart docs here.

For Dart version <= 2.10 @required is an annotation and used with the @ prefix.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJoseph ArriazaView Question on Stackoverflow
Solution 1 - DartSuragchView Answer on Stackoverflow
Solution 2 - DartAlexandre ArdhuinView Answer on Stackoverflow
Solution 3 - DartMol0koView Answer on Stackoverflow