H Zan
H Zan

Reputation: 387

NoSuchMethodError: The method 'map' was called on null

[ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: NoSuchMethodError: The method 'map' was called on null. E/flutter (19718): Receiver: null E/flutter (19718): Tried calling: map(Closure: (dynamic) => SeriesNo)

I tried json_annotation and json Serieizable but don't work.According my model one.json is ok.but two.json is reques error happen as title.How to solve.I known series no is error but i have no idea how to solve.

This is one.json

 {
   "bookDetail": {
    "title": "aaa",
    "author": "aaa",
    "image": "https://",
    "text": "aaa",
    "series_no": [
        {
            "id": 2
        }
    ],
    "created_at": "2019-08-27 15:19:10"
  }
}

This is two.json

{
"bookDetail": {
    "title": "Test",
    "author": "TEst",
    "image": "https:/riv19q9x.png",
    "text": "Test",
    "series_no": null,
    "created_at": "2019-08-27 15:13:56"
  }
}

This is detail.model using bloc flutter

class BookDetailModel {
    BookDetail bookDetail;

    BookDetailModel({
    this.bookDetail,
 });

factory BookDetailModel.fromJson(Map<String, dynamic> json) =>
  new BookDetailModel(
    bookDetail: BookDetail.fromJson(json["bookDetail"]),
   );

Map<String, dynamic> toJson() => {
    "bookDetail": bookDetail.toJson(),
  };
}

  @JsonSerializable(nullable: true)
   class BookDetail {
   String title;
   String author;
   String image;
   String text;

   List<SeriesNo> seriesNo;
   DateTime createdAt;

   BookDetail({
    this.title,
    this.author,
   this.image,
   this.text,
   this.seriesNo,
  this.createdAt,
 });

factory BookDetail.fromJson(Map<String, dynamic> json) => new BookDetail(
    title: json["title"],
    author: json["author"],
    image: json["image"],
    text: json["text"],
    seriesNo: new List<SeriesNo>.from(
        json["series_no"].map((x) => SeriesNo.fromJson(x))),
    createdAt: DateTime.parse(json["created_at"]),
  );

  Map<String, dynamic> toJson() => {
    "title": title,
    "author": author,
    "image": image,
    "text": text,
    "series_no": new List<dynamic>.from(seriesNo.map((x) => x.toJson())),
    "created_at": createdAt.toIso8601String(),
  };
 }

  @JsonSerializable(nullable: true)
  class SeriesNo {
   int id;

   SeriesNo({
     this.id,
  });

  factory SeriesNo.fromJson(Map<String, dynamic> json) => new SeriesNo(
    id: json["id"],
  );

  Map<String, dynamic> toJson() => {
    "id": id,
  };
}

Upvotes: 1

Views: 13607

Answers (3)

Ake
Ake

Reputation: 49

If it's a List and a double value, how can it be written even if it's correct? I got this problem. Please see my link.Link Linkclass

Food _$FoodFromJson(Map<String, dynamic> json) => Food(
      ingredient: (json['ingredient'] as List<dynamic>)
          .map((e) => e as String)
          .toList(),
      quantity:
          (json['quantity'] as List<dynamic>).map((e) => e as String).toList(),
      uom: (json['uom'] as List<dynamic>).map((e) => e as String).toList(),
      step: (json['step'] as List<dynamic>).map((e) => e as String).toList(),
    );

Upvotes: 0

H Zan
H Zan

Reputation: 387

Try to verify if is not null before:

seriesNo: json["series_no"] != null ? new List<SeriesNo>.from( json["series_no"].map((x) => SeriesNo.fromJson(x))) : List<SeriesNo>().

This is answer for my question.Crd @Stel

Upvotes: 6

Lucas Matos
Lucas Matos

Reputation: 576

try placing seriesNo as dynamic and placing the remaining fields

class BookDetailModel {
    BookDetail bookDetail;

    BookDetailModel({
        this.bookDetail,
    });

    factory BookDetailModel.fromJson(Map<String, dynamic> json) => BookDetailModel(
        bookDetail: BookDetail.fromJson(json["bookDetail"]),
    );

    Map<String, dynamic> toJson() => {
        "bookDetail": bookDetail.toJson(),
    };
}

class BookDetail {
    String title;
    String author;
    String image;
    String text;
    dynamic seriesNo;
    DateTime createdAt;

    BookDetail({
        this.title,
        this.author,
        this.image,
        this.text,
        this.seriesNo,
        this.createdAt,
    });

    factory BookDetail.fromJson(Map<String, dynamic> json) => BookDetail(
        title: json["title"],
        author: json["author"],
        image: json["image"],
        text: json["text"],
        seriesNo: json["series_no"],
        createdAt: DateTime.parse(json["created_at"]),
    );

    Map<String, dynamic> toJson() => {
        "title": title,
        "author": author,
        "image": image,
        "text": text,
        "series_no": seriesNo,
        "created_at": createdAt.toIso8601String(),
    };
}

Upvotes: 0

Related Questions