如何把这个功能变成未来?

How to turn this function into a future?

我想我会因为问这个问题而被责备,但我已经搜索了一段时间,希望得到一点帮助!

我有这段代码。我将如何放弃必须使用回调而只是 return 一个未来。


void getProducts({required Function() callback}) {
    List<Product> results = [];
    _firestore
        .collection('available_products')
        .get()
        .then((QuerySnapshot querySnapshot) {
      for (var doc in querySnapshot.docs) {
        print(doc);
        results.add(Product(
            name: doc['name'],
            category: doc['category'],
            description: doc['description'],
            price: doc['price']));
      }
      allProducts = results; 
      callback();
    }).onError((error, stackTrace) {
      print(error);
    });
  }

试试这个

Future<void> getProducts({required Function() callback}) async{
    List<Product> results = [];
    await _firestore
        .collection('available_products')
        .get()
        .then((QuerySnapshot querySnapshot) {
      for (var doc in querySnapshot.docs) {
        print(doc);
        results.add(Product(
            name: doc['name'],
            category: doc['category'],
            description: doc['description'],
            price: doc['price']));
      }
      allProducts = results; 
      callback();
    }).onError((error, stackTrace) {
      print(error);
    });
  }

而不是 void 使用您想要的数据类型 return, List<Product>.
其余代码只是将 .then 语法转换为 async await 语法。不过,您仍然可以使用 .then 语法。这只是更容易理解 IMO。

这是代码片段。

Future<List<Product>> getProducts() async {
  List<Product> results = [];

  try {
    final querySnapshot =
        await _firestore.collection('available_products').get();

    for (var doc in querySnapshot.docs) {
      print(doc);
      results.add(Product(
            name: doc['name'],
            category: doc['category'],
            description: doc['description'],
            price: doc['price']
          ));
    }

      allProducts = results;
  } catch (error) {
    print(error);
  }

  return results;
}

此外,您可以 return 任何其他数据类型来代替 List<Product>