颤振:阵列的Firebase贴图 编辑2:

颤振:阵列的Firebase贴图 编辑2:,firebase,flutter,Firebase,Flutter,我在下面编写的代码现在似乎可以工作了,但我无法使用它来填充ListTiles,因此它对于我需要实现的内容似乎没有用处 我被困在这一点上: Container( child: StreamBuilder( stream: Firestore.instance.collection('User').document('ObjectsList').snapshots(), builder: (BuildContext context, AsyncSnapshot<Docu

我在下面编写的代码现在似乎可以工作了,但我无法使用它来填充ListTiles,因此它对于我需要实现的内容似乎没有用处

我被困在这一点上:

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

原始问题: 我试图在Firebase中以类的形式创建一个数组存储库,用户可以创建,然后在以后编辑和删除

我认为实现这一点的唯一方法是使用唯一标识符作为每个数组(类)的名称,以便每个数组都可以唯一标识。问题在于,在Firebase中,如果数组标识符位于顶层,则根本无法与之通信,它基本上是不可见的

为了解决这个问题,我认为用户生成的数组需要放在一个映射下,这样在用户创建了一些条目之后,数据库就会像这样:

ObjectsList  >  CarsMap (Map)
 (document)      - 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"
但我不知道如何在颤振中实际使用这种结构,因为我以前从未见过这种结构,在网上也找不到任何东西。我需要能够做的是从这些数据构建ListTiles,并能够选择用于编辑/删除ontap的特定数组

我一直在尝试以下代码:

 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;
  });
final DocumentReference documents=wait Firestore.instance.collection('ObjectsList');
DocumentSnapshot snapshot=等待文档。获取();
Map data=snapshot.data;
var loadCarItems=[];
data.forEach((k,v)=>{
值=列表。从(v为列表),
打印(值),
如果(值[0]=“丰田”){
loadCarItems.add(值[0]),
},
});
设置状态(){
CarItemsArray=负载Caritems;
});
但我在这一行中遇到了一个错误:

data.forEach((k,v) => {
  values = List<String>.from(v as List<String>),
data.forEach((k,v)=>{
值=列表。从(v为列表),
错误是:

Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<String>' in type cast
未处理的异常:类型“\u InternalLinkedHashMap”不是类型转换中“List”类型的子类型

有人知道这样的数组映射的语法吗?

我想我们没有在“CarsMap”中开始迭代,而是在整个映射中进行了迭代

data['CarsMap'].forEach((k,v) => {
    values = v,   // Since it is dynamic, it takes care of casting.
    print(values),
    if (values[0] == "Toyota") {
      loadCarItems.add(values[0]),
    },
});


希望这能解决您的问题。

地图数据=快照。数据;
之后,您能分享
数据的价值吗?
?非常感谢您的回复。我已经在上面的原始帖子中回答了您的问题。非常感谢您的回答。我感觉我离最终完成这项工作已经很近了。现在有另一个错误:未处理的异常:类型“List”不是类型cast中类型“List”的子类型。我们可以尝试一下
values=v
本身吗?因为它是动态的,它负责铸造?更新了答案这不再是错误,这太棒了。我现在得到的是,当我打印loadCarItems时,我只得到值[Toyota,Toyota]。它不会填充其余的数据。哦,这只是因为[0]哈哈。正确的行是:loadCarItems.add(值),这不再是错误,这很好,但它并没有像我想的那样解决我的问题。我已经更新了上面的问题,我确信,因为这段代码解决了我现在很接近,但只是不知道构建语法。
Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<String>' in type cast
data['CarsMap'].forEach((k,v) => {
    values = v,   // Since it is dynamic, it takes care of casting.
    print(values),
    if (values[0] == "Toyota") {
      loadCarItems.add(values[0]),
    },
});
data['CarsMap'].forEach((k,v) => {
     values = v.cast<String>(),   // Casting it to String
     print(values),
     if (values[0] == "Toyota") {
        loadCarItems.add(values[0]),
     },
});
_buildCarsList(snapshot) {
    List<Widget> listItems = [];
    Map<String, dynamic> data = snapshot.data.data();

    data['CarsMap'].forEach((k, v) {
      List<String> values = v.cast<String>();
      if (values[0] == "Toyota") {
        listItems.add(
          Container(
            child: Text(
              values[1],
            ),
          ),
        );
      }
    });
    
    return listItems;
  }