Flutter接入Firebase实现排行榜时调用get方法报null错误求助
错误原因
你声明的类成员变量DocumentSnapshot snapshot;仅完成了定义,没有做初始化赋值,在构造highscores stream时直接调用了snapshot.get('score'),此时snapshot为null,触发空方法调用报错。
修复方案
我们可以将排行榜查询方法改造成接收当前用户分数入参的形式,在拿到当前用户的分数后再发起查询即可:
- 替换
DatabaseService中原有的highscoresgetter代码:
// 原有highscores getter替换为带参数的方法 Stream<List<HighscoreData>> getHighscores(num userScore) { return highscoresCollection .where('score', isLessThanOrEqualTo: userScore) .orderBy('score', descending: true) .limit(5) .snapshots() .map(_highscoresListFromSnapshot); }
- 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
相关产品推荐
相关产品推荐

