如何在小吃店中显示Facebook登录状态?

问题描述

在使用Facebook登录登录后,在我的Flutter应用程序中,如果登录成功但被取消或出现错误,我希望用户转到下一个屏幕,显示带有详细信息的小吃店。如果登录成功,我设法将用户移至下一个屏幕,但显示小吃栏时遇到问题。

这是我的代码

class LoginScreen extends StatefulWidget {

  static const routeName = 'login_screen';

  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final _key = GlobalKey<ScaffoldState>();
  final FacebookAppSignIn facebookAppSignIn = FacebookAppSignIn();
  
  @override
  Widget build(BuildContext context) {
    ScreenData().init(context);
    return Scaffold(
      key: _key,extendBodyBehindAppBar: true,body: SingleChildScrollView(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
           
            Container(
              height: ScreenData.screenHeight,// width: ScreenData.screenWidth,color: Colors.grey,child: Stack(
                fit: StackFit.expand,children: <Widget>[
                  
// Facebook login button
                      Button.signInoption(
                          onpressed: () {
                            facebookAppSignIn.fbLogin().whenComplete(() {
                              Navigator.of(context).push(
                                MaterialPageRoute(
                                  builder: (context) {
                                    
                                    return _buildFacebook(facebookAppSignIn.fbResult.status);
                                  },),);
                            });
                            
                          },buttonColor: AppColors.blue,iconData: FontAwesomeIcons.facebookF,context: context,label: 'Sign Up With Facebook',labelSize: 15,labelColor: Colors.white,borderRadius: 28),],);
  }

  showSnackbar() {
    _key.currentState.showSnackBar(SnackBar(
      content: Text('Please check internet connection'),duration: Duration(seconds: 7),));

  }

  _buildFacebook(FacebookLoginStatus stat) {
    
    switch (stat) {
      case FacebookLoginStatus.loggedIn:
      print('_buildFacebook - user is welcome');
      return LandingScreen();
      
      case FacebookLoginStatus.cancelledByUser:
      print('_buildFacebook - cancelled  by  user');
      return LoginScreen();
      
      case FacebookLoginStatus.error: 
      return LoginScreen(); 
        break; 
        
      default: print('facebook login issue');
    }
  }
}

我考虑过通过检查Facebook登录状态的值在initState显示SnackBar,但是我意识到在第一个屏幕构建中它将为null,因此会出现错误。我该怎么办?

解决方法

使用then和catchError代替whenComplete:https://dart.dev/guides/libraries/futures-error-handling

然后,在catchError内部处理任何预期的响应,在setState内部调用showSnackbar函数。

setState(()=>showSnackbar());

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...