最新编辑: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();
}
因此,现在唯一剩下的就是能够从数据库中编辑/删除这些条目,而且我认为这必须依赖于创建它们时生成的唯一标识符。我看不到没有标识符怎么可能执行此功能,但是我不知道如何实际使用它或从数据库中返回它。
不能通过问题中列出的格式来解决此问题,并且我正在尝试这种方式,因为另一个用户告诉我,除非它们位于映射下,否则我将无法删除单个数组。
答案是上面的说法不正确,解决方案是完全放弃地图,只保留数组。我在这里所做的对我来说很有意义,就是让数组中的第一个对象成为唯一代码,因此我可以轻松地引用它,如下所示:
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] 删除。
我来说两句