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