Firebase 为什么调用定义在另一个程序中给出的异步函数会返回null或Future<;类型>;第一次作为输出的实例?
您好,我非常熟悉颤振框架,所以如果我哪里出了问题,请告诉我,以及做这些事情的适当方式 在这个文件中,我试图调用函数getData从firebase检索数据,这个函数位于Database.dart文件中 在Database.dart文件中,我编写了getData函数,在该函数中,我从firebase检索特定记录并存储在全局变量中。然后我试着在DroperPage.dart文件中打印全局变量。但是在这里,当我运行程序时,第一次变量有空值,并且在热重新加载时,实际值存储在变量中。请告诉我如何解决这个问题 抽屉页Firebase 为什么调用定义在另一个程序中给出的异步函数会返回null或Future<;类型>;第一次作为输出的实例?,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,您好,我非常熟悉颤振框架,所以如果我哪里出了问题,请告诉我,以及做这些事情的适当方式 在这个文件中,我试图调用函数getData从firebase检索数据,这个函数位于Database.dart文件中 在Database.dart文件中,我编写了getData函数,在该函数中,我从firebase检索特定记录并存储在全局变量中。然后我试着在DroperPage.dart文件中打印全局变量。但是在这里,当我运行程序时,第一次变量有空值,并且在热重新加载时,实际值存储在变量中。请告诉我如何解决这
import 'package:attendee/constants.dart';
import 'package:attendee/models/userdeails.dart';
import 'package:attendee/pages/profile.dart';
import 'package:attendee/services/authentication_service.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:attendee/services/database.dart';
import 'package:provider/provider.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:attendee/pages/userdetails.dart';
class StudentDashboard extends StatefulWidget {
@override
_StudentDashboardState createState() => _StudentDashboardState();
}
class _StudentDashboardState extends State<StudentDashboard> {
userdetails userdetail;
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final AuthenticationService _auth = AuthenticationService();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
DatabaseService().getData('email');
final drawerHeader = UserAccountsDrawerHeader(
accountName: Text(userName),
accountEmail: Text('${result}'),
currentAccountPicture
: CircleAvatar(
child: FlutterLogo(size: 42.0),
backgroundColor: Colors.white,
);
final drawerItems = ListView(
children: <Widget>[
drawerHeader,
ListTile(
title: Row(
children: <Widget>[
Icon(Icons.perm_identity_outlined),
Text(' Profile'),
],
),
onTap: () => Navigator.of(context).push(MaterialPageRoute(builder: (context)=>Profile())),
),
ListTile(
title: Text('To page 2'),
onTap: () => Navigator.of(context).push(_NewPage(2)),
),
ListTile(
title:Row(
children: <Widget>[
Icon(Icons.exit_to_app_rounded),
Text(' Logout'),
],
),
onTap: () async {
await _auth.signOut();
Navigator.of(context).pushNamed('/homepage');
},
),
],
);
return StreamProvider<List<userdetails>>.value(
value: DatabaseService().students,
initialData: [],
child: SafeArea(
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.lightGreen,
title: Text('Student Welcome'),
actions: <Widget>[
TextButton.icon(
onPressed: () async {
await _auth.signOut();
Navigator.of(context).pushNamed('/homepage');
},
icon: Icon(Icons.person),
label: Text('Logout'))
],
),
body:
UserDetails(),
drawer: GestureDetector(
onTap: display,
child: Drawer(
child: drawerItems,
),
),
),
),
);
}
display() async{
await DatabaseService().getData('email');
}
}
// <Null> means this route returns nothing.
class _NewPage extends MaterialPageRoute<Null> {
_NewPage(int id)
: super(builder: (BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Page $id'),
elevation: 1.0,
),
body: Center(
child: Text('Page $id'),
),
);
});
}
import'package:attendee/constants.dart';
导入“package:attendee/models/userdeails.dart”;
导入“package:attendee/pages/profile.dart”;
导入“package:attendee/services/authentication_service.dart”;
导入“包:firebase_auth/firebase_auth.dart”;
进口“包装:颤振/材料.省道”;
导入“包:attendee/services/database.dart”;
导入“包:provider/provider.dart”;
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“package:attendee/pages/userdetails.dart”;
类StudentDashboard扩展StatefulWidget{
@凌驾
_StudentDashboardState createState()=>\u StudentDashboardState();
}
类\u StudentDashboardState扩展状态{
用户详细信息用户详细信息;
final FirebaseAuth _FirebaseAuth=FirebaseAuth.instance;
最终AuthenticationService_auth=AuthenticationService();
@凌驾
void initState(){
super.initState();
}
@凌驾
小部件构建(构建上下文){
DatabaseService().getData('email');
最终抽屉阅读器=用户帐户抽屉阅读器(
accountName:文本(用户名),
accountEmail:Text(“${result}”),
当前帐户图片
:CircleAvatar(
儿童:标志(尺寸:42.0),
背景颜色:Colors.white,
);
最终版本MS=ListView(
儿童:[
付款人,
列表砖(
标题:世界其他地区(
儿童:[
图标(图标、永久标识),
文本('Profile'),
],
),
onTap:()=>Navigator.of(context).push(MaterialPageRoute(builder:(context)=>Profile()),
),
列表砖(
标题:正文(“至第2页”),
onTap:()=>Navigator.of(context).push(_NewPage(2)),
),
列表砖(
标题:世界其他地区(
儿童:[
图标(图标。退出到应用程序),
文本(‘注销’),
],
),
onTap:()异步{
等待_auth.signOut();
Navigator.of(context.pushNamed('/homepage');
},
),
],
);
返回StreamProvider.value(
值:DatabaseService()。学生,
初始数据:[],
儿童:安全区(
孩子:脚手架(
appBar:appBar(
背景颜色:颜色。浅绿色,
标题:文本(“学生欢迎”),
行动:[
TextButton.icon(
onPressed:()异步{
等待_auth.signOut();
Navigator.of(context.pushNamed('/homepage');
},
图标:图标(Icons.person),
标签:文本(“注销”)
],
),
正文:
UserDetails(),
抽屉:手势检测器(
onTap:显示,
孩子:抽屉(
孩子:是的,
),
),
),
),
);
}
display()异步{
等待DatabaseService().getData(“电子邮件”);
}
}
//意味着这条路线什么也不返回。
类_NewPage扩展了MaterialPage路由{
_新页(int-id)
:super(生成器:(BuildContext上下文){
返回脚手架(
appBar:appBar(
标题:文本($id页),
标高:1.0,
),
正文:中(
子项:文本('Page$id'),
),
);
});
}
数据库.dart
import 'package:attendee/models/userdeails.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import '../constants.dart';
class DatabaseService{
final String uid;
DatabaseService({this.uid});
//collection reference
final CollectionReference user_details=FirebaseFirestore.instance.collection('users');`
final CollectionReference tutor_details` `=FirebaseFirestore.instance.collection("tutors");`
Future updateStudentData(String fullname,String mobilenumber,String `email,String rollno,String tutorid,String role) async {`
return await user_details.doc(uid).set({
'fullname' : fullname,
'mobilenumber': mobilenumber,
'email' : email,
'rollno': rollno,
'tutorid': tutorid,
'role' : role,//FMERT series
});
}
Future updateTutorData(String fullname,String mobilenumber,String `email,String rollno,String tutorid,String role) async {`
return await tutor_details.doc(uid).set({
'fullname' : fullname,
'mobilenumber': mobilenumber,
'email' : email,
'rollno': rollno,
'tutorid': tutorid,
'role' : role,//FMERT series
});
}
//studentDetails from snapshot
List<userdetails> _studentDetailsFromSnapshot(QuerySnapshot snapshot){
return snapshot.docs.map((doc){
return userdetails(
fullname: doc.data()['fullname'] ?? '',
mobilenumber: doc.data()['mobilenumber'] ?? '',
email: doc.data()['email'] ?? '',
rollno: doc.data()['rollno'] ?? '',
tutorid: doc.data()['tutorid'] ?? '',
//role: doc.data()['role'] ?? '',
);
}).toList();
}
//get students stream
Stream<List<userdetails>> get students {
return user_details.snapshots()
.map(_studentDetailsFromSnapshot);
}
//tutorsDetails from snapshot
List<userdetails> _tutorDetailsFromSnapshot(QuerySnapshot snapshot){
return snapshot.docs.map((doc){
return userdetails(
fullname: doc.data()['fullname'] ?? '',
mobilenumber: doc.data()['mobilenumber'] ?? '',
email: doc.data()['email'] ?? '',
rollno: doc.data()['rollno'] ?? '',
tutorid: doc.data()['tutorid'] ?? '',
);
}).toList();
}
//get tutors stream
Stream<List<userdetails>> get tutors {
return user_details.snapshots()
.map(_studentDetailsFromSnapshot);
}
void display() {
tutor_details.get().then((querySnapshot) {
querySnapshot.docs.forEach((result) {
print(result.data());
});
});
}
getData (String string) async{
String userId = await FirebaseAuth.instance.currentUser.uid;
final document = isTutor ? `FirebaseFirestore.instance.doc('tutors/$userId') :`
await FirebaseFirestore.instance.doc('users/$userId');
document.get().then((DocumentSnapshot) async {
if(string =='role') {
checkRole = DocumentSnapshot.data()[string].toString();
print('$checkRole inside getData Function');
//return checkRole;
print(checkRole);
}
else {
print(result);
result = await DocumentSnapshot.data()[string].toString();
print('${DocumentSnapshot.data()[string].toString()} in the `database else block');`
//return result;
}
//print(document("name"));
});
}
}
Future<bool> getData (String string) async{
String userId = await FirebaseAuth.instance.currentUser.uid;
final document = isTutor ? `FirebaseFirestore.instance.doc('tutors/$userId') :`
await FirebaseFirestore.instance.doc('users/$userId');
document.get().then((DocumentSnapshot) async {
if(string =='role') {
checkRole = DocumentSnapshot.data()[string].toString();
print('$checkRole inside getData Function');
//return checkRole;
print(checkRole);
return true;
}
else {
print(result);
result = await DocumentSnapshot.data()[string].toString();
print('${DocumentSnapshot.data()[string].toString()} in the `database else block');`
//return result;
return false;
}
//print(document("name"));
});
}
}
import'包:attendee/models/userdeails.dart';
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:firebase_auth/firebase_auth.dart”;
进口“包装:颤振/材料.省道”;
导入“包:颤振图标/颤振图标.dart”;
导入“../constants.dart”;
类数据库服务{
最后一个字符串uid;
数据库服务({this.uid});
//收藏参考
final CollectionReference user_details=FirebaseFirestore.instance.collection('users')`
final CollectionReference tutors_details``=FirebaseFirestore.instance.collection(“tutors”)`
Future updateStudentData(字符串全名、字符串mobilenumber、字符串`email、字符串rollno、字符串教程、字符串角色)异步{`
return wait user_details.doc(uid).set({
“全名”:全名,
“mobilenumber”:mobilenumber,
“电子邮件”:电子邮件,
“rollno”:rollno,
“教程”:教程,
“角色”:角色,//FMERT系列
});
}
Future updateTutorData(字符串全名、字符串mobilenumber、字符串`email、字符串rollno、字符串教程、字符串角色)异步{`
return wait tutor_details.doc(uid).set({
“全名”:全名,
“mobilenumber”:mobilenumber,
“电子邮件”:电子邮件,
“rollno”:rollno,
“教程”:教程,
“角色”:角色,//FMERT系列
});
}
//来自快照的studentDetails
列表\u来自快照的学生详细信息(QuerySnapshot快照){
返回snapshot.docs.map((doc){
返回用户详细信息(
全名:doc.data(),
mobilenumber:doc.data()['mobilenumber']??“,
电子邮件:doc.data(),
rollno:doc.data()['rollno']??“,
tutorid:doc.data()['tutorid']??',
//角色:doc.data(),
/// create a new variable.
bool _loadOnce = true;
/// shift your code `DatabaseService().getData('email');`
@override
void didChangeDependencies() {
if(_loadOnce == true) {
DatabaseService().getData('email').then((value) {
if(value == true){
setState(() {
_loadOnce = false;
});
} else {
/// you can write your code here
setState(() {
_loadOnce = false;
});
}
)}
}
super.didChangeDependencies();
}
/// in your main page under Scaffold
body: _loadOnce == true
? Center(
child: CircularProgressIndicator(
backgroundColor: Theme.of(context).primaryColor,
),
)
: UserDetails(),