' 不是类型 'String' 的子类型,json,flutter,parsing,dart,json-serialization"/>

首页 > 解决方案 > 未处理的异常:类型 '_InternalLinkedHashMap' 不是类型 'String' 的子类型

问题描述

我试图解析 json,将其打印到控制台,然后放入 ListView.builder 并收到此错误:类型 '_InternalLinkedHashMap<String, dynamic>' 不是类型 'String' 的子类型

我如何解决它?

列出数据

FutureBuilder(
  future: restaurantSearch,
  builder: (context, AsyncSnapshot<RestaurantSearch> snapshot) {
    if(snapshot.connectionState == ConnectionState.waiting) {
      return Expanded(child: Center(child: CircularProgressIndicator(strokeWidth: 3)));
    } else if(snapshot.connectionState == ConnectionState.done) {
      if(snapshot.hasData) {
        return ListView.builder(
          shrinkWrap: true,
          itemCount: snapshot.data.restaurants.length,
          itemBuilder: (context, index) {
            var restaurant = snapshot.data.restaurants[index];
            return ListTile(
              title:Text(restaurant.name),
            );
          }
        );
      }
    } else if (snapshot.hasError) {
        return Center(child: Text(snapshot.error.toString()));
    }
    return Text('');
  }
)

api服务

Future<RestaurantSearch> restaurantSearch(String query) async {
    final response = await dio.get("https://restaurant-api.dicoding.dev/search", queryParameters: {"q": query});
    print(response.data);
    if(response.statusCode == 200) {
      return RestaurantSearch.fromJson(json.decode(response.data));
    } else {
      throw Exception("Failed to Load Detail Restaurant, Please Check Your Internet");
    }
  }

模型

import 'dart:convert';

RestaurantSearch restaurantSearchFromJson(String str) => RestaurantSearch.fromJson(json.decode(str));

String restaurantSearchToJson(RestaurantSearch data) => json.encode(data.toJson());

class RestaurantSearch {
  RestaurantSearch({
    this.error,
    this.founded,
    this.restaurants,
  });

  bool error;
  int founded;
  List<RestaurantS> restaurants;

  factory RestaurantSearch.fromJson(Map<String, dynamic> json) => RestaurantSearch(
    error: json["error"],
    founded: json["founded"],
    restaurants: List<RestaurantS>.from(json["restaurants"].map((x) => RestaurantS.fromJson(x))),
  );

  Map<String, dynamic> toJson() => {
    "error": error,
    "founded": founded,
    "restaurants": List<String>.from(restaurants.map((x) => x.toJson())),
  };
}

class RestaurantS {
  RestaurantS({
    this.id,
    this.name,
    this.description,
    this.pictureId,
    this.city,
    this.rating,
  });

  String id;
  String name;
  String description;
  String pictureId;
  String city;
  double rating;

  factory RestaurantS.fromJson(Map<String, dynamic> json) => RestaurantS(
    id: json["id"],
    name: json["name"],
    description: json["description"],
    pictureId: json["pictureId"],
    city: json["city"],
    rating: json["rating"].toDouble(),
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "name": name,
    "description": description,
    "pictureId": pictureId,
    "city": city,
    "rating": rating,
  };
}

非常感谢您的回答........................................... ..................................................... ..................................................... ..................................................... …………………………………………………………………………………………………………………………………………

标签: jsonflutterparsingdartjson-serialization

解决方案


您需要删除json.decode,因为 Dio 已经为您解码了身体

更改此行

return RestaurantSearch.fromJson(response.data);

推荐阅读