从Firestore获取排行榜屏幕的数据效率低下



我想在屏幕上显示前25名玩家的列表(从Firestore获取(,目前我就是这样实现的:

late final Stream<QuerySnapshot> _mainScoreStream;

@override
void initState() {
futureAd = fetchAd();
_mainScoreStream = FirebaseFirestore.instance
.collection('users')
.orderBy('current_score', descending: true)
.where('current_score', isGreaterThan: 0)
.limit(25)
.snapshots();
super.initState();
}

@override
Widget build(BuildContext context) {
// Used to make text size automaticaly sizeable for all devices
final double unitHeightValue = MediaQuery.of(context).size.height * 0.01;
final user = Provider.of<UserModels?>(context);
return SafeArea(
child: StreamBuilder<QuerySnapshot>(
stream: _mainScoreStream,
// ignore: missing_return
builder: (context, snapshot) {
if (snapshot.hasData) {
return Expanded(
child: ListView.builder(
physics: BouncingScrollPhysics(),
itemBuilder: (context, index) {
DocumentSnapshot data = snapshot.data!.docs[index];
return LeaderboardCard(
currentScore: data['current_score'].toString(),
name: data['name'],
index: index,
isCurrentUser: data.id == user!.uid,
);
},
itemCount: snapshot.data!.docs.length,
),
);
} else if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
strokeWidth: 2.0,
),
);
}
return Container();
},
),
);
}
}

排行榜每天更改一次,但通过此实现,每个用户可以额外读取25次。

有没有更有效的方法来获取这些数据,或者这可以吗,因为我每个用户每天的读取量大约为30?

编辑:我知道过度优化我的读/写不是一个好的做法,但目前基于Firebase定价计算器,这可能会导致大量的日常阅读,所以不知道如何进行,我总是可以降低限制或完全删除排行榜

如果你每天更改一次排行榜,你可以:

  • 计算受信任系统(您的开发机器、您控制的服务器或云功能/云运行(上的排行榜内容,并将其存储在Firestore的单独文档中。然后,每个客户只需阅读文档即可获得整个排行榜。

  • 在受信任的系统上创建一个每天都有查询结果的数据包,并通过更便宜的系统(例如云存储,甚至再次作为Firestore中的文档(将其分发给用户。

最新更新