Flutter/Dart Error - NoSuchMethodError (NoSuchMethodError: Class 'String' has no instance method 'map'

Flutter/Dart Error - NoSuchMethodError (NoSuchMethodError: Class 'String' has no instance method 'map'

我收到一个与 Flutter/Dart 内的 JSON 接收器有关的错误。

由于完整的 json 回复非常长,因此不得不在文档文件中共享。它有 15 列 error log

详情Class

class Detail {
String kodkursus;
String namakursus;
String kursusdescription;

Detail(
  {required this.kodkursus,
  required this.namakursus,
  required this.kursusdescription});

factory Detail.fromJson(Map<String, dynamic> json) {
return Detail(
  kodkursus: json['crs_code'] as String,
  namakursus: json['crs_title_bm'] as String,
  kursusdescription: json['crs_description_bm'] as String,
  
);
}
}

代码

Future<dynamic> generateDetailList() async {
var url = 'http://10.0.2.2:81/login_testing/kursus_display.php';
var data = {'usr_id': widget.username2};
var response = await http.post(url, body: json.encode(data));

var list = json.decode(json.encode(response.body));

List<Detail> _detail =
    list.map<Detail>((json) => Detail.fromJson(json)).toList();
detailDataSource = DetailDataSource(_detail);
return _detail;
}

Return(满error log

NoSuchMethodError (NoSuchMethodError: Class 'String' has no instance method 'map'...

我对这个 Flutter/Dart 很陌生,但我觉得它与 json 有关,只是我无法理解它

请检查您的 API 回复,因为当数据类型不同时会产生此错误。

此错误表明您的应用程序在字符串中响应它,并且您正在以地图的形式访问它,因此请检查您的 API 响应或

尝试替换这个:

var list = json.decode(json.encode(response.body));

与 :

var list = json.decode(response.body);

因为 json.encode 方法对所有列表数据进行编码,并且值数据类型是字符串,所以它会出错。

将您的函数 generateDetailList 替换为:

Future<List<Detail>?> generateDetailList() async {
  Uri url = Uri.parse('http://10.0.2.2:81/login_testing/kursus_display.php');
  Map<String, String> data = {'usr_id': 'widget.username2'};
  http.Response response = await http.post(url, body: json.encode(data));

  // var list = json.decode(json.encode(response.body));

  var responseMap = await jsonDecode(response.body);
  if (response.statusCode == 200) {
    List<Detail> _details =
        responseMap.map<Detail>((x) => Detail.fromJson(x)).toList();
    return _details;
  } else {
    return null;
  }
}

并且尽量不要到处使用 var。