无法在颤动中将json转换为listview

Posted

技术标签:

【中文标题】无法在颤动中将json转换为listview【英文标题】:Cant transform json to listview in flutter 【发布时间】:2021-03-07 14:15:05 【问题描述】:
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';

class HomePage extends StatefulWidget 
  @override
  HomePageState createState() => HomePageState();


class HomePageState extends State<HomePage> 
  List items;

  Future<String> getData() async 
    var response = await http.get(
        'https://api.torn.com/torn/?selections=items&key=7PnSA9HkVB5B6eAK');

    this.setState(() 
      Map items = json.decode(response.body);
      print(items);
    );
  

  @override
  void initState() 
    this.getData();
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: ListView.builder(
        itemCount: items == null ? 0 : items.length,
        itemBuilder: (BuildContext context, int index) 
          return Card(
            child: Text(items[index]['name']),
          );
        ,
      ),
    );
  


据我所知,我们可以通过两种形式获取 Json,第一种是 List,第二种是 Map。 就我而言,我收到了一张包含我需要的所有数据的地图,但不幸的是我不知道如何正确显示它。 从打印中我收到了数据,但屏幕上没有任何反应。

【问题讨论】:

【参考方案1】:

检查 getData 方法中的 setState,您正在创建一个新的 items 变量,而不是为其分配新值。试试这个。

import 'dart:convert';

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

class HomePage extends StatefulWidget 
  @override
  HomePageState createState() => HomePageState();


class HomePageState extends State<HomePage> 
  Map items = ;
  Future<void> getData() async 
    http.Response res = await http.get(
      "https://api.torn.com/torn/?selections=items&key=7PnSA9HkVB5B6eAK",
    );
    setState(() => items = jsonDecode(res.body)["items"]);
    print(items);
  

  @override
  void initState() 
    getData();
    super.initState();
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: ListView.builder(
        itemCount: items.length,
        itemBuilder: (context, index) 
          index++;
          return Card(
            child: Text(items[index.toString()]["name"] ?? "Empty"),
          );
        ,
      ),
    );
  

【讨论】:

【参考方案2】:

您不得重新定义项目。你需要设置它。它看起来像这样:

setState(() 
  items = jsonDecode(response.body);
  print(items);
);

【讨论】:

以上是关于无法在颤动中将json转换为listview的主要内容,如果未能解决你的问题,请参考以下文章

我想在颤动中将字符串转换为 Json 字符串?

如何在颤动中将 json 数据转换为 List<widgets>?

如何在颤动中将 List<String> 转换为 String [重复]

如何在颤动中将对象编码为 Json

在颤动中将地图列表转换为步进器?

在颤动中将字符串转换为日期时间