从Firebase Cloud Firestore返回完整阵列

从Firebase Cloud Firestore返回完整阵列,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,最新编辑日期:9月2日: 即使有赏金,我也没有得到太多的关注,所以我会尝试问一个更简单更具体的问题 因此,我已经按照Doug下面的建议重新组织了数据库,因为我无法在firebase中以任何方式引用阵列。现在我有了数组的映射,而不仅仅是数组。像这样: ObjectsList > CarsMap (Map) - sh899873jsa (Array) 0 "Toyota"

最新编辑日期: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;
  });
所以对于每个数组,我在创建时生成了一个随机键,这并不重要。我基本上只需要能够将所有数据作为单独的对象返回。理想情况下,我希望能够返回“所有丰田”,例如。比赛到此结束

下面是我根据下面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),
                  );
                }
              },
            ),
          ),
容器(
孩子:StreamBuilder(
流:Firestore.instance.collection('cars').document('ObjectsList').snapshots(),
生成器:(BuildContext上下文,异步快照){
如果(!snapshot.hasData){
返回LoadingAnimationBasic();
}
如果(snapshot.data==null){
返回LoadingAnimationBasic();
}否则{
返回列表视图(
收缩膜:对,
子项:_buildListCards(快照),
);
}
},
),
),
_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();
}
\u buildStoresList(异步快照快照){
返回snapshot.data.data.values
.map((doc)=>doc[0]==“丰田”?手势检测器(
子:容器(
宽度:MediaQuery.of(context).size.width,
孩子:卡片(
形状:圆形矩形边框(
边界半径:边界半径。圆形(0.0),
),
颜色:颜色。白色70,
标高:10,
孩子:排(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
填充物(
填充:常数边集全部(2.0),
子:约束框(
约束:BoxConstraints(
最大宽度:120,
最小宽度:120,
最大高度:100,
身高:100,
),
孩子:Image.network(
“一些丰田图片URL”,
适合:BoxFit.cover,
),
),
),
纵队(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
容器(
宽度:MediaQuery.of(context).size.width*0.5,
孩子:填充(
padding:const EdgeInsets.fromLTRB(10,10,0,0),
子:文本(
文件[1],,
样式:TextStyle(
fontWeight:fontWeight.bold,
尺码:18,
),
),
),
),
容器(
宽度:MediaQuery.of(context).size.width*0.5,
孩子:填充(
填充:从LTRB(5,10,0,0)开始的常量边集,
子:文本(
doc[2],,
样式:TextStyle(
尺寸:12,
),
),
),
),
],
),
纵队(
儿童:[
填充物(
填充:LTRB(5,40,0,0)中的常量边集,
子:文本(
doc[3],,
样式:TextStyle(
尺寸:14,
),
),
),
],
),
],
),
),
),
onTap:(){
futureTapHandlerHere();
},
):SizedBox(),)
.toList();
}

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

调用
snapshot.data()。您可以循环此映射中的条目,然后获取每个(数组)值的第一个子项

比如说:

List.from(event.snapshot.value作为列表)

final DocumentReference documents=wait Firestore.instance.collection('cars').document('ObjectsList');
DocumentSnapshot snapshot=等待文档。获取();
Map data=snapshot.data();
var cars=[];
data.forEach((k,v)=>{
var值=列表。从(v为列表);
加上(值[0]);
})
设置状态(){
arrayOfCars=汽车
});

这个问题没有答案。到目前为止,我仍在挣扎,已经损失了11天的生产时间


感谢试图提供帮助的人的建议,但这没有任何结果,我仍然没有解决它。

按照问题中列出的格式进行操作并不能解决这一问题,我正在尝试这样做,因为另一位用户告诉我,除非他们坐在地图下,否则我将无法删除单个阵列

这里的答案是,上面的说法是不正确的,解决方案是完全放弃地图,只保留数组。我在这里做的是让数组中的第一个对象是唯一的代码,这样我就可以很容易地引用它,就像这样:

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"
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是所选项目
final DocumentReference documents = await Firestore.instance.collection('cars').document('ObjectsList');
DocumentSnapshot snapshot = await documents.get();
Map<String, dynamic> data = snapshot.data();
var cars = [];
data.forEach((k,v) => {
  var values = List<String>.from(v as List<dynamic>);
  cars.add(values[0]);
})

setState(() {
  arrayOfCars = cars
});
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(),
  });
}