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抱歉,我更新了我的问题。