1

一旦我的用户登录成功并且我有一个 Firebase 用户,我想通过调度一个进行异步调用以获取配置文件的操作来检查我的服务器上是否已经创建了一个配置文件。

如果没有返回个人资料,我想将应用导航到个人资料创建页面,否则,加载个人资料页面。

我正在考虑在登录中间件中调度第二个操作,但是在登录中间件中混合配置文件和登录代码似乎很奇怪。

有没有更好的方法或更标准的方法来做我想做的事情?

我没有尝试过任何事情,但我正在考虑在登录中间件中调度第二个操作并从那里导航到所需的页面。

ThunkAction<AppState> logIn = (Store<AppState> store) async {
  store.dispatch(UserLoginAction());

  try {
    final GoogleSignIn _googleSignIn = new GoogleSignIn();
    GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    GoogleSignInAuthentication googleAuth = await googleUser.authentication;

    final FirebaseAuth _auth = FirebaseAuth.instance;
    final FirebaseUser _fb = await _auth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );

    User user = new User(id: _fb.uid, name: _fb.displayName, email: _fb.email, photoUrl: _fb.photoUrl);
    store.dispatch(UserLoginSuccessAction(user: user));

    store.dispatch(GetProfileAction());

    Profile profile = await ProfileService.get().getProfile(_fb.uid);

    store.dispatch(GetProfileSuccessAction(profile: profile));

    if (profile) {
      // Navigate to Profile Page
    } else {
      // Navigate to Profile Creation Page
    }

  } catch(error) {
    store.dispatch(UserLoginFailAction(error: error));
  }
};

编辑:我只是想到了一种比我之前的建议更好的方法。

如果成功登录后我只是将它们导航到个人资料页面怎么办。在配置文件页面的初始位置上,我将发送操作以获取配置文件。Profile 页面将根据中间件和 reducer 完成后是否在 AppState 中初始化 Profile 来呈现不同的内容。

这似乎可以做还是有不同的更好的方法?

4

1 回答 1

1

在ProfilePageGetProfileAction()onInit.

由于以下原因,您建议的第二个解决方案更合适:

  1. Redux 鼓励功能之间完全分离。每个不同的功能都应该尽可能地不同:您不想将属于登录的操作与属于配置文件的操作混合在一起。这使得在 Redux 架构中编写的应用程序非常易于维护,可以轻松完成转换或替换功能。想象一下,如果有一天您的应用决定删除登录功能。这种代码分离将大大减少所需的更改。
  2. 使用主触发器来调度一个动作。在调度一个动作之前,你应该问自己启动这个动作的主要原因是什么?在这种情况下,是成功登录还是主要触发获取用户配置文件的配置文件页面初始化?我个人认为我们应该总是在配置文件页面加载时发送获取用户的配置文件,因为这个页面完全依赖于从这个操作中检索到的数据。想一想,如果 Profile 页面由于登录以外的其他原因而被初始化,会发生什么?尽管该州的个人资料数据不可用,但您的应用最终将强制构建个人资料页面。
  3. 可作为刷新操作重用。我假设用户的个人资料数据不断变化,需要不断更新。这应该至少在重新加载或重新初始化配置文件页面时完成。您不希望用户注销并重新登录应用程序以发送获取用户的个人资料数据,对吗?是的,您可以在多个不同的地方发送相同的操作,但将其保持在最低限度是理想的。
于 2019-05-29T11:09:32.177 回答