Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

type 'Null' is not a subtype of type 'String' when get data

I have a response in JSON:

{
    "data": {
        "id": "12-43-abc",
        "number": "4",
        "name": "Admin Test 1",
        "stage": "active",
        "sex": "female",
        "title": "admin",
        "dob": null,
        "phoneNumber": "1",
        "email": "admin1@gmail.com",
        "address": null,
        "mId": null,
        "createdDateTime": "2020-09-17T02:42:10.447Z",
        "totalRemain": null,
        "carryOverRemain": null,
        "fromTime": null,
        "toTime": null
    }
}

To convert JSON to Object, I create a model:

class User {
  String? id;
  String? number;
  String? name;
  String? stage;
  String? sex;
  String? title;
  DateTime? dob;
  String? phoneNumber;
  String? email;
  String? address;
  String? mId;
  DateTime? createdDateTime;
  int? totalRemain;
  int? carryOverRemain;
  DateTime? fromTime;
  DateTime? toTime;

  User({
      this.id,
      this.number,
      this.name,
      this.stage,
      this.sex,
      this.title,
      this.dob,
      this.phoneNumber,
      this.email,
      this.address,
      this.mId,
      this.createdDateTime,
      this.totalRemain,
      this.carryOverRemain,
      this.fromTime,
      this.toTime});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      number: json['badgeNumber'] ?? "null",
      name: json['name'] ?? "null",
      stage: json['status'],
      sex: json['gender'] ?? "null",
      title: json['title'] ?? "null",
      dob: DateTime.parse(json['birthDay']),
      phoneNumber: json['phone'] ?? "null",
      email: json['email'] ?? "null",
      address: json['address'] ?? "null",
      mId: json['managerId'] ?? "null",
      createdDateTime: DateTime.parse(json['createdDateTime']),
      totalRemain: json['totalRemain'],
      carryOverRemain: json['carryOverRemain'],
      fromTime: DateTime.parse(json['fromTime']),
      toTime: DateTime.parse(json['toTime'])
    );
  }
}

I create a signIn method:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Future<Either<Failure, dynamic>> signIn(String number, String password) async {
    try {
      Map<String, String> bd = {
        'number': number,
        'password': password
      };

      final Response res = await dio.post(Endpoint.signIn, data: bd);

      if(res.statusCode == 200) {
        return Right(User.fromJson(res.data['data']));
      }
      else {
        return Right(res.data['error']);
      }
    }
    catch(e) {
      throw e;
      return Left(SystemFailure());
    }
  }

When debugging, the status code is 200 but it throws an exception type ‘Null’ is not a subtype of type ‘String’. I’ve searched Google for it but still have no answer. No idea what’s wrong in my model class. Thanks for your help.

>Solution :

The problem is with dob, fromTime and toTime because they are null. You can’t do DateTime.parse() on null. So maybe you can replace this

toTime: DateTime.parse(json['toTime'])

with

toTime: json['toTime'] != null ? DateTime.parse(json['toTime']) : null

for example. The same logic with dob and toTime. Probably also with createdDateTime in case that one happens to be null as well

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading