繁体   English   中英

在 Flutter 中从 Json 获取数据

[英]Getting data from Json in Flutter

我是 Flutter 开发的初学者,在下面的代码中,我尝试从这里获取数据并将其显示在ListView

  static final String URL = "https://corona.lmao.ninja/countries";

  Future<List<CoronaModel>> getData() async {
    var data = await http.get(URL);
    var jsonData = json.decode(data.body);
    print("the count is: " + jsonData.toString()); //Data successfully printed
    List<CoronaModel> listCoronaCountries = [];
    for (var item in jsonData) {
      CoronaModel mCorona = CoronaModel(
          item["country"],
          item["recovered"],
          item["cases"],
          item["critical"],
          item["deaths"],
          item["todayCases"],
          item["todayDeaths"]);
      listCoronaCountries.add(mCorona);
    }
    if (listCoronaCountries.length > 0) {
      print("the count is: " + listCoronaCountries.length.toString());
    } else {
      print("EMPTY");
    }
    return listCoronaCountries;
  }

运行时,第一次print成功,可以看到数据打印成功,但是没有显示IF语句

 if (listCoronaCountries.length > 0) {
          print("the count is: " + listCoronaCountries.length.toString());
        } else {
          print("EMPTY");
        }

模型 :

class CoronaModel {
  final String country;
  final String recovered;
  final String cases;
  final String critical;
  final String deaths;
  final String todayCases;
  final String todayDeaths;
  CoronaModel(this.country, this.recovered, this.cases, this.critical,
      this.deaths, this.todayCases, this.todayDeaths);
}

您可以在下面复制粘贴运行完整代码
您可以使用coronaModelFromJson进行解析并使用FutureBuilder显示

代码片段

List<CoronaModel> coronaModelFromJson(String str) => List<CoronaModel>.from(
json.decode(str).map((x) => CoronaModel.fromJson(x)));

Future<List<CoronaModel>> getData() async {
    var data = await http.get(URL);
    List<CoronaModel> listCoronaCountries = coronaModelFromJson(data.body);
    return listCoronaCountries;
  }

工作演示

在此处输入图片说明

完整代码

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

// To parse this JSON data, do
//
//     final coronaModel = coronaModelFromJson(jsonString);

import 'dart:convert';

List<CoronaModel> coronaModelFromJson(String str) => List<CoronaModel>.from(
    json.decode(str).map((x) => CoronaModel.fromJson(x)));

String coronaModelToJson(List<CoronaModel> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class CoronaModel {
  String country;
  int cases;
  int todayCases;
  int deaths;
  int todayDeaths;
  int recovered;
  int active;
  int critical;
  int casesPerOneMillion;

  CoronaModel({
    this.country,
    this.cases,
    this.todayCases,
    this.deaths,
    this.todayDeaths,
    this.recovered,
    this.active,
    this.critical,
    this.casesPerOneMillion,
  });

  factory CoronaModel.fromJson(Map<String, dynamic> json) => CoronaModel(
        country: json["country"],
        cases: json["cases"],
        todayCases: json["todayCases"],
        deaths: json["deaths"],
        todayDeaths: json["todayDeaths"],
        recovered: json["recovered"],
        active: json["active"],
        critical: json["critical"],
        casesPerOneMillion: json["casesPerOneMillion"],
      );

  Map<String, dynamic> toJson() => {
        "country": country,
        "cases": cases,
        "todayCases": todayCases,
        "deaths": deaths,
        "todayDeaths": todayDeaths,
        "recovered": recovered,
        "active": active,
        "critical": critical,
        "casesPerOneMillion": casesPerOneMillion,
      };
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static final String URL = "https://corona.lmao.ninja/countries";
  Future _future;

  Future<List<CoronaModel>> getData() async {
    var data = await http.get(URL);
    List<CoronaModel> listCoronaCountries = coronaModelFromJson(data.body);
    return listCoronaCountries;
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _future = getData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: FutureBuilder<List<CoronaModel>>(
            future: _future,
            builder: (BuildContext context,
                AsyncSnapshot<List<CoronaModel>> snapshot) {
              switch (snapshot.connectionState) {
                case ConnectionState.none:
                  return Text('Input a URL to start');
                case ConnectionState.waiting:
                  return Center(child: CircularProgressIndicator());
                case ConnectionState.active:
                  return Text('');
                case ConnectionState.done:
                  if (snapshot.hasError) {
                    return Text(
                      '${snapshot.error}',
                      style: TextStyle(color: Colors.red),
                    );
                  } else {
                    return ListView.builder(
                        itemCount: snapshot.data.length,
                        itemBuilder: (context, index) {
                          return ListTile(
                            title: Text(
                                ' ${snapshot.data[index].country} , ${snapshot.data[index].cases}'),
                          );
                        });
                  }
              }
            }));
  }
}

而不是手动编码“.fromJson/.toJson”方法。 你可以依赖这个库https://github.com/k-paxian/dart-json-mapper

它不仅对这种情况有帮助,而且对所有 Dart Object => JSON => Dart Object 情况都有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM