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()
,它仍然会显示完整的数据。

变量
数据
为空。变量
数据
为空。