在flutter中获取JSON数据返回NULL

Posted

技术标签:

【中文标题】在flutter中获取JSON数据返回NULL【英文标题】:Fetching JSON data in flutter returns NULL 【发布时间】:2020-07-18 19:26:51 【问题描述】:

我是 Flutter 的新手,并试图从托管的 php 文件中获取数据。无论我尝试什么,结果都会返回 NULL。我想输出 php 文件中的所有数据,而不仅仅是一行。在 PHP 上,我只会做一个 for 循环来获取所有 JSON 数据。我将如何在 Dart 中做到这一点?

我的 PHP 文件 -

$sql = "SELECT * FROM user_log";
$result = $conn->query($sql);
if ($result->num_rows > 0) 
    $rows = array();
        while($r = $result->fetch_assoc()) 
        $rows[] = $r;
        
        $newArray = array_values($rows);
    
$json_string = json_encode($newArray, true);

echo $json_string;

飞镖代码 -

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget 
   @override
  _MyAppState createState() => _MyAppState();


class _MyAppState extends State<MyApp> 
    String name, team;


FetchJSON() async 
    var url = 'https://vettx.app/api/get.php';
    http.Response response = await http.get(url);
    var data = jsonDecode(response.body);
    name = data['0']['user'];
    team = data['0']['team'];
    //print(data.toString());


void initState() 
    super.initState();
    FetchJSON();


Widget MyUI() 
  return new Container(
      child: new ListView(
        children: <Widget>[
        new Text(
           'Name : $name',
        ),
        new Text(
          'Team : $team',
        ),
      ],
    ),
  );



@override
Widget build(BuildContext context) 
  return new MaterialApp(
    home: new Scaffold(
      appBar: new AppBar(
        title: new Text('Get Data'),
      ),
      body: isData
          ? new Center(
        child: new CircularProgressIndicator(),
      )
          : MyUI(),
     ),
   );
  

JSON 数据 -


    "id": "4037",
    "user_id": "1",
    "user": "Ryan Dietz",
    "team": "Manager",
    "action": "email",
    "veh_id": "73366",
    "user_notes": "I am wondering if you have the VIN by chance?",
    "time_stamp": "2020-03-26 20:27:07"
,

链接到 JSON 示例 -

https://vettx.app/api/get.php

【问题讨论】:

您的 json 未返回列表,因此请尝试使用 data['user] 访问用户。 是的,不走运,如果您查看示例 php 链接,json 数据的父级别为 [0] http.get(url).then((response) var data = jsonDecode(response.body); name = data['0']['user']; team = data[' 0']['团队']; );试试这个 如果我 print(data.toString()); 仍然返回 NULL;它将所有数据输出到日志中,这真的让我感到困惑,为什么它将 NULL 返回到屏幕。 从零附近删除单引号 (')。数据[0]['用户'] 【参考方案1】:

您的服务器返回一个对象数组,因此您需要解析 json 并将其存储在一个数组中。此外,要获得第 0 个索引,您需要编写 array[0],而不是 array['0']

您必须从 fetchJSON 方法返回整个数组,而不是存储第一个对象属性:

Future<List> fetchJSON() async 
   var url = 'https://vettx.app/api/get.php';
   http.Response response = await http.get(url);
   var data = jsonDecode(response.body);
   return data;

使用FutureBuilder 小部件来处理数据的加载和显示,如下所示:

@override
Widget build(BuildContext context) 
  return new MaterialApp(
    home: new Scaffold(
      appBar: new AppBar(
        title: new Text('Get Data'),
      ),
      body: FutureBuilder<List>(
        future: fetchJSON(),
        builder: (context, snapshot) 
          if (snapshot.connectionState == ConnectionState.done) 
            if (snapshot.hasData) 
              // Success case
              return ListView.builder(
                itemBuilder: (context, index) 
                  return ListTile(
                    title: Text(snapshot.data[index]['user']),
                    subtitle: Text(snapshot.data[index]['team']),
                    trailing: Text(snapshot.data[index]['id']),
                  );
                ,
                itemCount: snapshot.data.length,
              );
            
            // Error case
            return Text('Something went wrong');
           else 
            // Loading data
            return Center(
              child: CircularProgressIndicator(),
            );
          
        ,
      ),
    ),
  );

在上面的代码中,snapshot.data 是一个对象列表,你可以使用 itemBuilder 的索引值来循环遍历它。

最终的输出会是这样的:

【讨论】:

以上是关于在flutter中获取JSON数据返回NULL的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 提取到 FutureBuilder 的 JSON 反序列化数据返回空值

Flutter - 无法将所有 json 数据从 api 响应保存到 Iterable List 编辑:(无法从可迭代列表中获取数据)

Flutter 在 json 数据中获取和循环

如何在flutter中本地获取json文件中的json数据

Flutter:从 json 列表中获取数据

我们如何在 Flutter 中从 JSON 对象中获取特定数据?