Flutter从Firebase Cloud Firestore返回完整阵列

Bisclavret

最新编辑:9月2日:

即使有赏金,我对此也没有太大的吸引力,所以我将尝试提出一个更简单,更具体的问题。

因此,我已按照Doug的以下建议对数据库进行了重组,因为我无法以其他方式在Firebase中引用数组。所以现在我有了一个数组映射,而不仅仅是数组。像这样:

ObjectsList  >  CarsMap (Map)
                   - sh899873jsa (Array)
                     0  "Toyota"
                     1  "Supra"
                     2  "1996"
                     3  "$4990"

                   - hasd823j399 (Array)
                     0  "Toyota"
                     1  "Corolla"
                     2  "2014"
                     3  "$11990"

                   - nelaoiwi283 (Array)
                     0  "Ford"
                     1  "Territory"
                     2  "2018"
                     3  "$35000"

但是我不知道如何实际使用这种结构,因为我以前从未见过这种结构。我现在遇到第一个错误,这是弗兰克在下面他的回答中提供给我的代码,我将其转换为:

 final DocumentReference documents = await Firestore.instance.collection('ObjectsList');
  DocumentSnapshot snapshot = await documents.get();
  Map<String, dynamic> data = snapshot.data;
  var loadCarItems = [];

  data.forEach((k,v) => {
    values = List<String>.from(v as List<String>),
    print(values),
    if (values[0] == "Toyota") {
      loadCarItems.add(values[0]),
    },
  });

  setState(() {
    CarItemsArray = loadCarItems;
  });

但是由于我已更改为map> array结构,因此在此行出现错误:

data.forEach((k,v) => {
  values = List<String>.from(v as List<String>),

错误是:

Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<String>' in type cast

所以很明显,现在结构已经更改,我需要更改此语法,但是我不知道如何更改,也无法在线找到任何内容。

以前的信息:

我正在尝试找出一种从Firebase返回整个数组的方法,以便随后可以处理内部数据。

例如,我在数据库中有一个包含数组的文档,如下所示:

ObjectsList  >  sh899873jsa
                   0  "Toyota"
                   1  "Supra"
                   2  "1996"
                   3  "$4990"

                 hasd823j399
                   0  "Toyota"
                   1  "Corolla"
                   2  "2014"
                   3  "$11990"

                  nelaoiwi283
                   0  "Ford"
                   1  "Territory"
                   2  "2018"
                   3  "$35000"

因此,对于每个数组,我在创建时都会生成一个随机密钥,这并不重要。我基本上只需要能够将所有数据作为单独的对象返回。理想情况下,例如,我希望能够返回“所有丰田”。那是这里的最后一场比赛。

这是到目前为止我根据以下Frank的建议生成的代码,Frank的建议将我带入了正确的道路。

从构建wdiget中:

          Container(
            child: StreamBuilder(
              stream: Firestore.instance.collection('cars').document('ObjectsList').snapshots(),
              builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                if (!snapshot.hasData) {
                  return LoadingAnimationBasic();
                }
                if (snapshot.data == null) {
                  return LoadingAnimationBasic();
                } else {
                  return ListView(
                    shrinkWrap: true,
                    children: _buildListCards(snapshot),
                  );
                }
              },
            ),
          ),

_buildListCards函数经过简化,因此您可以看到它的工作方式:

_buildStoresList(AsyncSnapshot<DocumentSnapshot> snapshot) {
return snapshot.data.data.values
    .map((doc) => doc[0] == "Toyota" ? GestureDetector(
  child: Container(
    width: MediaQuery.of(context).size.width,
    child: Card(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(0.0),
      ),
      color: Colors.white70,
      elevation: 10,
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.all(2.0),
            child: ConstrainedBox(
              constraints: BoxConstraints(
                maxWidth: 120,
                minWidth: 120,
                maxHeight: 100,
                minHeight: 100,
              ),
              child: Image.network(
                'some toyota picture URL',
                fit: BoxFit.cover,
              ),
            ),
          ),
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Container(
                width: MediaQuery.of(context).size.width * 0.5,
                child: Padding(
                  padding: const EdgeInsets.fromLTRB(10, 10, 0, 0),
                  child: Text(
                    doc[1],
                    style: TextStyle(
                      fontWeight: FontWeight.bold,
                      fontSize: 18,
                    ),
                  ),
                ),
              ),
              Container(
                width: MediaQuery.of(context).size.width * 0.5,
                child: Padding(
                  padding: const EdgeInsets.fromLTRB(5, 10, 0, 0),
                  child: Text(
                    doc[2],
                    style: TextStyle(
                      fontSize: 12,
                    ),
                  ),
                ),
              ),
            ],
          ),
          Column(
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.fromLTRB(5, 40, 0, 0),
                child: Text(
                  doc[3],
                  style: TextStyle(
                    fontSize: 14,
                  ),
                ),
              ),
            ],
          ),
        ],
      ),
    ),
  ),
  onTap: () {
    futureTapHandlerHere();
  },
) : SizedBox(), )
    .toList();
}

因此,现在唯一剩下的就是能够从数据库中编辑/删除这些条目,而且我认为这必须依赖于创建它们时生成的唯一标识符。我看不到没有标识符怎么可能执行此功能,但是我不知道如何实际使用它或从数据库中返回它。

Bisclavret

不能通过问题中列出的格式来解决此问题,并且我正在尝试这种方式,因为另一个用户告诉我,除非它们位于映射下,否则我将无法删除单个数组。

答案是上面的说法不正确,解决方案是完全放弃地图,只保留数组。我在这里所做的对我来说很有意义,就是让数组中的第一个对象成为唯一代码,因此我可以轻松地引用它,如下所示:

ObjectsList  >  
(document)      - sh899873jsa (Array)
                 0  "sh899873jsa" 
                 1  "Toyota"
                 2  "Supra"
                 3  "1996"
                 4  "$4990"

               - hasd823j399 (Array)
                 0  "hasd823j399"
                 1  "Toyota"
                 2  "Corolla"
                 3  "2014"
                 4  "$11990"

               - nelaoiwi283 (Array)
                 0  "nelaoiwi283"
                 1  "Ford"
                 2  "Territory"
                 3  "2018"
                 4  "$35000"

这些可以直接引用并轻松删除:

_deleteMenuItem() async {
  await deleteSelectedImages();
  DocumentReference documentReference = Firestore.instance.collection('data').document('ObjectsList');
  documentReference.updateData({
    CarsMap[selectedItem][0]: FieldValue.delete(),
  });
}

其中CarsMap是运行时加载的汽车对象数组,selectedItem是UI中从ListTiles中选择的项目。因此,第一步是从Firebase获取所有数据,并将其填充到CarsMap数组中。第2步是从此数组构建ListTiles。第3步是使用onTap方法选择当前的ListTile,然后将该瓦片的索引存储到selectedItem中。

这可以满足我的需要,用户现在可以根据需要填充数据库并从数据库中删除数组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

向Cloud Firestore添加阵列(Flutter / Dart)

来自分类Dev

Flutter Google登录数据保存到Firebase Cloud Firestore

来自分类Dev

Flutter和Cloud Firestore

来自分类Dev

Firebase / Cloud Firestore:onSnapshot()与on()

来自分类Dev

Firebase + PHP - Cloud Firestore

来自分类Dev

如何在Flutter中将列表对象发布到Cloud Firestore Firebase

来自分类Dev

Cloud Firestore Firebase集合参考上的IN查询是否具有Flutter / Dart等效项?

来自分类Dev

关于 firebase/cloud firestore 的困惑

来自分类Dev

Flutter Firebase Cloud功能无法调用

来自分类Dev

在Flutter中查找n个最近的位置:结合Cloud Firestore与Firebase Realtime Database结合使用的本地数据库(Sqlite)

来自分类Dev

在flutter中从cloud_firestore删除文档

来自分类Dev

Cloud Firestore查询以获取文档ID,Flutter

来自分类Dev

Firebase Cloud Firestore-从参考访问集合

来自分类Dev

Firebase Cloud Firestore无法正常工作

来自分类Dev

带地图的Firebase Cloud Firestore安全规则

来自分类Dev

.add() in firebase cloud firestore 嵌套对象

来自分类Dev

Firebase 函数未针对 Cloud Firestore 触发

来自分类Dev

Firebase Cloud Functions返回内部错误

来自分类Dev

Angular和Firebase Cloud Functions返回null

来自分类Dev

如何使用Dart / Flutter在Cloud Firestore中存储简单矩阵?

来自分类Dev

Cloud Firestore连接我的Flutter Windows应用程序

来自分类Dev

Flutter-基于Cloud Firestore数据渲染小部件

来自分类Dev

如何在Cloud Flutter Firestore中处理嵌套集合查询?

来自分类Dev

无法从Cloud Firestore检索Flutter中的多个集合

来自分类Dev

在Flutter Cloud Firestore中设置自定义文档ID

来自分类Dev

Flutter-更新Cloud Firestore中的映射和数组的值

来自分类Dev

Flutter Cloud Firestore 在 iOS 上调用 getDocuments() 失败

来自分类Dev

在Firestore中使用Firebase Cloud功能推送通知

来自分类Dev

如何过滤Firebase Cloud Firestore上的ID列表?

Related 相关文章

  1. 1

    向Cloud Firestore添加阵列(Flutter / Dart)

  2. 2

    Flutter Google登录数据保存到Firebase Cloud Firestore

  3. 3

    Flutter和Cloud Firestore

  4. 4

    Firebase / Cloud Firestore:onSnapshot()与on()

  5. 5

    Firebase + PHP - Cloud Firestore

  6. 6

    如何在Flutter中将列表对象发布到Cloud Firestore Firebase

  7. 7

    Cloud Firestore Firebase集合参考上的IN查询是否具有Flutter / Dart等效项?

  8. 8

    关于 firebase/cloud firestore 的困惑

  9. 9

    Flutter Firebase Cloud功能无法调用

  10. 10

    在Flutter中查找n个最近的位置:结合Cloud Firestore与Firebase Realtime Database结合使用的本地数据库(Sqlite)

  11. 11

    在flutter中从cloud_firestore删除文档

  12. 12

    Cloud Firestore查询以获取文档ID,Flutter

  13. 13

    Firebase Cloud Firestore-从参考访问集合

  14. 14

    Firebase Cloud Firestore无法正常工作

  15. 15

    带地图的Firebase Cloud Firestore安全规则

  16. 16

    .add() in firebase cloud firestore 嵌套对象

  17. 17

    Firebase 函数未针对 Cloud Firestore 触发

  18. 18

    Firebase Cloud Functions返回内部错误

  19. 19

    Angular和Firebase Cloud Functions返回null

  20. 20

    如何使用Dart / Flutter在Cloud Firestore中存储简单矩阵?

  21. 21

    Cloud Firestore连接我的Flutter Windows应用程序

  22. 22

    Flutter-基于Cloud Firestore数据渲染小部件

  23. 23

    如何在Cloud Flutter Firestore中处理嵌套集合查询?

  24. 24

    无法从Cloud Firestore检索Flutter中的多个集合

  25. 25

    在Flutter Cloud Firestore中设置自定义文档ID

  26. 26

    Flutter-更新Cloud Firestore中的映射和数组的值

  27. 27

    Flutter Cloud Firestore 在 iOS 上调用 getDocuments() 失败

  28. 28

    在Firestore中使用Firebase Cloud功能推送通知

  29. 29

    如何过滤Firebase Cloud Firestore上的ID列表?

热门标签

归档