You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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;
  }

解决方法:

  1. 修正FieldPath的错误用法
    你代码里两次给idCode赋值时多了.toString(),这会把FieldPath对象转换成字符串(类似FieldPath([details, id-no])),而非正确传递路径,导致无法获取字段。需去掉这个多余的转换:

    idCode = snapshot.get(FieldPath(const ['details','id-no']));
    
  2. 更简洁的嵌套字段获取方式
    直接通过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];
        });
      }
    }
    
  3. 安全处理空字段
    如果担心某些嵌套字段可能不存在,可使用空访问运算符?.避免崩溃,同时设置默认值:

    dPic = userData['verification']?['dPic'] ?? '默认链接';
    

内容的提问来源于stack exchange,提问作者Polly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:01:18