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

Flutter接入Firebase实现排行榜时调用get方法报null错误求助

错误原因

你声明的类成员变量DocumentSnapshot snapshot;仅完成了定义,没有做初始化赋值,在构造highscores stream时直接调用了snapshot.get('score'),此时snapshot为null,触发空方法调用报错。

修复方案

我们可以将排行榜查询方法改造成接收当前用户分数入参的形式,在拿到当前用户的分数后再发起查询即可:

  1. 替换DatabaseService中原有的highscores getter代码:
// 原有highscores getter替换为带参数的方法
Stream<List<HighscoreData>> getHighscores(num userScore) {
  return highscoresCollection
            .where('score', isLessThanOrEqualTo: userScore)
            .orderBy('score', descending: true)
            .limit(5)
            .snapshots()
            .map(_highscoresListFromSnapshot);
}
  1. UI层调用逻辑:先监听当前用户的个人数据拿到分数,再传入方法查询排行榜
// 示例UI层调用代码
StreamBuilder<UserData>(
  stream: DatabaseService(uid: 你当前登录用户的uid).userData,
  builder: (context, userDataSnapshot) {
    if (!userDataSnapshot.hasData) {
      return CircularProgressIndicator();
    }
    final currentUserScore = userDataSnapshot.data!.score;
    return StreamBuilder<List<HighscoreData>>(
      stream: DatabaseService(uid: 你当前登录用户的uid).getHighscores(currentUserScore),
      builder: (context, highscoreSnapshot) {
        if (highscoreSnapshot.hasData) {
          final rankList = highscoreSnapshot.data!;
          // 此处写你的排行榜列表渲染逻辑
          return ListView.builder(
            itemCount: rankList.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(rankList[index].name),
                trailing: Text(rankList[index].score.toString()),
              );
            },
          );
        } else {
          return CircularProgressIndicator();
        }
      },
    );
  }
)
注意事项

因为你同时使用了where条件筛选和orderBy排序,需要提前在Firebase控制台配置对应的复合索引。首次运行代码如果控制台输出索引缺失的报错,按照提示创建对应索引,等索引生效后即可正常查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:27:04