【问题标题】:How to dispatch multiple async actions that are based on the result of another async action?如何调度基于另一个异步操作的结果的多个异步操作?
【发布时间】:2019-05-29 04:36:56
【问题描述】:

一旦我的用户登录成功并且我有一个 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 而呈现不同。

这看起来可以吗,还是有其他更好的方法?

【问题讨论】:

  • @pskink 感谢您提供的链接,我会检查一下,但我正在寻找如何以 redux 方式执行此操作。我希望异步调用通过中间件来更新 AppState 并让应用导航到它需要的位置。我觉得目前我的逻辑与我的方法分离得很差。

标签: redux flutter dart redux-thunk flutter-redux


【解决方案1】:

在 ProfilePage 的 onInit 上发送 GetProfileAction()

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

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

【讨论】:

  • 这一切都很有道理,谢谢。他们有点依赖,因为我需要 Firebase 用户 ID 来检查他们在数据库中是否有配置文件。我真正想要的是分离个人资料创建页面和个人资料页面本身。登录后,如果用户在数据库中没有个人资料,那么我想将他们带到创建页面,否则到个人资料页面。现在我能想到的唯一方法是拥有一个个人资料页面,并在我在 init 中调度操作后根据用户是否有个人资料来加载不同的内容。我觉得必须有更好的方法。
  • 是的,这是代码架构设计的艺术。没有一个正确的答案。您需要做的就是试验和观察哪种架构更容易适应需求的变化。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2021-07-09
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多