Flutter I/颤振(4037):方法';[]和#x27;被调用为空
我在尝试运行此代码时出错,方法“[]”为空。可能是列表视图吗?输出甚至不再显示在调试控制台中。对不起,我是新手 代码:Flutter I/颤振(4037):方法';[]和#x27;被调用为空,flutter,Flutter,我在尝试运行此代码时出错,方法“[]”为空。可能是列表视图吗?输出甚至不再显示在调试控制台中。对不起,我是新手 代码: import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; class GetStats extends StatefulWidget { @override _GetStatsState createState() =&
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class GetStats extends StatefulWidget {
@override
_GetStatsState createState() => _GetStatsState();
}
class _GetStatsState extends State<GetStats> {
Map data;
Future<String> getData() async {
var response = await http.get(
Uri.encodeFull(
'http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/?appid=730&key=D5F4E0DED484F47380C2804A529BAEDC&steamid=76561198406742636'),
headers: {"Accept": "application/json"});
setState(() {
data = json.decode(response.body);
});
print(data["playerstats"]["stats"][0]["value"]);
}
@override
void initState() {
getData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('CSGO STATS'),
centerTitle: true,
),
body: ListView.builder(
itemCount: 20,
itemBuilder: (
BuildContext context,
int index,
) {
return Card(
child: Text(
data["playerstats"],
),
);
}),
);
}
}
我做错了什么?是否需要初始化某些内容?您正在发出正确的
http
请求并获取数据
然而问题在于你的小部件,我检查了API响应,它抛出的响应是Map
在显示数据时,您正在使用playerstats
键访问数据,该键反过来为您提供一个Map
,它不是Text
小部件所需的字符串
,以便显示数据
您可以通过使用如下方法将数据转换为字符串来显示数据
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('CSGO STATS'),
centerTitle: true,
),
body: ListView.builder(
itemCount: 20,
itemBuilder: (
BuildContext context,
int index,
) {
return Card(
child: Text(
data["playerstats"].toString(),
),
);
}),
);
}
另外,我想建议您对代码进行一些改进
- 尽可能多地使用类型注释,它使您的代码更加安全和健壮,就像您将
数据
变量声明为映射数据一样
,您应该像地图数据一样声明它代码>
- 我认为您忘记了在
initState()
方法中调用super.initState()
,请确保在调用所有方法之前先调用它
- 方法
getData
不返回任何内容,因此将其设置为Future
而不是Future
既然你是StackOverflow的新贡献者,我欢迎你!
快乐飘飘 您正在发出正确的http
请求并获取数据
然而问题在于你的小部件,我检查了API响应,它抛出的响应是Map
在显示数据时,您正在使用playerstats
键访问数据,该键反过来为您提供一个Map
,它不是Text
小部件所需的字符串
,以便显示数据
您可以通过使用如下方法将数据转换为字符串来显示数据
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('CSGO STATS'),
centerTitle: true,
),
body: ListView.builder(
itemCount: 20,
itemBuilder: (
BuildContext context,
int index,
) {
return Card(
child: Text(
data["playerstats"].toString(),
),
);
}),
);
}
另外,我想建议您对代码进行一些改进
- 尽可能多地使用类型注释,它使您的代码更加安全和健壮,就像您将
数据
变量声明为映射数据一样
,您应该像地图数据一样声明它代码>
- 我认为您忘记了在
initState()
方法中调用super.initState()
,请确保在调用所有方法之前先调用它
- 方法
getData
不返回任何内容,因此将其设置为Future
而不是Future
既然你是StackOverflow的新贡献者,我欢迎你!
快乐飘飘 数据[“playerstats”]是一个映射,而文本小部件需要字符串。数据[“playerstats”]是一个映射,而文本小部件需要字符串。您的方法是正确的,但问题在于启动文本小部件
child: Text(
data["playerstats"],
),
['playerstats']
不是一个单独的文本,而是列表的映射。您需要指定要查看的确切文本字段名。如果添加带有字段名的.toString()
,它仍然会显示完整数据。您的方法还可以,但问题在于启动文本小部件
child: Text(
data["playerstats"],
),
['playerstats']
不是一个单独的文本,而是列表的映射。您需要指定要查看的确切文本字段名。如果添加带有字段名的.toString()
,它仍然会显示完整的数据。变量数据
为空。变量数据
为空。