Flutter/Firebase访问文档字段时出现多余位置参数错误
问题解决:Firestore获取字段时的参数错误及其他问题
核心错误原因
你遇到的Too many positional arguments: 0 expected, but 1 found错误,是因为Firestore的DocumentSnapshot.data()方法不接受任何参数。你试图传入'name'作为参数,不符合方法定义,因此触发报错。
正确获取字段的两种方式
要获取文档中的name字段,有两种常用实现方式:
- 调用无参
data()获取完整文档数据Map,再通过键名取值:
temp = value.data()?['name'] as String;
这里的?用于处理data()可能返回null的情况(比如目标文档不存在)。
- 使用
get()方法直接传入字段名:
temp = value.get('name') as String;
注意:如果目标字段不存在,get()会抛出异常,需根据业务需求添加异常处理逻辑。
额外问题修正:用户ID获取错误
你的代码中获取用户ID的逻辑完全错误:
final String id = FirebaseFirestore.instance.collection('users').id;
这行代码拿到的是集合users的名称(即字符串'users'),而非当前登录用户的UID。正确的获取方式是从FirebaseAuth的当前用户对象中提取:
final User? currentUser = auth.currentUser; if (currentUser != null) { final String id = currentUser.uid; // 后续文档查询操作 }
完整修正后的代码
结合async/await优化代码逻辑(比then链式调用更易读):
Future<void> getUserState() async { final FirebaseAuth auth = FirebaseAuth.instance; final User? currentUser = auth.currentUser; if (currentUser != null) { final String userId = currentUser.uid; final DocumentSnapshot docSnapshot = await FirebaseFirestore.instance .collection('users') .doc(userId) .get(); if (docSnapshot.exists) { // 方式1:通过data()获取Map再取值 final String? name1 = docSnapshot.data()?['name'] as String?; // 方式2:直接用get()获取字段 final String? name2 = docSnapshot.get('name') as String?; print('用户名称(方式1):$name1'); print('用户名称(方式2):$name2'); } else { print('该用户的文档不存在'); } } else { print('当前没有用户登录'); } }
内容的提问来源于stack exchange,提问作者Jason_27
相关产品推荐
相关产品推荐

