Flutter Firebase按名称搜索用户时出现类型转换异常问题
解决Flutter Firebase搜索用户时的类型转换异常
异常根源
你遇到的type 'String' is not a subtype of type 'int'异常,大概率是变量类型声明与Firestore返回数据不匹配导致的,比如userMap被声明为List<int>或其他int相关类型,但Firestore单条用户数据返回的是Map<String, dynamic>,赋值时触发类型转换错误。
具体修复步骤
1. 修正userMap的类型声明
确保userMap的类型与Firestore返回的数据结构一致,比如:
// 声明为可空的Map类型,适配单条用户数据 Map<String, dynamic>? userMap;
如果你使用自定义User实体类,要确保从Firestore数据正确转换(比如通过fromJson方法)。
2. 处理查询结果为空的边界情况
当前代码直接取value.docs[0],如果没有匹配用户会抛出索引越界异常,同时添加错误捕获:
void onSearch() async { FirebaseFirestore firestore = FirebaseFirestore.instance; setState(() { isLoad = true; }); await firestore .collection('User') .where('firstName', isEqualTo: searchController.text) .get() .then((value) { setState(() { if (value.docs.isNotEmpty) { userMap = value.docs[0].data(); } else { userMap = null; // 无匹配用户时置空 } isLoad = false; }); print(userMap); }).catchError((error) { setState(() { isLoad = false; }); print('搜索失败:$error'); }); }
3. 适配StreamBuilder与ListView展示
结合你提到的用StreamBuilder实时展示需求,建议改用Stream监听搜索结果,同时确保ListView的item处理正确:
StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance .collection('User') .where('firstName', isEqualTo: searchController.text) .snapshots(), builder: (context, snapshot) { if (snapshot.hasError) { return Center(child: Text('搜索出错:${snapshot.error}')); } if (snapshot.connectionState == ConnectionState.waiting) { return Center(child: CircularProgressIndicator()); } final userList = snapshot.data!.docs .map((doc) => doc.data() as Map<String, dynamic>) .toList(); return ListView.builder( itemCount: userList.length, itemBuilder: (context, index) { final user = userList[index]; return ListTile( title: Text(user['firstName'] ?? '未知名称'), subtitle: Text(user['email'] ?? '无邮箱'), // 其他用户信息展示 ); }, ); }, )
4. 检查Firestore字段类型
确认Firestore中firstName字段的类型为字符串,如果该字段被误设为数字类型,而你传入搜索框的文本是字符串,也会触发类型不匹配异常。
内容的提问来源于stack exchange,提问作者Zubair Naeem
相关产品推荐
相关产品推荐

