问题描述
在使用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());