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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:12:52