首页 > 解决方案 > 如何在数据更改时从实时数据库构建列表并在 Flutter 中更新 ListView?

问题描述

我有一个用户列表和他们的分数,我想在任何分数变化或新用户添加到行列时建立一个实时排行榜。在 Flutter 的 firebase_database SDK 中,有 , 的方法onChildAddedonChildChanged但是如果我想构建这个排行榜,其中一些用户在比赛开始之前就存在并且他们有一些分数。如何创建实时排行榜?我现在的基本代码。

提供程序中定义的功能user

Stream getAllUsers() {
    return rtdb.child('ranks').orderByChild('score').onValue;
  }

排行榜.dart

import 'package:dating_app/providers/user.dart';
import 'package:dating_app/widgets/loader.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class LeaderBoard extends StatefulWidget {
  @override
  _LeaderBoardState createState() => _LeaderBoardState();
}

class _LeaderBoardState extends State<LeaderBoard> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: StreamBuilder(
        stream: Provider.of<User>(context, listen: false).getAllUsers(),
        builder: (context, snapshot){
          if(!snapshot.hasData){
            return Loader();
          }else{
            print(snapshot.data);
            return Text('Hello World');
          }
        },
      ),
    );
  }
}

在此处输入图像描述

标签: flutterfirebase-realtime-databasedart

解决方案


如果我想建立这个排行榜,其中一些用户在比赛开始之前就存在并且他们有一些分数

当您附加侦听器时,onChildAdded会立即为在该位置匹配的每个现有子节点调用 。

从关于监听子事件的文档中:

onChildAdded() 检索项目列表或监听项目列表的添加。此回调为每个现有的孩子触发一次,然后在每次将新的孩子添加到指定路径时再次触发。


推荐阅读