тип 'Future <GlobalQuote>' не является подтипом типа 'Future <Stock>' of 'function result' - PullRequest
0 голосов
/ 08 марта 2020

У меня есть API, который возвращает объект json.

json объект:

{
    "Global Quote": {
        "01. symbol": "NSE:STRTECH",
        "02. open": "88.5000",
        "03. high": "91.5500",
        "04. low": "85.7000",
        "05. price": "90.0500",
        "06. volume": "1240424",
        "07. latest trading day": "2020-03-06",
        "08. previous close": "93.1000",
        "09. change": "-3.0500",
        "10. change percent": "-3.2760%"
    }
}

Класс, который я сделал:

class Stock {
  GlobalQuote globalQuote;

  Stock({this.globalQuote});

  factory Stock.fromJson(Map<String, dynamic> parsedJson) {
    return Stock(globalQuote: GlobalQuote.fromJson(parsedJson['globalQuote']));
  }
}

class GlobalQuote {
  String symbol;
  double openPrice;
  double high;
  double low;
  int volume;
  String change;
  String changePercent;
  String latestTradingDay;

  GlobalQuote(
      {this.symbol,
      this.openPrice,
      this.high,
      this.low,
      this.volume,
      this.change,
      this.changePercent,
      this.latestTradingDay});

  factory GlobalQuote.fromJson(Map<String, dynamic> json) {
    return GlobalQuote(
        symbol: json['01. symbol'],
        openPrice: json['02. open'],
        high: json['03. high'],
        low: json['04. low'],
        volume: json['06. volume'],
        change: json['09. change'],
        changePercent: json['10. change percent'],
        latestTradingDay: json['07. latest trading day']);
  }
}

Это то, что я придумал после прочтения средней статьи: https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51

Я пытаюсь отобразить данные, полученные из вызова API, но я получаю следующую ошибку:

type 'Future<GlobalQuote>' is not a subtype of type 'Future<Stock>' of 'function result'

Код для отображения данных:

import 'package:flutter/material.dart';
import 'services.dart';
import 'Stock.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  Future<Stock> futureStock;

  @override
  void initState() {
    super.initState();
    futureStock = fetchData();
  }

Future<Stock> fetchData() async {
  final response = await http.get(
      "https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=NSE:STRTECH&apikey=$apiKey");
  if (response.statusCode == 200)
    {
      print("Response:${response.body}");
      print("Decoded:${json.decode(response.body)}");
      return Stock.fromJson(json.decode(response.body));
    }
  else
    throw Exception('Failed to get Stock');
}


  @override
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("SIFA"),
      ),
      body: Center(
        child: FutureBuilder<Stock>(
            future: futureStock,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                print("->->->->->${snapshot.data.globalQuote.symbol}");
                return Text(
                    "${snapshot.data.globalQuote.symbol}\nlow:${snapshot.data.globalQuote
                        .low}\nhigh:${snapshot.data.globalQuote.high}\nOpen Price:${snapshot
                        .data.globalQuote.openPrice}\nChange Percent:"
                        "${snapshot.data.globalQuote.changePercent}");
              }
              else if (snapshot.hasError) return Text("${snapshot.error}");
              return CircularProgressIndicator();
            }),
      ),
    );
  }
}

Какие изменения я делаю, чтобы данные отображались в приложении?

Редактировать: вышеуказанная ошибка была исправлена, и появилась новая. enter image description here

...