【问题标题】:Flutter API Resulting In NullFlutter API 导致 Null
【发布时间】:2020-07-07 11:35:26
【问题描述】:

目前正在使用 API 开发一个颤振项目。我对颤振很陌生,

我的代码: 结果为空。 研究了很长时间,但找不到解决方案。首先,尝试一个颤振应用程序,因此我对此很陌生,将不胜感激任何解决方案或提示/资源。 如您所见,所有变量都导致 null,我尝试打印它们无法弄清楚原因。

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

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

Future<Data> getData() async {
    final response = await get("https://covid-api.com/api/reports?date=2020-03-25&iso=TUR&region_name=Turkey");

    if(response.statusCode == 200) {
      return Data.fromJson(jsonDecode(response.body));
    } else {
      throw Exception('Not Working');
    }
  }


class Data {
  String date;
  int confirmed;
  int deaths;
  int recovered;
  int confirmedDiff;
  int deathsDiff;
  int recoveredDiff;
  int active;
  int activeDiff;
  double fatalityRate;

  Data({
    this.date,
    this.confirmed,
    this.deaths,
    this.recovered,
    this.confirmedDiff,
    this.deathsDiff,
    this.recoveredDiff,
    this.active,
    this.activeDiff,
    this.fatalityRate,
  });

  factory Data.fromJson(Map<String, dynamic> json) {
    return Data(
    confirmed: json['confirmed'],
    deaths: json['deaths'],
    recovered: json['recovered'],
    confirmedDiff: json['confirmed_diff'],
    deathsDiff: json['deaths_diff'],
    recoveredDiff: json['recovered_diff'],
    active: json['active'],
    activeDiff: json['active_diff'],
    fatalityRate: json['fatality_rate'],
    );
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['date'] = this.date;
    data['confirmed'] = this.confirmed;
    data['deaths'] = this.deaths;
    data['recovered'] = this.recovered;
    data['confirmed_diff'] = this.confirmedDiff;
    data['deaths_diff'] = this.deathsDiff;
    data['recovered_diff'] = this.recoveredDiff;
    data['active'] = this.active;
    data['active_diff'] = this.activeDiff;
    data['fatality_rate'] = this.fatalityRate;
    return data;
  }
}

class MyApp extends StatelessWidget {
  final Future<Data> data = getData();
  @override
  Widget build(BuildContext context) {
    return MaterialApp(

        theme: ThemeData(primaryColor: Colors.red),
        home: Scaffold(
            appBar: AppBar(title: Text('COVID-19 Turkey')),
            body: Center(
              child: FutureBuilder<Data>(
                future: data,
                builder: (context, snapshot) {
                  print(snapshot.data.deaths);
                  print('wtf');
                  print(snapshot.data.deathsDiff);
                  print(snapshot.data.recovered);
                  if(snapshot.hasData){
                    return Text(snapshot.data.confirmed.toString());

                  } else if (snapshot.hasError) {
                    return Text('Error');
                  }

                  return Center(child: CircularProgressIndicator(),);
                },
            ),)

        )
      );
  }
}

【问题讨论】:

  • 首先,future 参数不正确,因为它应该是“getData()”而不是数据。然后您需要将 getData() 更改为 Future.
  • 嗨,我不明白你指的是哪个 Future,对不起,我是 Flutter 和 dart 的新手。
  • 我指的是 FutureBuilder() 小部件中的 @required 未来参数。你让它工作了吗?

标签: api flutter


【解决方案1】:

我认为以下是使用 FutureBuilder 的正确方法:

FutureBuilder(
  future: getData(),
  builder: (context, snapshot) {
    if (!snapshot.hasData
        && snapshot.connectionState != ConnectionState.done) {
      return Center(child: CircularProgressIndicator());
    }
    if(snapshot.hasData) {
       return Text(snapshot.data.confirmed.toString());
    } else if (snapshot.hasError) {
       return Text('Error');
    } 
});

希望对你有帮助!

【讨论】:

  • 感谢您的回复,但结果仍然为 null
【解决方案2】:

问题在于您的 JSON 解析。在这条线上,

return Data.fromJson(jsonDecode(response.body));

我调用了你的 API,它给出了一个 Map,其中有一个 data 字段,然后是一个对象列表。

你的getData函数需要是这样的,

Future<Data> getData() async {
final response = await get("https://covid-api.com/api/reports?date=2020-03-25&iso=TUR&region_name=Turkey");

if(response.statusCode == 200) {

  var data = jsonDecode(response.body);

  var firstObj = (data['data'] as List<dynamic>).first;

  return Data.fromJson(firstObj);
} else {
  throw Exception('Not Working');
}
}

希望这可以为您解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 2020-05-17
    • 2023-01-07
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多