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

如何使用StreamBuilder实现排行榜:展示前100名及未上榜用户自身排名

实现方案

1. 调整数据查询逻辑

  • 同时发起两个数据查询请求:
    • 第一个请求按你设定的排行规则排序,拉取前100条的排行榜文档数据
    • 第二个请求单独查询当前登录用户的全局排名、对应展示字段(如积分、昵称等)

2. StreamBuilder 内部数据拼接逻辑

在StreamBuilder的builder回调中按业务要求处理数据拼接:

Widget build(BuildContext context) {
  return StreamBuilder(
    // 用CombineLatestStream合并两个数据流
    stream: CombineLatestStream.list([
      top100RankStream, // 前100条排行榜的数据流
      currentUserRankStream, // 当前用户排行数据的数据流
    ]),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        List<RankItem> top100List = snapshot.data[0] as List<RankItem>;
        RankItem? currentUserItem = snapshot.data[1] as RankItem?;
        
        // 校验当前用户是否在top100范围内
        bool userInTop100 = top100List.any((item) => item.uid == currentUserItem?.uid);
        List<RankItem> finalShowList = List.from(top100List);
        
        // 不在范围内则追加用户数据到列表末尾
        if (!userInTop100 && currentUserItem != null) {
          finalShowList.add(currentUserItem);
        }
        
        return ListView.builder(
          itemCount: finalShowList.length,
          itemBuilder: (context, index) {
            // 给额外追加的用户条目加特殊样式区分
            bool isExtraUserItem = !userInTop100 && index == finalShowList.length - 1;
            return RankRowWidget(
              item: finalShowList[index],
              isHighlight: isExtraUserItem,
            );
          },
        );
      }
      // 其他加载、错误状态自行补充
      return const CircularProgressIndicator();
    },
  );
}

3. 注意事项

  • 查询当前用户排名的排序规则必须和拉取前100条的排序规则完全一致,避免排名计算偏差
  • 追加的用户条目可搭配分割线、高亮背景做视觉区分,符合用户交互预期
  • 若你的数据源支持复合查询,可将两个请求合并减少网络开销

内容的提问来源于stack exchange,提问作者inter cretasyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:36:02