StockModel.fromYahooJson constructor
StockModel.fromYahooJson(
- Map<String, dynamic> json
)
Implementation
factory StockModel.fromYahooJson(Map<String, dynamic> json) {
if (json['chart'] == null ||
json['chart']['result'] == null ||
json['chart']['result'].isEmpty) {
throw Exception('Invalid data format from Yahoo Finance API');
}
final result = json['chart']['result'][0];
final meta = result['meta'];
final quote = result['indicators']['quote'][0];
final regularMarketPrice = (meta['regularMarketPrice'] as num?)?.toDouble();
final previousClose = (meta['chartPreviousClose'] as num?)?.toDouble() ??
(meta['previousClose'] as num?)?.toDouble();
// API에서 직접 제공하는 등락 정보를 우선 사용
double? change = (meta['change'] as num?)?.toDouble();
double? changeInPercent = (meta['changePercent'] as num?)?.toDouble();
// 만약 API에서 등락 정보를 제공하지 않으면 직접 계산
if (change == null || changeInPercent == null) {
if (regularMarketPrice != null && previousClose != null && previousClose != 0) {
change = regularMarketPrice - previousClose;
changeInPercent = (change / previousClose) * 100;
}
}
return StockModel(
ticker: meta['symbol'],
name: meta['shortName'] ?? meta['symbol'],
currentPrice: regularMarketPrice ?? (quote['close']?.last as num?)?.toDouble() ?? 0.0,
previousClose: previousClose,
change: change,
changeInPercent: changeInPercent,
lastUpdated: DateTime.fromMillisecondsSinceEpoch((meta['regularMarketTime'] as int) * 1000),
);
}