无法将JSON数据解析为listview(_TypeError(类型'_InternalLinkedHashMap <String,dynamic>'不是类型'FutureOr <List <dynamic >>'的子类型)

时间:2019-10-28 21:51:16

标签: json flutter dart

无法从URL解析JSON数据,并出现错误“ _TypeError(类型'_InternalLinkedHashMap'不是类型'FutureOr>'的子类型)”。 因此,您可以从链接中检查数据。并让我知道我在做什么错,谢谢。

我尝试使用地图,但无效。

<table appRow *ngFor="let item of items" [itemInput]="item">
</table>

我想从该URL获取数据并显示在我的列表视图中。我需要添加的内容,请提出建议,谢谢。

2 个答案:

答案 0 :(得分:0)

在我看来,问题出在_getHotels()方法上。它说它返回一个Future<List>,因为这就是您所期望的。但是Flutter无法知道您提供的URL(https://amarroom...)的含义。事实证明,当您发布带有该URL的HTTP请求时,它将返回:

{
"special_amenities": [
    1,
    5,
    11,
    48,
    45
],
"facets": {
    "neighborhood": [
        [
...
}

它不是List,而是JSON,即Dart中的Map<String, dynamic>。因此,您的_getHotels()函数不应返回Future<List>,而应返回Future<Map<String, dynamic>>

然后,如果需要,您可以对从该函数返回的Map<String, dynamic>进行任何操作,然后将其转换为List

答案 1 :(得分:0)

您需要像这样的动态访问权限
您可以在

下粘贴并运行完整代码

代码段

for (var i = 0; i < responseData["hotels"].length; i++) {
      print(responseData["hotels"][i]["name"]);
    }

...
ListTile(
                    title: Text(responseData["hotels"][index]["name"]),
                    subtitle: Text(responseData["hotels"][index]["location"]),
                  ),    

enter image description here

完整代码

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ui_hotel_list(),
    );
  }
}

class ui_hotel_list extends StatefulWidget {
  @override
  _ui_hotel_listState createState() => _ui_hotel_listState();
}

class _ui_hotel_listState extends State<ui_hotel_list> {
  dynamic responseData;
  bool loading = false;

  Future<dynamic> _getHotels() async {
    setState(() {
      loading = true;
    });
    String serviceURL =
        "https://amarroom.com/api/v2/search/filtered/?checkin=08-11-2019&checkout=09-11-2019&adults=2&rooms=1&location=1&page=1";
    var response = await http.get(serviceURL);

    return json.decode(response.body.toString());
  }

  printv() async {
    responseData = await _getHotels();
    setState(() {
      loading = false;
    });

    for (var i = 0; i < responseData["hotels"].length; i++) {
      print(responseData["hotels"][i]["name"]);
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    this._getHotels();
    this.printv();
  }

  @override
  Widget build(BuildContext context) {
    return loading
        ? Container(height: 100, width: 100, child: CircularProgressIndicator())
        : Container(
            child: ListView.builder(
              padding: EdgeInsets.all(10),
              itemCount: responseData["hotels"].length,
              itemBuilder: (BuildContext context, int index) {
                return Card(
                  child: ListTile(
                    title: Text(responseData["hotels"][index]["name"]),
                    subtitle: Text(responseData["hotels"][index]["location"]),
                  ),
                );
              },
            ),
          );
  }
}