Redux 省道/颤振-来自回调函数的屈服

Redux 省道/颤振-来自回调函数的屈服,redux,flutter,dart,bloc,Redux,Flutter,Dart,Bloc,我需要进行一个不返回任何内容的函数调用(void)。获得函数完成通知的唯一方法是发送回调函数。 现在我使用BLoC模式以及ReDux,当一个事件被调度时,我将另一个操作调度到ReDux的存储中,在操作完成后,它将调用回调函数。现在在callback函数中,我想更新bloc的状态。下面是我的实现 if (event is Login) { yield currentState.copyWith(formProcessing: true); store.dispatch(authAction

我需要进行一个不返回任何内容的函数调用(
void
)。获得函数完成通知的唯一方法是发送
回调
函数。
现在我使用
BLoC
模式以及
ReDux
,当一个事件被调度时,我将另一个操作调度到
ReDux
的存储中,在
操作
完成后,它将调用
回调
函数。现在在
callback
函数中,我想更新
bloc
状态。下面是我的实现

if (event is Login) {
  yield currentState.copyWith(formProcessing: true);
  store.dispatch(authActions.login(
    currentState.username,
    currentState.password,
    (error, data) {
      print(error);
      print(data);
      // I want to yield here.
      yield currentState.copyWith(formProcessing: false);
    },
  ));
}
如上面的代码片段所示,在回调函数中,我希望
产生

解决方案 创建一个返回未来的函数,并使用回调函数来存储分派,以下是示例

if (event is Login) {
  yield currentState.copyWith(formProcessing: true);

  try {
    dynamic result = await loginAction(store, currentState.username, currentState.password);
    print(result);
    yield currentState.copyWith(formProcessing: false);
  } catch (e) {
    print(e);
  }
}

Future loginAction(store, username, password) {
  var completer = new Completer();

  store.dispatch(authActions.login(
    username,
    password,
    (error, data) {
      if (error != null) {
        completer.completeError(error);
      } else if (data != null) {
        completer.complete(data);
      }
    },
  ));

  return completer.future;
}

您需要在
回调
函数中创建其他
事件
,并
分派
事件
,然后您可以在过滤
事件的函数中执行所需操作

我不知道您集团的目的是什么,但是这个
事件的名称取决于用例,它可以是
UpdateForm
UpdateState
LoggedIn
LoggedOut
,等等。您将找到最具描述性的用例名称

请记住,您还可以使用参数创建此
事件
,例如
UpdateForm(bool isLoggedIn)
,并根据您的条件生成不同的
状态

例如,此
事件的名称为
OtherEvent

if(事件为登录){
屈服currentState.copyWith(formProcessing:true);
store.dispatch(authoctions.login(
currentState.username,
currentState.password,
(错误,数据){
打印(错误);
打印(数据);
调度(OtherEvent());
},
));
}else if(事件为OtherEvent){
//你可以在这里交出你想要的
屈服currentState.copyWith(formProcessing:false);
}

这是一个很好的解决方案,我通过包装我的store.dispatch函数解决了这个问题,该函数返回我一个未来,并等待未来,然后我才能屈服。在Flatter_bloc v1.0.0或更高版本中,您应该使用
add()
方法,而不是
dispatch()
方法。