Firebase 为什么调用定义在另一个程序中给出的异步函数会返回null或Future<;类型>;第一次作为输出的实例?

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文件中打印全局变量。但是在这里,当我运行程序时,第一次变量有空值,并且在热重新加载时,实际值存储在变量中。请告诉我如何解决这

您好,我非常熟悉颤振框架,所以如果我哪里出了问题,请告诉我,以及做这些事情的适当方式

在这个文件中,我试图调用函数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(),