'for' 循环中使用的类型 'Future<Map<String, dynamic>> Function()' 必须实现 Iterable - Flutter

Fai*_*mal 5 future async-await flutter

我试图从数据库中获取值后返回MapFuture但我无法打印这些值。访问值时出现以下错误

The type 'Future<Map<String, dynamic>> Function()' used in the 'for' loop must implement Iterable.
Run Code Online (Sandbox Code Playgroud)

下面是简单的代码。

class ChefDishes extends StatefulWidget {
  @override
  _ChefDishesState createState() => _ChefDishesState();
}

class _ChefDishesState extends State<ChefDishes> {
 @override
  Widget build(BuildContext context) {
    
     var _chefDishes = DatabaseService().getChefDishList;
    
     return Scaffold(
    .....
          Column(
            children: [
              for (var item in _chefDishes)   // <---- E R R O R   I S   H E R E  
                ListView(children: [
                  Text(item['dishname']),
                  Text(item['dishPrice']),
                ]),
            ],
          )
}
Run Code Online (Sandbox Code Playgroud)

DatabaseService 班级

class DatabaseService {

  Future<Map<String, dynamic>> getChefDishList() async {
    Map<String, dynamic> chefDishes;
    var result =
        await Firestore.instance.collection('dish').("chefID", isEqualTo: uid).getDocuments();

    result.documents.forEach((eachResult) {
          chefDishes = eachResult.data;
    });

    return chefDishes;
  }
}
Run Code Online (Sandbox Code Playgroud)

Gaz*_*kus 5

你没有得到来自未来的结果。你正在尝试使用未来而不是其中的地图。

另外,您要在构建函数中启动此 getChefDishList,这是一个很大的禁忌。

这是解决此问题的一种方法:

class _ChefDishesState extends State<ChefDishes> {
  Map<String, dynamic> _chefDishes;
  @override
  initState() {
    startAsyncInit();
  }
  Future startAsyncInit() async {
    setState(() {
      _chefDishes = await DatabaseService().getChefDishList;
    });
  }
  @override
  Widget build(BuildContext context) {
    
     return Scaffold(
    .....
          Column(
            children: [
              for (var item in _chefDishes)   // <---- E R R O R   I S   H E R E  
                ListView(children: [
                  Text(item['dishname']),
                  Text(item['dishPrice']),
                ]),
            ],
          )
}

Run Code Online (Sandbox Code Playgroud)

或者您可以使用FutureBuilder.