无法从URL解析JSON数据,并出现错误“ _TypeError(类型'_InternalLinkedHashMap'不是类型'FutureOr>'的子类型)”。 因此,您可以从链接中检查数据。并让我知道我在做什么错,谢谢。
我尝试使用地图,但无效。
<table appRow *ngFor="let item of items" [itemInput]="item">
</table>
我想从该URL获取数据并显示在我的列表视图中。我需要添加的内容,请提出建议,谢谢。
答案 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"]),
),
完整代码
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"]),
),
);
},
),
);
}
}