我试图从Firebase真实的数据库中读取数据,并在条形图中使用它。
我的代码首先从DB中阅读数据(特别是项目名称),然后将它们存储在一个列表(itemNames)中,所有这些都在activateListeners()方法中完成。
从这一点开始,我调用generateData()方法中的activateListners()方法,以便开始使用itemNames列表中的数据来创建条形图。由于activateListeners()方法是异步的,因此我使用“await”关键字来确保在继续之前将项目名称存储在列表中。
在这之后,我计划使用数据库中每个项目的名称以及数量创建ProductSales对象。这将通过从itemNames列表中获取项目名称来完成。
但是,在我这样做之前,我正在测试条形图是否可以正常使用测试数据。
问题是,当我运行代码时,条形图没有显示,因为它似乎没有阅读数据。但是,如果我从generateData()方法中删除“await activateListners()”,条形图将完美地显示测试数据。
为什么在等待activateListeners()方法首先执行时,BER图表没有显示数据?
任何帮助都将不胜感激!
class _ProductBarChartState extends State<ProductBarChart> {
//Ref to DB
final DatabaseReference _dbRef = FirebaseDatabase.instance.ref();
late DataSnapshot _itemStream;
//Stores the description of each menu item in the DB
String itemName = "";
String itemID = "";
List<String> itemNames = [];
List<String> itemIDs = [];
//Reads the item names from the DB and adds them to a list
Future _activateListeners() async {
for (int i = 1; i <= 10; i++) {
itemID = "J$i";
_itemStream = await _dbRef.child("menuItem/$itemID/itemName").get();
itemName = _itemStream.value.toString();
itemNames.addAll([itemName]);
}
}
List<charts.Series<ProductSales, String>> _seriesBarData =
[]; //A list that will store all the sales data for the bar chart report
_generateData() async {
await _activateListeners();
var BarChartData = [
//Stores all ProductSales objects for the product report
ProductSales("Hake", 8),
ProductSales("Toasted", 15),
ProductSales("Chick strips", 28),
ProductSales("Kota", 40),
];
//Adding the BarChartData (seen above) to the list
_seriesBarData.add(charts.Series(
id: 'SalesPerProduct',
colorFn: (_, __) =>
charts.ColorUtil.fromDartColor(Color.fromARGB(255, 255, 157, 38)),
domainFn: (ProductSales productSales, _) => productSales.productName,
measureFn: (ProductSales productSales, _) => productSales.noOfProductSold,
data: BarChartData,
));
}
@override
void initState() {
// TODO: implement initState
super
.initState(); //This runs the original initState function that we inherited from the material app class (even though we override i)
_seriesBarData = <charts.Series<ProductSales, String>>[];
_generateData(); //Generates all the data for the chart (method specified above)
}
1条答案
按热度按时间bn31dyow1#
调用setState以更新
_generateData
的UI结尾