繁体   English   中英

flutter 中的异步执行问题

[英]Issue with Asynchronous execution in flutter

在下面的代码中,在第 18 行执行时调用未来的 function readData() 并在其完成执行之前移至第 19 行,即打印语句。 我想在调用 readData() function 之后等待 function 完成其执行并更新标志变量,然后在移动后进一步执行

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/cupertino.dart';
import 'package:udharibook/Screens/SignInPage.dart';
import 'package:udharibook/Screens/UserProfile.dart';
import 'package:udharibook/Screens/dashboard.dart';

class AuthService  {
  bool flag = false;
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final DBRef = FirebaseDatabase.instance.reference().child('Users');

    handleAuth(){
    return StreamBuilder(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext, snapshot) {
        if(snapshot.hasData) {
         readData();
          print(flag);
          if(flag ==true)
            return DashboardPage();
          else
            return UserProfile();
        }
        else {
          return SignIn();
        }
      },
    );
  }

  Future<void> readData() async {
    final FirebaseUser user = await _auth.currentUser();
    final userid = user.uid;
    DBRef.child(userid).once().then((DataSnapshot data){
      print(userid);
      if(data.value!=null)
        {
          flag =  true;
          print(data.key);
          print(data.value);
        }
      else{
        print('User not found');
        flag = false;
      }
    });
  }

  signOut(){
    FirebaseAuth.instance.signOut();
  }

  signIn(AuthCredential authCreds){
    FirebaseAuth.instance.signInWithCredential(authCreds);
  }

  signInWithOTP(smsCode,verId){
    AuthCredential authCreds = PhoneAuthProvider.getCredential(
        verificationId: verId,
        smsCode: smsCode
    );
    signIn(authCreds);
  }
}

使用 FutureBuilder 并让您的readData返回 true 或 false 而不是设置变量。

return StreamBuilder(
  stream: FirebaseAuth.instance.onAuthStateChanged,
  builder: (BuildContext, snapshot) {
    if(snapshot.hasData) {
      return FutureBuilder<String>(
        future: readData(), 
        builder: (BuildContext context, AsyncSnapshot<String> readDataSnapshot) {
          //readDataSnapshot.data will be your true/false from readData()
          if(readDataSnapshot.hasData){
            if(readDataSnapshot.data == true)
              return DashboardPage();
            else
              return UserProfile();
          } else {
            return CircularProgressIndicator(); // or something else while waiting for the future to complete.
          }
        }
      ); 
    } else {
      return SignIn();
    }    
  },
);
Future<bool> readData() async {
    final FirebaseUser user = await _auth.currentUser();
    final userid = user.uid;
    DBRef.child(userid).once().then((DataSnapshot data){
      print(userid);
      if(data.value!=null)
        {
          print(data.key);
          print(data.value);
          return true;
        }
      else{
        print('User not found');
        return false;
      }
    });
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM