【问题标题】:The argument type 'Iterable<Text>' can't be assigned to the parameter type 'Widget' in Flutter参数类型“Iterable<Text>”不能分配给 Flutter 中的参数类型“Widget”
【发布时间】:2021-05-25 19:31:27
【问题描述】:

我的这行代码有一个错误,没有找到任何解决方案。

child: snapshot.data.docs.map((DocumentSnapshot document) {

参数类型'Iterable'不能分配给参数类型'Widget'.dartargument_type_not_assignable

这是我的代码:

      Widget buildCategtoryFirestore() => StreamBuilder(
        stream: FirebaseFirestore.instance.collection('').snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if(!snapshot.hasData) {
            return null;
          } else {
            List<DropdownMenuItem> categoryItems= [];
            
            for(int i=0;i<snapshot.data.docs.length;i++) {
              //DocumentSnapshot snap=snapshot.data.docs[i];
              categoryItems.add(
                DropdownMenuItem(
                  child: snapshot.data.docs.map((DocumentSnapshot document) {
                    return Text(document['title']);
                  }), 
                  value: "$document['title']",
                ),
              );
              return DropdownButtonFormField(
                items: categoryItems,
              );
            }
          }
        },
      );

谁能帮我解决这个错误的原因以及如何解决它?

【问题讨论】:

  • 据我了解,您没有传递小部件,因此请务必更改它..

标签: firebase flutter google-cloud-firestore


【解决方案1】:

我在另一个社区找到了解决方案。我使用此代码:

Widget buildCategtoryFirestore() => StreamBuilder(
    stream: FirebaseFirestore.instance.collection('petertesthausen@gmail.com_categories').snapshots(),
    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {

      List<DropdownMenuItem> _categoryItems;

      if (!snapshot.hasData) {
          return Text("no data...");
      } else {
        _categoryItems = snapshot.data.docs.map((doc) {
          return DropdownMenuItem(
            child: Text(EncryptionDecryption.decryptAES(doc['title'])),
            value: EncryptionDecryption.decryptAES(doc['title']),
          );
        }).toList();
        return DropdownButtonFormField(
          hint: Text('Kategorie'),
          items: _categoryItems,
          onChanged: (value) => {print(value)},
        );
      }
    }
  );

【讨论】:

    【解决方案2】:

    .map() 返回一个可迭代对象。您必须添加.toList() 才能使错误消失。 像这样:

    snapshot.data.docs.map((DocumentSnapshot document) {
                    return Text(document['title']);
                  }).toList();
    

    但是,您可能想要执行以下操作: 这更有效,因为它只会遍历项目一次。

                  List<DropdownMenuItem> categoryItems = [];
    
                  for (int i = 0; i < snapshot.data.docs.length; i++) {
                    DocumentSnapshot snap=snapshot.data.docs[i];
                    categoryItems.add(
                      DropdownMenuItem(
                        child: Text('${snap.data()['title']}'),
                        value: snap.data()['title'],
                      ),
                    );
                    return DropdownButtonFormField(
                      items: categoryItems,
                    );
                  }
    

    【讨论】:

    • 当我尝试您的第一个建议时,我在与以前相同的行上遇到了此错误:参数类型“列表”无法分配给参数类型“小部件”。当我尝试第二种解决方案时,我可以启动应用程序,但我的快照返回 null。所以它返回的第一个 if 语句也是 null。
    【解决方案3】:

    您的代码返回一个 Iterable,而不是 DropdownMenuItem 所期望的单个 Widget。

    snapshot.data.docs.map((DocumentSnapshot document) {
                        return Text(document['title']);
                      })
    

    如果您不期望列表,也许您可​​以尝试获取第一个,例如:

    snapshot.data.docs.map((DocumentSnapshot document) {
                            return Text(document['title']);
                          }).first
    

    但是要小心,如果你的列表是空的,它会抛出一个错误。

    【讨论】:

    • 我为之前的错误工作。但是我现在在“值:“$document['title']”的行中有一个错误,它说“文档”没有定义。
    • 根据我在 FireStore 文档中阅读的内容,您应该将 snapshot.data.docs 替换为 snapshot.data.documents。你可以试试看它是否有帮助?此外,您可以使用调试器更好地查看 snapshot.data 变量中的内容
    • 我第一次尝试使用 'documents' 但后来出现此错误 -> 没有为类型 'QuerySnapshot' 定义 getter 'documents'。尝试导入定义“documents”的库,将名称更正为现有 getter 的名称,或定义名为“documents”的 getter 或字段
    • 我的错,尝试用 QueryDocumentSnapshot 替换 DocumentSnapshot 类型,看看是否有帮助
    猜你喜欢
    • 2021-06-26
    • 2021-07-06
    • 2020-05-28
    • 2019-12-06
    • 2021-08-23
    • 2020-01-10
    • 2020-08-30
    • 2021-07-05
    • 2021-11-23
    相关资源
    最近更新 更多