【问题标题】:Cant transform json to listview in flutter无法在颤动中将json转换为listview
【发布时间】: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。 就我而言,我收到了一张包含我需要的所有数据的地图,但不幸的是我不知道如何正确显示它。 从打印中我收到了数据,但屏幕上没有任何反应。

【问题讨论】:

    标签: json flutter listview


    【解决方案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);
      });
      

      【讨论】:

        猜你喜欢
        • 2019-07-30
        • 2020-08-11
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        • 2020-11-25
        • 2020-04-28
        • 2021-04-28
        • 2020-12-10
        相关资源
        最近更新 更多