Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 使用未在颤振中工作的流检查身份验证状态_Firebase_Flutter_Firebase Authentication_Google Signin - Fatal编程技术网

Firebase 使用未在颤振中工作的流检查身份验证状态

Firebase 使用未在颤振中工作的流检查身份验证状态,firebase,flutter,firebase-authentication,google-signin,Firebase,Flutter,Firebase Authentication,Google Signin,我正在使用谷歌登录 在我的启动屏幕上,我使用StreamBuilder检查用户是否登录,并根据该数据尝试显示登录屏幕或主屏幕 当我卸载并重新安装应用程序时,它会第一次显示登录屏幕。之后,即使我从应用程序注销,它也会始终显示主屏幕 下面是我的启动屏幕代码: 类SplashScreen扩展StatefulWidget{ @凌驾 _SplashScreenState createState()=>\u SplashScreenState(); } 类的状态扩展了状态{ @凌驾 小部件构建(构建上下文)

我正在使用
谷歌登录

在我的启动屏幕上,我使用
StreamBuilder
检查用户是否登录,并根据该数据尝试显示登录屏幕或主屏幕

当我卸载并重新安装应用程序时,它会第一次显示登录屏幕。之后,即使我从应用程序注销,它也会始终显示主屏幕

下面是我的
启动屏幕代码

类SplashScreen扩展StatefulWidget{
@凌驾
_SplashScreenState createState()=>\u SplashScreenState();
}
类的状态扩展了状态{
@凌驾
小部件构建(构建上下文){
SizeConfig().init(上下文);
返回流生成器(
流:FirebaseAuth.instance.authStateChanges(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
打印(snapshot.hasData);
返回动画飞溅屏幕(
splashIconSize:SizeConfig.blockSizeVertical*16,
splashTransition:splashTransition.fadeTransition,
下一屏幕:主屏幕(),
splash:kLogoImage,
持续时间:800,
);
}否则{
打印(snapshot.hasData);
返回动画飞溅屏幕(
splashIconSize:SizeConfig.blockSizeVertical*16,
splashTransition:splashTransition.fadeTransition,
nextScreen:loginsScreen(),
splash:kLogoImage,
持续时间:800,
);
}
},
);
}
}
下面是我的
主屏幕代码:

类主屏幕扩展StatefulWidget{
@凌驾
_HomeScreenState createState()=>\u HomeScreenState();
}
类_homescrenstate扩展状态{
最终谷歌签名谷歌签名=谷歌签名();
用户firebaseUser;
signOut()异步{
等待Google登录。注销();
Navigator.pushreplacementname(上下文,MyRoutes.loginScreen);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
居中(
child:Text('Hello'),
),
材料按钮(
子项:文本(“注销”),
颜色:颜色,红色,
已按下:(){
签出();
})
],
),
);
}
}

我不知道为什么它不起作用,我认为您的代码是正确的,但我有另一种方法,您可以使用流提供程序而不是流生成器

将流提供程序包装在材质应用程序或cupirtinoapp上方:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider.value(
      value: firebaseauht.inistance.onauthchange,
      child: MaterialApp(
        home: Wholescreen(),
      ),
    );
  }
}
然后在屏幕中呼叫提供商:

class Wholescreen extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    var provider = Provider.of<User>(context);
    if (provider!=null) {
      return AnimatedSplashScreen(
            splashIconSize: SizeConfig.blockSizeVertical * 16,
            splashTransition: SplashTransition.fadeTransition,
            nextScreen: HomeScreen(),
            splash: kLogoImage,
            duration: 800,
    } else {
      return AnimatedSplashScreen(
            splashIconSize: SizeConfig.blockSizeVertical * 16,
            splashTransition: SplashTransition.fadeTransition,
            nextScreen: LoginScreen(),
            splash: kLogoImage,
            duration: 800,
          ); 
    }
  }
}
类完整屏幕扩展小部件{
@凌驾
小部件构建(构建上下文){
var provider=provider.of(上下文);
if(提供程序!=null){
返回动画飞溅屏幕(
splashIconSize:SizeConfig.blockSizeVertical*16,
splashTransition:splashTransition.fadeTransition,
下一屏幕:主屏幕(),
splash:kLogoImage,
持续时间:800,
}否则{
返回动画飞溅屏幕(
splashIconSize:SizeConfig.blockSizeVertical*16,
splashTransition:splashTransition.fadeTransition,
nextScreen:loginsScreen(),
splash:kLogoImage,
持续时间:800,
); 
}
}
}

谷歌登录是否与Firebase不同

尝试在
主屏幕上用
FirebaseAuth.instance.signOut()
替换
googleSignIn.signOut()

  signOut() async {
    await googleSignIn.signOut();
    Navigator.pushReplacementNamed(context, MyRoutes.loginScreen);
  }
为此:

  signOut() async {
    await googleSignIn.disconnect();
    Navigator.pushReplacementNamed(context, MyRoutes.loginScreen);
  }

根据文档,该方法是撤销身份验证/注销用户的方法。

我尝试了此方法。但它不起作用。我很高兴您的问题得到解决,但为什么您同时使用和?我不知道
googlesign.signOut()
有什么问题,但将其替换为
FirebaseAuth.instance.signOut()
解决了这个问题。可能是因为
googleSignIn.signOut()
没有更新
authStateChanges()
流。但是在
FirebaseAuth.instance.signOut()
方法的文档中说FirebaseAuth的
signOut
方法更新了
authStateChanges()
stream。这可能是faliure的原因。我想在我的应用程序中使用
GoogleSignIn
。但我还需要其他数据,如
currentUser
profilePhoto
等等。这可以通过FirebaseAuth实现。所以我正在使用它。如果你想让你的用户只使用他们的Google帐户登录,请使用
GoogleSign\u in
如果您想提供“使用谷歌登录”以及更多登录选项(使用苹果登录、使用facebook登录、传统电子邮件/密码等),请使用
firebase\u-auth
并摆脱
google\u-sign\u
。仅供参考:如果您计划在iOS应用商店上发布应用程序并实施“使用谷歌登录”,您还必须使用apple as实现登录。它要求我提供
initialData
。我应该在那里放什么?