我在扑朔迷离中挣扎着。我的逻辑部分在Authorization bloc中,UI在Authorization屏幕中,仅调用此方法。我已经通过Firebase的电话号码获得了授权。
一切正常,经过验证,我得到了用户响应,访问和刷新令牌。之后,我需要根据此用户响应推送到另一个屏幕。如果我已经获得授权,那么我的个人资料数据响应将被填写,然后将其推送到主屏幕。
但是,当我是新用户时,用户响应数据将为空,因此,我需要推送至“个人资料”屏幕,在其中填写我的名,姓氏和电子邮件。那么如何在UI屏幕上检查我的数据呢?
这是我的代码
授权组中的登录方法
Future<bool> signIn(String smsCode) async {
dynamic userInfo;
String firstName;
String lastName;
String email;
bool result = true;
AuthCredential authCredential = PhoneAuthProvider.getCredential(verificationId: this._verificationId, smsCode: smsCode);
final FirebaseUser user = await FirebaseAuth.instance.signInWithCredential(authCredential);
final FirebaseUser currentUser = await FirebaseAuth.instance.currentUser();
assert(user.uid == currentUser.uid);
final String idToken = await currentUser.getIdToken(refresh: true);
_api.validateIdToken(idToken).then((response) {
final model = new CustomerModel.fromJson(response);
String password = response["password"];
_api.getAccessToken(_phoneNumber, password).then((dynamic response2) {
_accessToken = response2["access_token"];
_refreshToken = response2["refresh_token"];
});
});
if(firstName ==null && lastName == null && email == null){
return false;
}
return result;
}
在我的授权屏幕
中调用该方法void _doLogin() {
FocusScope.of(context).requestFocus(FocusNode());
if (pinCode.length < 6) {
_scaffoldKey.currentState.showSnackBar(
SnackBar(
duration: Duration(seconds: 3),
content: Text('Пожалуйста введите код'),
),
);
} else {
Fluttertoast.showToast(
msg: "Авторизация...$pinCode",
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
timeInSecForIos: 3,
backgroundColor: Colors.grey,
textColor: Colors.white,
fontSize: 13.0
);
bloc.signIn(pinCode).then((hasProfile){
print(hasProfile);
if(hasProfile){
Navigator.push(context,MaterialPageRoute(builder: (context) => ProfileData()));
}else {
Navigator.push(context, MaterialPageRoute(builder: (context) => HomeScreen()));
}
});
}
}
如您所见,我这样称呼bloc.signIn(pinCode).then((hasProfile){...
,但之后的条件不起作用。因此,我认为也许我需要更新状态或使用流或接收器。.我只是 bloc 的新手,这就是我迷路的原因。请指导我。在此先感谢:)
答案 0 :(得分:1)
有两种方法可以存储数据或进行数据管理。一种方法是从小部件传递到小部件。 Pass down to widget
另一种方法是在一个位置存储和检索所有数据。 Single source of truth
这是两种方式。对于第一种方法,可以将statefulWidgets与setState一起使用。如果您有大型或可伸缩的应用程序,则不建议采用这种方式。
使用第二种方法,有多种存储数据的方法,例如redux,BLoC / Rx,Provider或MobX。 Flutter建议使用provider方法进行操作。该文档是一个很好的地方,它以一种非常清晰的方式确切地说明了如何进行操作:docs
如果您有任何疑问,请告诉我。