У меня есть 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();
}),
),
);
}
}
Какие изменения я делаю, чтобы данные отображались в приложении?
Редактировать: вышеуказанная ошибка была исправлена, и появилась новая.