Flutter 错误:期望类型为“Map<String, dynamic>”的值,但发生了类型为“List<dynamic>”的值

时间:2021-05-06 18:25:46

标签: flutter dart

我正在使用 http: ^0.13.3, 这是我的简单代码,当我运行此代码时,出现错误:“期望类型为 'Map' 的值,但出现了类型为 'List' 的值”,我不知道为什么会这样得到这个错误。如果有任何其他方法可以做到这一点,请告诉我。

class SubCategoryObject {
  final int id;
  final String category;

  SubCategoryObject({@required this.id, @required this.category});

  factory SubCategoryObject.fromJson(Map<String, dynamic> json) {
    return SubCategoryObject(
      id: json['id'],
      category: json['title'],
    );
  }
}
class SubCategoryListScreen extends StatelessWidget {
  static const route = 'sub-category-list';
  SubCategoryListScreen({Key key}) : super(key: key);

  Future<SubCategoryObject> getData() async {
    final res =
        await http.get(Uri.https("jsonplaceholder.typicode.com", "todos"));

    if (res.statusCode == 200) {
      return SubCategoryObject.fromJson(jsonDecode(res.body));
    } else {
      // If that call was not successful, throw an error.
      throw Exception('Failed to load ');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("martman"),
      ),
      body: FutureBuilder<SubCategoryObject>(
        future: getData(),
        builder: (ctx, snapshot) {
          // Checking if future is resolved or not
          if (snapshot.connectionState == ConnectionState.done) {
            // If we got an error
            if (snapshot.hasError) {
              return Center(
                child: Text(
                  '${snapshot.error} occured',
                  style: TextStyle(fontSize: 18),
                ),
              );

              // if we got our data
            } else if (snapshot.hasData) {
              return Text(snapshot.data.category);
            }
          }

          // Displaying LoadingSpinner to indicate waiting state
          return Center(
            child: CircularProgressIndicator(),
          );
        },

        
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:3)

请查看以下链接。它返回列表,而不是地图数据。 https://jsonplaceholder.typicode.com/todos

Future<List<SubCategoryObject>> getData() async {
    final res =
        await http.get(Uri.https("jsonplaceholder.typicode.com", "todos"));

    if (res.statusCode == 200) {
      dynamic result = jsonDecode(res.body);
      return (result as List).map((e) => SubCategoryObject.fromJson(e)).toList();
    } else {
      // If that call was not successful, throw an error.
      throw Exception('Failed to load ');
    }
}