授权后如何获取用户数据

时间:2019-09-15 13:51:56

标签: flutter authorization bloc

我在扑朔迷离中挣扎着。我的逻辑部分在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 的新手,这就是我迷路的原因。请指导我。在此先感谢:)

1 个答案:

答案 0 :(得分:1)

有两种方法可以存储数据或进行数据管理。一种方法是从小部件传递到小部件。 Pass down to widget

另一种方法是在一个位置存储和检索所有数据。 Single source of truth

这是两种方式。对于第一种方法,可以将statefulWidgets与setState一起使用。如果您有大型或可伸缩的应用程序,则不建议采用这种方式。

使用第二种方法,有多种存储数据的方法,例如redux,BLoC / Rx,Provider或MobX。 Flutter建议使用provider方法进行操作。该文档是一个很好的地方,它以一种非常清晰的方式确切地说明了如何进行操作:docs

如果您有任何疑问,请告诉我。