firebase flutter中“await”之后的代码未正确执行

kq0g1dla  于 2022-11-17  发布在  Flutter
关注(0)|答案(1)|浏览(153)

我试图从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)
  }
bn31dyow

bn31dyow1#

调用setState以更新_generateData的UI结尾

_generateData() async {
 //...
setState((){}) ;
}

相关问题