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



使用Facebook SignIn登录后,在我的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());

最新更新