【问题标题】:snapshot.data is null in flutter快照中的数据为空
【发布时间】:2019-11-27 15:09:02
【问题描述】:

我的 snapshot.data 为空。当我打印响应时,它显示检索到的数据。但仍然 snapshot.data 为空。请帮忙。

    Future _getUsers() async {

        var data = await http.post("http://10.0.2.2/Flutter/abreport.php", body: {
        {
          "date": mydt,
         });
         var jsonData = json.decode(data.body); //edited
         print(jsonData); // the data is printing here

         return jsonData;
       }  

       }  

    FutureBuilder(
            future: _getUsers(),
            builder: (BuildContext context, AsyncSnapshot snapshot) {
                  debugPrint(snapshot.data);
              if (snapshot.data == null) {
                return Container(
                  child: Center(

                    child:Text("no data"),
                    )
                    );
              } else {
                 //some code
             }

              ) 

【问题讨论】:

  • 你试过snapshot.hasData吗?

标签: flutter


【解决方案1】:

对于FutureBuilder,您应该使用documentation 中给出的格式。您不是在检查未来的状态,所以当FutureBuilder 首次构建时,它将显示"no data"。你还没有实现你的else 分支,所以当你有数据时,你的构建可能无论如何都不会刷新。试试这个代码:

FutureBuilder(
  future: _getUsers(),
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    if (snapshot.connectionState == ConnectionState.done) {
      if (snapshot.data == null) {
        return Text('no data');
      } else {
        return Text('data present');
      }
    } else if (snapshot.connectionState == ConnectionState.error) {
      return Text('Error'); // error
    } else {
      return CircularProgressIndicator(); // loading
    }
  }
)

【讨论】:

【解决方案2】:

在 Flutter 2.2 中,这个返回错误

builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
  if (snapshot.hasData) {
    return Text(snapshot.data,);

Error: The argument type 'String?' can't be assigned to the parameter type 'String' because 'String?' is nullable and 'String' isn't.
return Text(snapshot.data,);

但是这个没有

builder: (BuildContext context, AsyncSnapshot snapshot) {

当类似的事情发生时,使用类型“var”而不是“String”或其他不可为空的类型。 (如果不是 Flutter,编译器会怎么做?)

【讨论】:

    【解决方案3】:

    由于我看不到您的完整代码,我假设您在 FutureBuilder 中接收到 json 数据后解析错误。下面是一个与您正在做的类似的示例。本示例使用 FutureBuilder 检索 Date json 数据并显示,

    import 'dart:convert';
    
    import 'package:flutter/material.dart';
    import 'package:http/http.dart' as http;
    
    void main() {
      runApp(new MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      MyAppState createState() => MyAppState();
    }
    
    class MyAppState extends State<MyApp> {
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            home: Scaffold(
                body: Center(
                    child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Padding(
                              padding: const EdgeInsets.only(left: 10.0, right: 10.0),
                              child: FutureBuilder(
                                future: _getDate(),
                                builder: (BuildContext context, AsyncSnapshot snapshot) {
                                  if (snapshot.hasData) {
                                    return Text('Date: ' + snapshot.data['date']
                                        + '\nMilliseconds Since Epoch: ' + snapshot.data['milliseconds_since_epoch'].toString()
                                    + '\nTime: ' + snapshot.data['time'],
                                    style: TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold, color: Colors.grey));
                                  } else {
                                    return Center(child: CircularProgressIndicator());
                                  }
                                },
                              ))
            ]))));
      }
    
      Future _getDate() async {
        var data = await http.post("http://date.jsontest.com/");
        var jsonData = json.decode(data.body);
        print(jsonData);
    
        return jsonData;
      }
    }
    
    

    测试截图:

    希望这会有所帮助。

    【讨论】:

    • 似乎部分代码由于某种原因被删掉了 - jsonData 不知从何而来
    • 我已经编辑了我的代码。我的 sn-p 中有这行代码。 var jsonData = json.decode(data.body);是返回类型 Future 是这里的问题吗?我不能在这里使用模型,因为我的响应是 MYSQL 的 group by 子句的结果
    • @raj,我根据您的编辑编辑了我的答案。看看吧。
    猜你喜欢
    • 2020-03-19
    • 2021-12-26
    • 1970-01-01
    • 2020-04-12
    • 2021-06-21
    • 2021-11-18
    • 2021-08-08
    • 2022-11-19
    • 1970-01-01
    相关资源
    最近更新 更多