api - 我如何返回未来在带有 Provider 的 ListView 中?
问题描述
我正在尝试使用 Provider 包将 Future 放入列表视图,但没有成功。谁能给我一些建议或链接来解释如何在返回双精度的 Future 上实现 notifylisteners() ?
这是 getPrice() 的未来:
import 'dart:collection';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
import 'package:stock_watchlist/stock_service.dart';
class StockData extends ChangeNotifier {
List<Stock> _stocks = [
Stock(symbol: 'AAPL'),
Stock(symbol: 'AMD'),
Stock(symbol: 'TSLA')
];
UnmodifiableListView<Stock> get stocks {
return UnmodifiableListView(_stocks);
}
int get stockCount {
return _stocks.length;
}
void addStock(String symbol, double price, double eps) {
final stock = Stock(symbol: symbol);
_stocks.add(stock);
notifyListeners();
}
void deleteStock(Stock stock) {
_stocks.remove(stock);
notifyListeners();
}
Future<double> getPrice(String symbol) async {
String url =
"https://sandbox.iexapis.com/stable/stock/$symbol/quote/latestPrice?token=Tsk_38ddda0b877a4510b42a37ae713cdc96";
http.Response response = await http.get(url);
double price = double.tryParse(response.body);
return price;
}
Future<double> getEps(String symbol) async {
String url =
"https://sandbox.iexapis.com/stable/stock/$symbol/stats/ttmEPS?token=Tsk_38ddda0b877a4510b42a37ae713cdc96";
http.Response response = await http.get(url);
double eps = double.tryParse(response.body);
return eps;
}
}
这是我试图将 getPrice() 的值输入到文本小部件的地方,但它给了我“'Future' 的实例而不是值。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:stock_watchlist/constants.dart';
import 'package:stock_watchlist/stock_model.dart';
class StockList extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<StockData>(
builder: (context, stockData, child) {
return ListView.builder(
itemCount: stockData.stockCount,
itemBuilder: (context, index) {
//
final stockIndex = stockData.stocks[index];
//
return ListTile(
title: Text(
stockIndex.symbol,
style: TextStyle(
color: kTextColor,
),
),
subtitle: Text(
stockIndex.price.toString(),
style: TextStyle(
color: kTextColor,
),
),
);
},
);
},
);
}
}
解决方案
谢谢,我想我用 FutureBuilder 想通了。这是我使用的代码。
class StockList extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<StockData>(
builder: (context, stockData, child) {
return ListView.builder(
itemCount: stockData.stockCount,
itemBuilder: (context, index) {
//
final stockIndex = stockData.stocks[index];
//
return ListTile(
title: Text(
stockIndex.symbol,
style: TextStyle(
color: kTextColor,
),
),
subtitle: FutureBuilder(
future: stockData.getPrice(stockIndex.symbol),
builder: (context, snapshot) => Text(
snapshot.data.toString(),
style: TextStyle(
color: kTextColor,
),
),
),
);
},
);
},
);
}
}
推荐阅读
- python - python selenium xpath find 获取第二个元素
- json - 将 WMS 源添加到 Mapbox style.json 时遇到问题
- sql - 跨日期范围的客户/订单摘要的 TSql 查询
- c# - FhirSerializer 到 Json 和 XML
- c# - Entity Framework Code-first 同一张表上的多对多关系
- spring-webflux - Webflux Kotlin Coroutines Flow 不返回任何结果
- symfony - 使用 webpack 和 encore 在 symfony 4.2.9 中使用 toastr
- java - 如何初始化一个二维数组?
- bash - 如何在linux中使用bash按出现次数对字符串进行排序?
- r - 使用“as_factor”转换“haven_labelled”后标签丢失