Firebase Firestore-保存查询结果
大家晚上好,我对Firebase有问题。基本上,我正在创建排行榜,我必须找到得分最多的7个用户,这一点没有问题,但我不知道如何保存7个用户的数据,以便稍后在文本小部件中显示他们 这是我做的函数:Firebase Firestore-保存查询结果,firebase,flutter,google-cloud-firestore,flutter-layout,Firebase,Flutter,Google Cloud Firestore,Flutter Layout,大家晚上好,我对Firebase有问题。基本上,我正在创建排行榜,我必须找到得分最多的7个用户,这一点没有问题,但我不知道如何保存7个用户的数据,以便稍后在文本小部件中显示他们 这是我做的函数: Future<void> getLeaderboard() async { return await FirebaseFirestore.instance .collection("leaderboard") .orderBy(
Future<void> getLeaderboard() async {
return await FirebaseFirestore.instance
.collection("leaderboard")
.orderBy('Score', descending: true)
.limit(7)
.get()
.then((QuerySnapshot querySnapshot) => {
querySnapshot.docs.forEach((doc) {
print(doc["first_name"]);
}),
});
}
Future GetLeadboard()异步{
return wait wait FirebaseFirestore.instance
.收藏(“排行榜”)
.orderBy('Score',降序:true)
.限额(7)
.get()
.然后((QuerySnapshot QuerySnapshot)=>{
querySnapshot.docs.forEach((doc){
打印(文件[“名字]);
}),
});
}
如何保存所有7个用户的用户名和分数,以便以后重新使用
这是页面代码:
import 'package:sizer/sizer.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:goodgoals_android/pages/home_page.dart';
import 'package:goodgoals_android/pages/profile_page.dart';
import 'package:salomon_bottom_bar/salomon_bottom_bar.dart';
import 'package:goodgoals_android/services/authentication.dart';
class soloLeaderboardPage extends StatefulWidget {
soloLeaderboardPage({Key key, this.auth, this.userId, this.logoutCallback, this.home})
: super(key: key);
final BaseAuth auth;
final VoidCallback logoutCallback;
final String userId;
final HomePage home;
@override
State<StatefulWidget> createState() => new _soloLeaderboardPageState();
}
class _soloLeaderboardPageState extends State<soloLeaderboardPage> {
final _formKey = new GlobalKey<FormState>();
final databaseReference = FirebaseFirestore.instance;
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
var _selectedTab = _SelectedTab.leaderboard;
var Nick = "";
@override
void initState() {
super.initState();
asyncMethod();
}
void asyncMethod() async {
await getLeaderboard();
}
void _handleIndexChanged(int i) {
setState(() {
_selectedTab = _SelectedTab.values[i];
print("Valore $i");
if (i == 0) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => HomePage(),
));
}
else if (i == 3) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ProfilePage(),
));
}
else if (i == 2) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => soloLeaderboardPage(),
));
}
});
}
Future<void> getLeaderboard() async {
return await FirebaseFirestore.instance
.collection("leaderboard")
.orderBy('Score', descending: true)
.limit(7)
.get()
.then((QuerySnapshot querySnapshot) => {
querySnapshot.docs.forEach((doc) {
setState(() {
Nick = (doc["Score"]);
});
}),
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: Stack(
children: <Widget>[
_showForm(),
]
),
);
}
Widget _showForm() {
return new Container(
padding: EdgeInsets.all(10.0),
child: new Form(
key: _formKey,
child: new ListView(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
children: <Widget>[
leaderbordSelector(),
showPodium1(),
showOtherPosition(),
bottomBarMimic(),
//bottomBarMimic(),
],
),
));
}
Widget bottomBarMimic() {
return Positioned(
width: 100.0.w,
bottom: 0,
left: 0,
child: Container(
color: Colors.white,
child: SalomonBottomBar(
currentIndex: _SelectedTab.values.indexOf(_selectedTab),
onTap: _handleIndexChanged,
items: [
SalomonBottomBarItem(
icon: Icon(Icons.home),
title: Text("Home"),
selectedColor: Colors.purple,
),
SalomonBottomBarItem(
icon: Icon(Icons.menu_book_sharp),
title: Text("Magazine"),
selectedColor: Colors.pink,
),
SalomonBottomBarItem(
icon: Icon(Icons.bar_chart),
title: Text("Leaderboard"),
selectedColor: Colors.orange,
),
SalomonBottomBarItem(
icon: Icon(Icons.person),
title: Text("Profile"),
selectedColor: Colors.teal,
),
],
)),
);
}
Widget leaderbordSelector() {
return new Padding(
padding: EdgeInsets.symmetric(vertical: 5.0.h, horizontal: 17.0.h),
child: Row(
children: <Widget>[
IconButton(
icon: Icon(Icons.person, color: Colors.blue),
onPressed: () {}
),
IconButton(
icon: Icon(Icons.people),
onPressed: () {}
),
],
),
);
}
Widget showPodium1() {
return Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Column(
children: <Widget>[
Container(
height: 20.0.h,
width: 30.0.w,
decoration: BoxDecoration(
color: const Color(0xFFFFFFFF),
borderRadius: BorderRadius.all(Radius.circular(5.0)),
border: Border.all(color: Colors.black),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 2,
blurRadius: 7,
offset: Offset(0, 3),
)
]
),
child: Stack(
children: <Widget>[
Container(
width: 80.0.w,
height: 10.0.h,
decoration: new BoxDecoration(
shape: BoxShape.circle,
image: new DecorationImage(
fit: BoxFit.fitHeight,
image: AssetImage('assets/images/no_image.png'),
)),
),
Container(
height: 10.0.h,
width: 10.0.w,
child:
new Image(
image: AssetImage(
"assets/images/medal_third.png"),
)),
Stack(
alignment: Alignment.center,
children: <Widget>[
Text("Test",
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'Roboto',
color: const Color(0xFF3A404C),
fontSize: 20.0.sp),
textAlign: TextAlign.center,
),
new Align(alignment: Alignment.bottomCenter,
child: Text("Punti",
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'Roboto',
color: const Color(0xFF3A404C),
fontSize: 15.0.sp),
),
),
],
),
]),
)],
),
Column(
children: <Widget>[
Container(
height: 20.0.h,
width: 30.0.w,
decoration: BoxDecoration(
color: const Color(0xFFFFFFFF),
borderRadius: BorderRadius.all(Radius.circular(5.0)),
border: Border.all(color: Colors.black),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 2,
blurRadius: 7,
offset: Offset(0, 3),
)
]
),
child: Stack(
children: <Widget>[
Container(
width: 80.0.w,
height: 10.0.h,
decoration: new BoxDecoration(
shape: BoxShape.circle,
image: new DecorationImage(
fit: BoxFit.fitHeight,
image: AssetImage('assets/images/no_image.png'),
)),
),
Container(
height: 10.0.h,
width: 10.0.w,
child:
new Image(
image: AssetImage(
"assets/images/medal_first.png"),
)),
Stack(
alignment: Alignment.center,
children: <Widget>[
Text("Test",
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'Roboto',
color: const Color(0xFF3A404C),
fontSize: 20.0.sp),
textAlign: TextAlign.center,
),
new Align(alignment: Alignment.bottomCenter,
child: Text("Punti",
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'Roboto',
color: const Color(0xFF3A404C),
fontSize: 15.0.sp),
),
),
],
),
],
)
),
],
),
Column(
children: <Widget>[
Container(
height: 20.0.h,
width: 30.0.w,
decoration: BoxDecoration(
color: const Color(0xFFFFFFFF),
borderRadius: BorderRadius.all(Radius.circular(5.0)),
border: Border.all(color: Colors.black),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 2,
blurRadius: 7,
offset: Offset(0, 3),
)
]
),
child: Stack(
children: <Widget>[
Container(
width: 80.0.w,
height: 10.0.h,
decoration: new BoxDecoration(
shape: BoxShape.circle,
image: new DecorationImage(
fit: BoxFit.fitHeight,
image: AssetImage('assets/images/no_image.png'),
)),
),
Container(
height: 10.0.h,
width: 10.0.w,
child:
new Image(
image: AssetImage(
"assets/images/medal_second.png"),
)),
Stack(
alignment: Alignment.center,
children: <Widget>[
Text(Nick,
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'Roboto',
color: const Color(0xFF3A404C),
fontSize: 20.0.sp),
textAlign: TextAlign.center,
),
new Align(alignment: Alignment.bottomCenter,
child: Text("Punti",
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'Roboto',
color: const Color(0xFF3A404C),
fontSize: 15.0.sp),
),
),
],
),
],
)
),
],
),
],
));
}
Widget showOtherPosition() {
return Card(
margin: EdgeInsets.symmetric(vertical: 4.0.h),
elevation: 0,
color: Colors.transparent,
child: Padding(
padding: EdgeInsets.symmetric(vertical: 0.5.h),
child: Column(
children: <Widget>[
Wrap(
spacing: 5.0,
children: <Widget>[
Container(
height: 10.0.h,
width: 500.0.w,
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: const Color(0xFFFFFFFF),
borderRadius: BorderRadius.all(Radius.circular(10.0)),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 1,
blurRadius: 7,
offset: Offset(0, 3),
)
]
),
),
),
SizedBox(height: 20),
Container(
height: 10.0.h,
width: 500.0.w,
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: const Color(0xFFFFFFFF),
borderRadius: BorderRadius.all(Radius.circular(10.0)),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 1,
blurRadius: 7,
offset: Offset(0, 3),
)
]
),
),
),
SizedBox(height: 20),
Container(
height: 10.0.h,
width: 500.0.w,
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: const Color(0xFFFFFFFF),
borderRadius: BorderRadius.all(
Radius.circular(10.0)),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 1,
blurRadius: 7,
offset: Offset(0, 3),
)
]
),
)),
SizedBox(height: 20),
Container(
height: 10.0.h,
width: 500.0.w,
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: const Color(0xFFFFFFFF),
borderRadius: BorderRadius.all(Radius.circular(10.0)),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 1,
blurRadius: 7,
offset: Offset(0, 3),
)
]
),
),
),
],
)
],
)),
);
}
}
enum _SelectedTab {home, magazine, leaderboard, ProfilePage}
import'package:sizer/sizer.dart';
进口“包装:颤振/材料.省道”;
导入“包:firebase_auth/firebase_auth.dart”;
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:goodgoals_android/pages/home_page.dart”;
导入“package:goodgoals_android/pages/profile_page.dart”;
进口“包装:所罗门底部酒吧/所罗门底部酒吧.省道”;
导入“package:goodgoals_android/services/authentication.dart”;
类soloLeaderboardPage扩展StatefulWidget{
soloLeaderboardPage({Key Key,this.auth,this.userId,this.logoutCallback,this.home})
:super(key:key);
最终BaseAuth-auth;
最终作废回拨注销回拨;
最终字符串用户标识;
最终主页主页;
@凌驾
State createState()=>新建的_soloLeaderboardPageState();
}
类_soloLeaderboardPageState扩展状态{
final _formKey=新的GlobalKey();
final databaseReference=FirebaseFirestore.instance;
final FirebaseAuth _FirebaseAuth=FirebaseAuth.instance;
var _selectedTab=_selectedTab.排行榜;
var Nick=“”;
@凌驾
void initState(){
super.initState();
异步方法();
}
void asyncMethod()异步{
等待GetLeadboard();
}
无效(内部交换){
设置状态(){
_selectedTab=_selectedTab.values[i];
打印(“Valore$i”);
如果(i==0){
导航器。推(
上下文
材料路线(
生成器:(上下文)=>主页(),
));
}
else如果(i==3){
导航器。推(
上下文
材料路线(
生成器:(上下文)=>ProfilePage(),
));
}
else如果(i==2){
导航器。推(
上下文
材料路线(
生成器:(上下文)=>soloLeaderboardPage(),
));
}
});
}
未来的GetLeadboard()异步{
return wait wait FirebaseFirestore.instance
.收藏(“排行榜”)
.orderBy('Score',降序:true)
.限额(7)
.get()
.然后((QuerySnapshot QuerySnapshot)=>{
querySnapshot.docs.forEach((doc){
设置状态(){
尼克=(文件[“分数]);
});
}),
});
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
主体:堆栈(
儿童:[
_showForm(),
]
),
);
}
小部件_showForm(){
退回新货柜(
填充:所有边缘设置(10.0),
儿童:新表格(
键:_formKey,
子:新列表视图(
物理学:const NeverScrollableScrollPhysics(),
收缩膜:对,
儿童:[
leaderbordSelector(),
showPodium1(),
showOtherPosition(),
bottomBarMissic(),
//bottomBarMissic(),
],
),
));
}
Widget-bottomBarMimic(){
返回定位(
宽度:100.0.w,
底部:0,
左:0,,
子:容器(
颜色:颜色,白色,
孩子:所罗门群岛(
currentIndex:_SelectedTab.values.indexOf(_SelectedTab),
onTap:_handleIndexChanged,
项目:[
所罗门水底气压计(
图标:图标(Icons.home),
标题:文本(“主页”),
selectedColor:Colors.purple,
),
所罗门水底气压计(
图标:图标(图标、菜单、书本、锐利),
标题:文本(“杂志”),
selectedColor:Colors.pink,
),
所罗门水底气压计(
图标:图标(图标、条形图),
标题:文本(“排行榜”),
selectedColor:Colors.orange,
),
所罗门水底气压计(
图标:图标(Icons.person),
标题:文本(“简介”),
selectedColor:Colors.teal,
),
],
)),
);
}
Widget leaderbordSelector(){
返回新的填充(
填充:边缘组。对称(垂直:5.0.h,水平:17.0.h),
孩子:排(
儿童:[
图标按钮(
图标:图标(Icons.person,颜色:Colors.blue),
onPressed:(){}
),
图标按钮(
图标:图标(Icons.people),
onPressed:(){}
),
],
),
);
}
小部件showPodium1(){
返回容器(
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
纵队(
儿童:[
容器(
高度:20.0.h,
宽度:30.0.w,
装饰:盒子装饰(
颜色:常量颜色(0xFFFFFF),
borderRadius:borderRadius.all(半径.圆形(5.0)),
边框:边框。全部(颜色:颜色。黑色),
boxShadow:[
箱形阴影(
颜色:颜色。灰色。不透明度(0.5),
扩展半径:2,
半径:7,
偏移量:偏移量(0,3),
var firstName = "";
Future<void> getLeaderboard() async {
return await FirebaseFirestore.instance
.collection("leaderboard")
.orderBy('Score', descending: true)
.limit(7)
.get()
.then((QuerySnapshot querySnapshot) => {
querySnapshot.docs.forEach((doc) {
setState(() {
firstName = (doc["first_name"]);
});
}),
});
}
Text("NICK HERE",...),