Constructor Optional Params

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

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;
}

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.