Flutter 为什么我在StreamBuilder中获得connectionState.done之后的另一个connectionState类型?
我已经创建了一个Flutter 为什么我在StreamBuilder中获得connectionState.done之后的另一个connectionState类型?,flutter,dart,Flutter,Dart,我已经创建了一个StreamController来处理身份验证。我在登录完成后订阅用户。所以我为它创建了一个类: 类AuthAPI{ 最终FacebookLogin FacebookLogin=FacebookLogin(); 最终Dio_Dio=Dio(); 最终StreamController _authStatusController=StreamController.broadcast(); Stream get-onAuthStatusChanged=>\u authStatusCon
StreamController
来处理身份验证。我在登录完成后订阅用户。所以我为它创建了一个类:
类AuthAPI{
最终FacebookLogin FacebookLogin=FacebookLogin();
最终Dio_Dio=Dio();
最终StreamController _authStatusController=StreamController.broadcast();
Stream get-onAuthStatusChanged=>\u authStatusController.Stream;
//Facebook登录
Future facebookSignIn()异步{
FacebookLoginResult结果=等待facebookLogin.logIn(['public_profile','email']);
开关(结果状态){
案例FacebookLoginStatus.loggedIn:
返回_sendFacebookUserDataToAPI(结果);
案例FacebookLoginStatus.error:
返回null;
case FacebookLoginStatus.Cancelled By用户:
打印(“已取消”);
返回null;
违约:
返回null;
}
}
//注销
void signOut()异步{
facebookLogin.logOut();
_authStatusController.sink.add(空);
_authStatusController.close();
}
Future\u sendFacebookUserDataToAPI(FacebookLoginResult结果)异步{
最终字符串facebookToken=result.accessToken.token;
最终响应图响应=等待_dio.get(
'https://graph.facebook.com/v4.0/me?fields='
'名字、姓氏、电子邮件、图片高度(200)和访问令牌=$facebookToken');
最终配置文件=jsonDecode(graphResponse.data);
ApiProvider=ApiProvider();
UserSocialAuth UserSocialAuth=UserSocialAuth(
firstName:profile['first_name'],
lastName:profile['last_name'],
电子邮件:个人资料['email'],
提供商:“facebook”,
providerUserId:profile['id']
);
Map socialSignIn=wait apiProvider.socialSignIn(userSocialAuth);
用户;
if(socialSignIn.containsKey('access_token')){
Map userData=wait apiProvider.currentUser(socialSignIn['access_token']);
user=user.fromJson(userData['data']);
setAccessToken(socialSignIn['access_token']);
_authStatusController.sink.add(用户);
打印(“登录成功”);
}否则{
_authStatusController.sink.addError(socialSignIn['error']);
}
_authStatusController.close();
返回用户;
}
}
这是我的StreamBuilder
:
返回StreamBuilder(
流:userBloc.authStatus,
生成器:(BuildContext上下文,异步快照){
打印(快照.连接状态);
交换机(快照.连接状态){
案例连接状态.active:
User=snapshot.data;
if(user==null){
返回信号ignUpscreen();
}
返回\u showHomeUI(用户、快照);
案例连接状态。完成:
User=snapshot.data;
if(user==null){
返回信号ignUpscreen();
}
打印(用户);
返回\u showHomeUI(用户、快照);
违约:
返回中心(子项:CircularProgressIndicator());
}
}
);
因此,当我登录时,它会显示一个循环进程指示器
,如果身份验证成功,那么它必须显示主屏幕。但是,它仍然显示登录屏幕,当我打印connectionState
的输出时,我看到在connectionState.done
之后,connectionState
传递到connectionState.waiting
,我不知道为什么
以下是控制台的输出:
当它到达最后一个
连接状态.done
时,它没有数据。您正在调用\u authStatusController.close()
在\u sendFacebookUserDataToAPI
方法的末尾–这意味着底层流已完成,流侦听器进入“完成”状态
您应该在
AuthAPI
类中创建例如dispose()
方法,并在那里调用\u authStatusController.close()
。当不再需要AuthAPI
时,应调用此方法。您正在调用\u authStatusController.close()
在\u sendFacebookUserDataToAPI
方法的末尾–这意味着底层流已完成,流侦听器进入“完成”状态
您应该在
AuthAPI
类中创建例如dispose()
方法,并在那里调用\u authStatusController.close()
。当不再需要AuthAPI
时,应调用此方法。当您从代码中删除print()语句时,很难遵循工作流。@Marc抱歉,我更新了我的问题。当您从代码中删除print()语句时,很难遵循工作流。@Marc抱歉,我更新了我的问题。