Firebase Async ifunction未等待结果

Firebase Async ifunction未等待结果,firebase,function,flutter,dart,async-await,Firebase,Function,Flutter,Dart,Async Await,我正在构建一个颤振应用程序。有注册窗口,当用户输入手机号码时,它会检查是否已经注册。但问题是函数没有等待firebase的结果。如果用户不存在,则函数返回true为false。 但是这里没有返回值 import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.

我正在构建一个颤振应用程序。有注册窗口,当用户输入手机号码时,它会检查是否已经注册。但问题是函数没有等待firebase的结果。如果用户不存在,则函数返回true为false。 但是这里没有返回值

import 'dart:async';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:zshoperretail/otp_verification.dart';


class mobilewindow extends StatelessWidget {
    TextEditingController mobileController=new TextEditingController();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.red,

      body: Center(
        child:Column(
          mainAxisAlignment: MainAxisAlignment.center,
            children:[
        ClipRRect(
        borderRadius: BorderRadius.circular(5),
        child:Container(
          height: 50,
          width: 300,
          color: Colors.white,
        child:TextField(
          maxLength: 10,
          maxLengthEnforced: true,
          controller: mobileController,
          keyboardType: TextInputType.number,
          decoration: InputDecoration(
            border: InputBorder.none,
            hintText:"Mobile Number",
            hintStyle: TextStyle(color: Colors.red),
          ),
        ),),),
        SizedBox(height: 5,),
        ElevatedButton(
          child: Text("Next",style: TextStyle(color: Colors.white),),
          onPressed:() =>saveMobile(context),
        )
            ])
      ),
    );

  }
  saveMobile(BuildContext context) async{
    var mobile= mobileController.text;
    mobile="+91"+mobile;
    var result1='';
    result1=await checkMobile(mobile);
    print('check1'+result1);
    if(result1=='false') {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      await prefs.setString('mobile', mobile);
      Navigator.push(
          context, MaterialPageRoute(builder: (context) => otp_verification()));
    }
    else{
      print(result1);
      showDialog(
          context: context,
          builder: (BuildContext context){
            return AlertDialog(
              title: Text("Error"),
              content: Text("Account already registered.please login."),
              actions: [
                FlatButton(
                  child: Text("Close"),
                  onPressed: (){
                    Navigator.of(context).pop();
                  },
                )
              ],
            );
          }
      );
    }
  }
  Future<String>checkMobile(String mobile) async{
   FirebaseFirestore firestore= FirebaseFirestore.instance;
   var result="";
   firestore.collection('retail_users').doc(mobile).get().then((DocumentSnapshot snapshot)async{
     if(snapshot.exists){
       print("hello");
       result='true';
     }
     else{
       print("hellno");
       result='false';
     }
   });
   return(result);
    }
}
导入'dart:async';
导入“包:cloud_firestore/cloud_firestore.dart”;
进口“包装:颤振/cupertino.dart”;
进口“包装:颤振/材料.省道”;
导入“package:shared_preferences/shared_preferences.dart”;
导入“包装:zshoperretail/otp_verification.dart”;
类MobileWidow扩展了无状态小部件{
TextEditingController mobileController=新的TextEditingController();
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:Colors.red,
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
ClipRRect(
边界半径:边界半径。圆形(5),
子:容器(
身高:50,
宽度:300,
颜色:颜色,白色,
孩子:TextField(
最大长度:10,
马克斯:是的,
控制器:mobileController,
键盘类型:TextInputType.number,
装饰:输入装饰(
边框:InputBorder.none,
hintText:“手机号码”,
hintStyle:TextStyle(颜色:Colors.red),
),
),),),
尺寸箱(高度:5,),
升降按钮(
子项:文本(“下一步”,样式:文本样式(颜色:Colors.white),),
按下:()=>saveMobile(上下文),
)
])
),
);
}
saveMobile(构建上下文)异步{
var mobile=mobileController.text;
mobile=“+91”+mobile;
var result1='';
结果1=等待检查移动设备(移动设备);
打印(“检查1”+结果1);
如果(结果1=='false'){
SharedReferences prefs=等待SharedReferences.getInstance();
等待首选设置字符串(“移动”,移动);
导航器。推(
上下文,MaterialPage路由(生成器:(上下文)=>otp_验证());
}
否则{
打印(结果1);
显示对话框(
上下文:上下文,
生成器:(BuildContext上下文){
返回警报对话框(
标题:文本(“错误”),
内容:文本(“帐户已注册,请登录”),
行动:[
扁平按钮(
子项:文本(“关闭”),
已按下:(){
Navigator.of(context.pop();
},
)
],
);
}
);
}
}
FuturecheckMobile(字符串移动)异步{
FirebaseFirestore=FirebaseFirestore.instance;
var结果=”;
firestore.collection('retail_users').doc(mobile.get()。然后((DocumentSnapshot snapshot)异步{
if(snapshot.exists){
打印(“你好”);
结果='true';
}
否则{
印刷品(“地狱”);
结果为假;
}
});
返回(结果);
}
}
当您调用
.then()
函数时,它将在数据到达时注册要执行的给定函数,因此将
结果
放在回调函数中不是一个好主意。相反,请删除
中的回调函数。然后()
并使用wait

DocumentSnapshot snapshot = await firestore.collection('retail_users').doc(mobile).get();

if(snapshot.exists){
  print("hello");
  result='true';
} else{
  print("hellno");
  result='false';
}

return(result);

使用
FutureBuilder
并为
future
参数提供检查手机号码是否已注册的future函数,这将完成作业FutureBuilder是否用于小部件,对吗?是,将
Scaffold
body
中定义的小部件包装到未来的构建器中。我不想将其包装到小部件中。我只想在函数中执行。。。。。等待firestore。收藏(……这很有用。谢谢。