firebase 从云Firestore阅读时出现类型错误-(类型“List< dynamic>”不是类型“List”的子类型< String>)

jk9hmnmh  于 2023-01-31  发布在  其他
关注(0)|答案(2)|浏览(123)

我是新的flutter和firebase,所以请原谅我,如果这是一个愚蠢的问题。
我正在尝试从Cloud Firestore读取文档并将数据放置在名为Profile的已定义对象中。
这是我当前的实现:

final docRef = FirebaseFirestore.instance
                .collection('/user_data')           
                .doc(FirebaseAuth.instance.currentUser!.uid);

Future<Profile> readUserDocument() {    
    return docRef.get().then(
        (DocumentSnapshot doc) {
            return Profile(
                imagePaths: doc.get('imagePaths'), 
                firstName: doc.get('firstName'),
                lastName: doc.get('lastName') , 
                bio: doc.get('bio'), 
                gender: doc.get('gender'), 
                hometown: doc.get('hometown'), 
                age: doc.get('age'), 
                ethnicity: doc.get('ethnicity'), 
                hairColor: doc.get('hairColor'), 
                eyeColor: doc.get('eyeColor'), 
                hobbies: doc.get('hobbies'), 
                instagram: doc.get('instagram'), 
                snapchat: doc.get('snapchat'), 
                work: doc.get('work'), 
                school: doc.get('school'), 
                educationLevel: doc.get('educationLevel')
            );
        },
        onError: (e) => print("Error getting document: $e"),
    );
}

在一个单独的文件中,我定义了一个在onClick方法中调用readUserDocument()的列表切片

ListTile(
    onTap: () async {
        Profile userData = await readUserDocument(); // TYPE ERROR HERE
        // ...
    }
    // ...
)

调用await readUserDocument()时,将引发以下异常:
_TypeError (type 'List<dynamic>' is not a subtype of type 'List<String>')
这让我很困惑,因为readUserDocument()将返回一个配置文件,而不是List<dynamic>。我也很困惑为什么这里会涉及List<String>
任何帮助都将不胜感激。谢谢!

7ivaypg9

7ivaypg91#

也许您可以尝试获取文档快照并在返回ListTile时构建对象

final docRef = FirebaseFirestore.instance
                .collection('/user_data')           
                .doc(FirebaseAuth.instance.currentUser!.uid).snapshots();
eblbsuwk

eblbsuwk2#

我最终采取了不同的方法,并遵循Firestore documentation example
我向Profile对象添加了factory Profile.fromFirestore()Map<String, dynamic> toFirestore()方法,然后就可以使用转换器来获取Profile对象

Future <Profile> getUserProfile() async {   
    final ref = FirebaseFirestore.instance
        .collection("/user_data")
        .doc(FirebaseAuth.instance.currentUser!.uid)
        .withConverter(
    fromFirestore: Profile.fromFirestore,
    toFirestore: (Profile profile, _) => profile.toFirestore(),
    );
    
    final docSnap = await ref.get();
    Profile profile = docSnap.data() ?? constants.NULL_PROFILE;
    return profile;
}

相关问题