当前位置: 首页 > 知识库问答 >
问题:

无法从api获取数据,Future始终返回null-flutter

颛孙嘉石
2023-03-14

我正在尝试从一个API中获取数据。为了测试,我使用了API URL:https://jsonplaceholder.typicode.com/todos/1其中包含以下JSON对象

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

我在网上遵循了一个例子,几乎只是调整以匹配我想要的工作流,但是下面的snapshot.hasData返回false。

class Home extends StatelessWidget {
  final String accountNum;
  Home(this.accountNum);
  final String apiUrl = "https://jsonplaceholder.typicode.com/todos/";

  Future<Map<String, dynamic>> fetchData() async {
    //accountNum below is passed from a previous screen, in this case I pass '1'
    //I printed it to make sure that '1' is passed and it is correct
    var result = await http.get(apiUrl+accountNum);
    //I printed the below and it also gave me the json from the api
    //print(json.decode(result.body));
    return json.decode(result.body);
  }

  String _MeterNum(dynamic account){
    return account['title'];
  }

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Account Data'),
      ),
      body: Container(
        child: FutureBuilder<Map<String, dynamic>>(
          future: fetchData(),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            if(snapshot.hasData){
              print(_MeterNum(snapshot.data[0]));
              return ListView.builder(
                  padding: EdgeInsets.all(8),
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext context, int index){
                    return
                      Card(
                        child: Column(
                          children: <Widget>[
                            ListTile(
                              leading: CircleAvatar(
                                  radius: 30,
                                  backgroundImage: NetworkImage(snapshot.data[index]['picture']['large'])),
                              //I realize this will just show the same thing 
                              //but I was just keeping the format of the example I was following
                              title: Text(_MeterNum(snapshot.data[index])),
                              subtitle: Text(_MeterNum(snapshot.data[index])),
                              trailing: Text(_MeterNum(snapshot.data[index])),
                            )
                          ],
                        ),
                      );
                  });
            }else {
              return Center(child: CircularProgressIndicator());
            }
          },


        ),
      ),
    );
  }
}

返回的是模拟器屏幕上的CircularProgressIndex ator(),指示snapshot.hasData为false。我在控制台上没有任何错误,所以我不知道如何继续。

---编辑---使用评论员的建议对上述代码进行了更改:

从未来更改了返回类型

现在我得到了以下错误:

在构建FutureBuilder时抛出以下NoSuchmethod odError

对null调用了方法“[]”。收件人:空

尝试呼叫:[](“标题”)

共有3个答案

梁昊天
2023-03-14

改变

title: Text(_MeterNum(snapshot.data[index])),
subtitle: Text(_MeterNum(snapshot.data[index])),
trailing: Text(_MeterNum(snapshot.data[index])),

title: Text(_MeterNum(snapshot.data)),
subtitle: Text(_MeterNum(snapshot.data)),
trailing: Text(_MeterNum(snapshot.data)),

没有键为['picture']['large'],因此请在ListTile中注释掉该键

禹昊穹
2023-03-14

在检查hasData之前,请执行以下操作:

if (snapshot.connectionState == ConnectionState.done) {
              // your code
}

编辑

你的要求

var result = await http.get(apiUrl+accountNum);

返回JSON对象而不是JSON列表。但在将fetchData方法更新到将来之前,它的返回类型是List

Future<Map<String, dynamic>> fetchData() async {
    var result = await http.get(apiUrl+accountNum);
    return json.decode(result.body);
}

不需要json。解码(result.body)['results'],因为您只获取对象,而不是列表。

方夜洛
2023-03-14

API响应是一个JSON对象

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

并且只包含userIdidtitle完成的memebers

不要引用索引,请考虑从对象中获取。

代替

snapshot.data[index]

具有

 snapshot.data

而且

snapshot.data['picture']['large']

JSON对象中没有picture数据,请尝试注释该代码或向其添加图片

 类似资料:
  • 问题内容: 我以前使用过媒体播放器,但从未遇到过此问题。每当我尝试使用MediaPlayer.create()时,该方法都会使我为null,并且无法播放声音。有什么我想念的吗? 我的sound.mp3在我的原始文件夹中,通过将声音拖到eclipse中的文件夹中,我将其放置在其中。请帮忙,因为我以前玩过声音,所以这真的困扰我:( 问题答案: 如果create() API由于某种原因失败,则返回nul

  • 问题内容: 我正在尝试读取HTTP请求的授权标头(因为我需要向其添加一些内容),但是标头值始终为null。其他标头工作正常。 难道我做错了什么?这是“安全”功能吗?有没有办法使它与URLConnection一起使用,还是需要使用另一个HTTP客户端库? 问题答案: 显然,这是安全的“功能”。URLConnection实际上是sun.net.www.protocol.http.HttpURLConn

  • 问题内容: 我在Java Web应用程序中具有以下结构: 在中WS.java,我在Web方法中使用以下代码: 但是它总是返回null。我需要读取该文件,并且我读到如果将文件放入其中,则可以使用进行访问,但是该方法始终返回null。 对我可能做错的任何想法? 它正在工作,但是当我Clean and Build在Project上执行了a之后,它突然停止工作了 问题答案: 据我所知,该文件必须正确地放置

  • Selenium<代码>列表 代码段: ====================================================================== 我使用,但它也不起作用

  • 这让我快疯了。我有一个简单的eclipse项目,其中有一个src文件夹和一个类。但我似乎无法让getResource找到它。我做错了什么? 如果我右键单击类名,路径是testsprroject/src/ContextTest。java,根据运行配置中的classpath选项卡,默认的类路径是TestProject。 它不适用于

  • 我一直在尝试使用nativescript创建一个android应用程序。我正在使用fetch模块从服务器获取响应。当我试图从httpbin获得响应时。org/get,没关系。但当我试图从本地服务器获取响应时,网络请求失败。错误 发送到httpbin。组织/获取- 发送到本地主机:8000/api- 当我尝试从纯节点中的localhost:8000/api获取响应时。js通过请求模块。它工作得很好。