Flutter中如何将Cloud Firestore内以uid为ID的用户列表按高分排序
解决办法
你可以通过两种方式实现按高分排序,优先推荐Firestore服务端排序的方案,性能和一致性更好。
方案1:修改Firestore查询逻辑(推荐)
直接在DatabaseService的brews流中添加排序规则,修改你Database类里的get brews方法即可:
// Get brews stream Stream<List<HighscoreData>> get brews { // 按score字段降序排序,分数越高越靠前 return brewCollection.orderBy('score', descending: true).snapshots().map(_brewListFromSnapshot); }
注意事项
- 请确保你存储在Firestore中的
score字段是数字类型,如果是字符串类型会出现"99" > "100"的排序错误 - 第一次运行带排序的查询时,Firestore会要求你创建对应索引,你直接按照控制台报错提示创建即可,等待索引生效后就能正常返回排序结果。
方案2:本地手动排序
如果不想改数据库查询逻辑,也可以在拿到分数列表后在前端本地排序,修改HighscoreList组件中的代码:
@override Widget build(BuildContext context) { final differentHighScores = Provider.of<List<HighscoreData>>(context) ?? []; // 本地按分数降序排序,注意要把score转成数字比较 differentHighScores.sort((a, b) => int.parse(b.score).compareTo(int.parse(a.score))); return ListView.builder( itemCount: differentHighScores.length, itemBuilder: (BuildContext context, int index){ return PlayerHighscoreTile(highscoreData: differentHighScores[index]); }, ); }
注意事项
该方案仅适合数据量较小的场景,如果用户数量过百,本地排序会有明显的性能损耗。
内容的提问来源于stack exchange,提问作者Cameron Johnson
相关产品推荐
相关产品推荐

