简体   繁体   中英

Cannot create named constructor in Flutter

I am new to Flutter.

I am creating a named constructor to work with flutter Models. But for some reason it is showing an error:

class ImageModel {
  int id;
  String url;
  String title;

  // constructor
  ImageModel(this.id, this.url, this.title);

  // named constructor
  ImageModel.fromJSON(Map<String, dynamic> parsedJson) { 
    id = parsedJson['id'];
    url = parsedJson['url'];
    title = parsedJson['title'];
  }
}

Error:

Non-nullable instance field 'url' must be initialized.
Try adding an initializer expression, or add a field initializer 
in this constructor, or mark it 'late'.dartnot_initialized_non_nullable_instance_field

I read the documentation, and found this solution, not sure why this is required at this place. I know its use case, but should not this work without this ?

class ImageModel {
  late int id; // refactor
  late String url; // refactor
  late String title; // refactor
.
.
.

You have used incorrect syntax for the named constructor.

Instead of

  ImageModel.fromJSON(Map<String, dynamic> parsedJson) { 
    id = parsedJson['id'];
    url = parsedJson['url'];
    title = parsedJson['title'];
  }

it must be

ImageModel.fromJSON(Map<String, dynamic> parsedJson) :
    id = parsedJson['id'],
    url = parsedJson['url'],
    title = parsedJson['title'];

The object is initialized after colon(:) in named constructor and curly brackets({}) are then used if you want to perform some task after initialization of object. Since you directly used {} after named constructor, it created an empty object for you and hence all parameters were null which you were trying to initialize in the function body. That's why this issue was solved after using 'late' keyword.

do you like this way

factory ImageModel.fromJson(Map<String, dynamic> json) {
    return ImageModel(
      json["id"],
      json["url"],
      json["title"],
    );
  }

And i prefer

class ImageModel {
  int id;
  String url;
  String title;

  // constructor
  ImageModel({
    required this.id,
    required this.url,
    required this.title,
  });

  factory ImageModel.fromJson(Map<String, dynamic> json) {
    return ImageModel(
      id: json["id"],
      url: json["url"],
      title: json["title"],
    );
  }
}

The Dart compiler complains because of its "null safety" feature. This means, that variable types like int or String must be initialised. This is been checked for at compile time. You can either add required in the constructor

  ImageModel({
    required this.id,
    required this.url,
    required this.title,
  });

so that you cannot call the constructor without initialising the fields or let the compiler know that you will take care of the initialisation later by adding the late keyword (as you did). Of course you can also initialise the variables with some default values, if there are such

  int id = 0;
  String url = "https://www.example.com/default.jpg";
  String title = "Default Text";

but that seems to be more of a corner case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM