flutter - 如何在数据更改时从实时数据库构建列表并在 Flutter 中更新 ListView?
问题描述
我有一个用户列表和他们的分数,我想在任何分数变化或新用户添加到行列时建立一个实时排行榜。在 Flutter 的 firebase_database SDK 中,有 , 的方法onChildAdded
,onChildChanged
但是如果我想构建这个排行榜,其中一些用户在比赛开始之前就存在并且他们有一些分数。如何创建实时排行榜?我现在的基本代码。
提供程序中定义的功能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');
}
},
),
);
}
}
解决方案
如果我想建立这个排行榜,其中一些用户在比赛开始之前就存在并且他们有一些分数
当您附加侦听器时,onChildAdded
会立即为在该位置匹配的每个现有子节点调用 。
从关于监听子事件的文档中:
onChildAdded()
检索项目列表或监听项目列表的添加。此回调为每个现有的孩子触发一次,然后在每次将新的孩子添加到指定路径时再次触发。
推荐阅读
- ios - UICollectionView 单元格忽略 UICollectionViewDelegateFlowLayout - sizeForItemAt
- c++ - 我有模板功能。通过使用函数 std::for_each 将每个正数替换为此容器中的最大数
- php - MB_CASE_*_SIMPLE 常量的用途是什么?
- php - 代理的原则设置
- sql-server - 如果用户有权“执行”存储过程,但没有“插入”特定表的访问权限,该存储过程会失败吗?
- c# - 使用枚举作为 FK 的 Entity Framework Core
- typescript - Typescript 如何扩展使用泛型类型的接口?
- dynamics-crm - 如何使用 Liquid 将动态数据传递给 javascript 函数?
- javascript - 在 Node.js 上使用动态 import() 函数
- c# - 在循环或子方法中退出 void 方法的最佳实践?