繁体   English   中英

无法将 JSON 数据解析到 listview(_TypeError (type '_InternalLinkedHashMap<string, dynamic> ' 不是类型 'FutureOr 的子类型<list<dynamic> &gt;') </list<dynamic></string,>

[英]Can't parse JSON data to listview(_TypeError (type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'FutureOr<List<dynamic>>')

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

我试过用 map,没用。

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',
        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> {
  List hotels;
  Future<List> _getHotels() async {
    String serviceURL="**************************************************************************************";
    var response = await http.get(serviceURL);


    return json.decode(response.body.toString());
  }
  printv() async {
    hotels= await _getHotels();
    for(var i=0;i<hotels.length;i++) {
      print(hotels[i]["hotels"]["name"]);
    }

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

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

我想从 URL 中获取数据并显示在我的列表视图中。 我需要补充什么,请建议我,谢谢。

您需要像这样的动态和访问权限
您可以在下面粘贴并运行完整代码

代码片段

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"]),
                  ),    

在此处输入图像描述

完整代码

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://baseURL/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"]),
                  ),
                );
              },
            ),
          );
  }
}

在我看来,问题来自_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() function 不应该返回Future<List> ,它应该返回Future<Map<String, dynamic>>

然后,您可以对从 function 返回的Map<String, dynamic>做任何您想做的事情,并将其转换为List ,如果这是您需要的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM