【问题标题】:Error Flutter: List<dynamic> is not a subtype of type Map<String, dynamic>错误颤振:List<dynamic> 不是 Map<String, dynamic> 类型的子类型
【发布时间】:2021-11-20 15:03:49
【问题描述】:

谁能帮我解决这个问题。

我目前正在构建一个从 MySQl 读取数据的应用程序。 我无法使用颤振 http 请求从 json 获取数据,因为它得到了这个错误:列表不是 Map 类型的子类型 谁能帮帮我。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:http/http.dart' show get;
import 'dart:convert';

void main() => runApp(
    MyApp(
        txtscr: obtenirTxtscr()
    )
);
class Txtscr {
  final String id;
  final String content;
  Txtscr({
    required this.id,
    required this.content,
  });

  factory Txtscr.fromJson(Map<String, dynamic> jsonData) {
    return Txtscr(
      id: jsonData['id'],
      content: jsonData['content'],
    );
  }
}
Future<Txtscr> obtenirTxtscr() async {
final jsonEndpoint = Uri.parse('https://www.domaine.com/txtscr.php');
final response = await get(jsonEndpoint);
if(response.statusCode == 200) {
return Txtscr.fromJson(json.decode(response.body));
 } else {
  throw Exception("Error al obtenir el JSON");}}
class MyApp extends StatelessWidget {
final Future<Txtscr> txtscr;

  MyApp({Key? key, required this.txtscr}): super(key: key);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      title: "JSON URL",
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text("Text Json"),
        ),
        body: Center(
          child: FutureBuilder<Txtscr>(
            future: txtscr,
            builder: (context, snapshot) {
              if(snapshot.hasData) {
                return Text(
                    "ID: " + snapshot.data!.id + "\n" +
                    "Content: " + snapshot.data!.content
                );
              } else if(snapshot.hasError) {
                return Text("${snapshot.error}");
              }
              return CircularProgressIndicator();
            },
          ),),),
    );
  }
}

如何纠正这个错误?

【问题讨论】:

  • 你能贴出 print(response.body) 在 obtenirTxtscr() 函数中给出的内容吗?
  • 这是 JSON 文件的一部分:[ { "id": "62", "content": "Saison de spectacles" } ]

标签: php mysql json flutter


【解决方案1】:

您的 JSON 结果是一个数组(列表),而不是您的这部分代码所期望的映射:Txtscr.fromJson(json.decode(response.body))。您可以通过以下步骤解决它:

  1. 将您的结果解释为ListTxtscr 对象。像这样重构你的未来:
Future<List<Txtscr>> obtenirTxtscr() async {      // <-- added List
  final jsonEndpoint = Uri.parse('https://www.domaine.com/txtscr.php');
  final response = await get(jsonEndpoint);
  if (response.statusCode == 200) {
      return (json.decode(response.body) as List) // <-- added mapping
          .map((entry) => Txtscr.fromJson(entry))
          .toList();
  } else {
    throw Exception("Error al obtenir el JSON");
  }
}

  1. 同时更改 MyApp 中的未来声明:
class MyApp extends StatelessWidget {
 Future<List<Txtscr>> txtscr;
  1. 现在您将在FutureBuilder 中获得一个数组(列表)。如果列表中有 1 项或更多项,您必须决定要做什么。
FutureBuilder<Txtscr>(
  future: txtscr,
  builder: (context, snapshot) {
    if(snapshot.hasData) {
      // here you will have snapshot.data! as a list
      // so you can use the below code for first element
      // but it could have 0 or more items, you have to handle it
      return Text(
          "ID: " + snapshot.data![0].id + "\n" +
          "Content: " + snapshot.data[0]!.content
      );
    } else if(snapshot.hasError) {
      return Text("${snapshot.error}");
    }
    return CircularProgressIndicator();
  },
)

【讨论】:

    【解决方案2】:

    只需更改此行

    return Txtscr.fromJson(json.decode(response.body));
    

    return Txtscr.fromJson(json.decode(response.body)[0]);
    

    注意:数组 JSON 不是有效的 Map,这就是您收到错误的原因。

    【讨论】:

      猜你喜欢
      • 2019-01-22
      • 2021-07-01
      • 2021-04-13
      • 2020-01-18
      • 2021-04-06
      • 2021-12-29
      • 2023-01-08
      • 2019-04-03
      相关资源
      最近更新 更多