【问题标题】:The type 'Future<Map<String, dynamic>> Function()' used in the 'for' loop must implement Iterable - Flutter'for' 循环中使用的类型 'Future<Map<String, dynamic>> Function()' 必须实现 Iterable - Flutter
【发布时间】:2020-12-14 23:51:16
【问题描述】:

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

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

下面是简单的代码。

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']),
                ]),
            ],
          )
}

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;
  }
}

【问题讨论】:

  • 您是否尝试过先初始化地图?像这样: Map chefDishes = new Map();
  • 你真的想覆盖你的 forEach 中的整个 Map 吗?您不想添加所有结果吗?

标签: flutter async-await future


【解决方案1】:

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

另外,您要在构建函数中启动这个 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']),
                ]),
            ],
          )
}

或者您可以使用FutureBuilder

【讨论】:

    【解决方案2】:

    使用这种方式使用forEach

      var usrMap = {"name": "Mr MKM", 'Email': 'moumit.mondal@gmail.com'}; 
      usrMap.forEach((k,v) => print('${k}: ${v}')); 
    

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 1970-01-01
      • 2021-03-23
      • 2020-12-27
      • 2018-09-28
      • 2020-11-25
      • 2020-12-09
      • 2020-12-15
      相关资源
      最近更新 更多