如何使用Flutter从Firestore获取嵌套数据(含dPic字段)
如何从Firestore的结构化映射中获取特定字段(如dPic链接)
你的Firestore数据结构为users集合下的文档包含三个嵌套映射:
details:包含id-no、first-name、last-name、email、address等字段verification:包含dPic、IDFront、IDBack等字段others:包含role、validation等字段
你尝试的代码如下:
Future _getDataUSerFromDatabase() async { await FirebaseFirestore.instance.collection("users").doc(FirebaseAuth.instance.currentUser!.uid).get().then((snapshot)async{ if(snapshot.exists){ setState((){ try { idCode = snapshot.get(FieldPath(const ['details','id-no']).toString()); firstName = snapshot.get(FieldPath(const ['details','first-name'])); lastName = snapshot.get(FieldPath(const ['details','last-name'])); role = snapshot.get(FieldPath(const ['others','role'])); email = snapshot.get(FieldPath(const ['details','email'])); idCode = snapshot.get(FieldPath(const ['details','id-no']).toString()); address = snapshot.get(FieldPath(const ['details','address'])); dPic = snapshot.get(FieldPath(const ['verification','dPic'])); idFront = snapshot.get(FieldPath(const ['verification','IDFront'])); idBack = snapshot.get(FieldPath(const ['verification','IDBack'])); validation = snapshot.get(FieldPath(const ['others','validation'])); //store the data into the list data = [idCode,firstName,lastName,email,address,role,validation,dPic,idFront,idBack]; } on StateError catch(e) { print('No nested field exists!'); } }); } }); // final List<DocumentSnapshot> documents = result.snapshot; }
解决方法:
修正
FieldPath的错误用法
你代码里两次给idCode赋值时多了.toString(),这会把FieldPath对象转换成字符串(类似FieldPath([details, id-no])),而非正确传递路径,导致无法获取字段。需去掉这个多余的转换:idCode = snapshot.get(FieldPath(const ['details','id-no']));更简洁的嵌套字段获取方式
直接通过snapshot.data()获取整个文档的映射数据,再通过嵌套键值访问,代码更直观易读:Future _getDataUSerFromDatabase() async { final docSnapshot = await FirebaseFirestore.instance .collection("users") .doc(FirebaseAuth.instance.currentUser!.uid) .get(); if (docSnapshot.exists) { final userData = docSnapshot.data()!; setState(() { idCode = userData['details']['id-no']; firstName = userData['details']['first-name']; lastName = userData['details']['last-name']; role = userData['others']['role']; email = userData['details']['email']; address = userData['details']['address']; dPic = userData['verification']['dPic']; // 直接获取dPic链接 idFront = userData['verification']['IDFront']; idBack = userData['verification']['IDBack']; validation = userData['others']['validation']; data = [idCode, firstName, lastName, email, address, role, validation, dPic, idFront, idBack]; }); } }安全处理空字段
如果担心某些嵌套字段可能不存在,可使用空访问运算符?.避免崩溃,同时设置默认值:dPic = userData['verification']?['dPic'] ?? '默认链接';
内容的提问来源于stack exchange,提问作者Polly
相关产品推荐
相关产品推荐

