flutter - TypeError(类型'String'不是'index'类型'int'的子类型)
问题描述
这是我的代码。当我运行代码时,我收到类似
“TypeError(类型'String'不是'index'类型'int'的子类型)”的错误。是与 Json 数据有关还是我使用了错误的数据类型。是否Future<List<Arrivals>>
写对了?
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
List<Arrivals> details = [];
Future<List<Arrivals>> _getDetails() async {
var data =
await http.get("https://flight-api-maldives.herokuapp.com/arrivals");
var jsonData = jsonDecode(data.body);
for (var val in jsonData) {
Arrivals arrivals = Arrivals(
val['Scheduled'],
val['Revised'],
val['From'],
val['Flight'],
val['Status'],
);
details.add(arrivals);
print(details.length);
}
return details;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: <Widget>[
FutureBuilder(
future: _getDetails(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.data != null) {
return Container(
child: ListView.builder(
itemBuilder: (BuildContext context, int index) {
return Center(child: Text('snapshot.data[index].Scheduled'),);
}
),
);
}else{
return Center(
child: Text('NO'),
);
}
},
)
],
),
),
);
}
}
class Arrivals {
final String Scheduled;
final String Revised;
final String From;
final String Flight;
final String Status;
Arrivals(this.Scheduled, this.Revised, this.From, this.Flight, this.Status);
}
这是我使用的 json 数据:
[
[
{
"Scheduled": "06:35",
"Revised": "06:35",
"From": "Kaadedhdhoo (KDM)",
"Flight": "Maldivian Q2 149",
"Status": "On-Time"
},
{
"Scheduled": "06:40",
"Revised": "06:40",
"From": "Dharavandhoo Island (DRV)",
"Flight": "Maldivian Q2 289",
"Status": "On-Time"
},
]
]
我的错误图片在哪里 https://i.stack.imgur.com/qVWLc.png
解决方案
主要问题在json中。它是列表列表。
var jsonData = jsonDecode(data.body);
jsonData = jsonData[0]; // added line
for (var val in jsonData) {
此外,它们不需要太多额外的代码来显示列表视图,您可以使用以下简单代码来显示列表视图。除了那个 Listview.builder 需要项目计数属性来指定项目的总数。
用您的意愿替换以下构建方法。
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: _getDetails(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
print(snapshot);
if (snapshot.data != null) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
return Center(
child: Text(snapshot.data[index].Scheduled.toString()),
);
});
} else {
return Center(
child: Text('NO'),
);
}
},
),
);
}
推荐阅读
- javascript - 无法在 componentDidMount React Native 中发送请求
- scala - Spark 和 Kafka 集成 - 无法实例化 KafkaSourceProvider
- java - 如何在 MongoDB 中只返回 1 个字段?
- c++ - CPP auto on tuple 错误:不能被引用——它是一个被删除的函数
- azure-ad-b2c - 对 ADB2C 中 CustomPage 中的 CustomPolicy 中的特定问题作出反应
- android - 由于我的应用程序检测到屏幕覆盖问题
- c# - C#如何打印加到给定数字的组合?
- javascript - 如何使用 office.js API 在 Outlook 邮件中选择文本
- javascript - React Native 自定义跨平台下拉选择元素
- reactjs - 缓存 React/Meteor 网页