簡體   English   中英

Dart/Flutter - 從回調函數中產生

[英]Dart/Flutter - yield from callback function

我需要進行一個不返回任何內容的函數調用( void )。 獲得有關函數完成通知的唯一方法是發送callback函數。
現在我將BLoC模式與ReDux一起使用,當一個事件被調度時,我將另一個動作調度到redux存儲中, action完成后它調用callback函數。 現在在callback函數中,我想更新blocstate 下面是我的實現,

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);
    },
  ));
}

如上面的代碼片段所示,在回調函數中,我想要yield

解決方案

創建一個返回未來的函數並制作回調函數來存儲調度,這里是示例。

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;
}

您需要創建其他event ,並在您的callback函數中dispatchevent ,然后您可以在過濾events的函數中執行您想要的操作。

我不知道您的 BLoC 的目的是什么,但此event的名稱取決於用例,可以是UpdateFormUpdateStateLoggedInLoggedOut等。您會找到最適合您的用例的描述性名稱。

請記住,您還可以使用參數創建此event ,例如UpdateForm (bool isLoggedIn) ,並根據您的條件yield不同的states

例如,此event的名稱是OtherEvent

if (event is Login) {
  yield currentState.copyWith(formProcessing: true);
  store.dispatch(authActions.login(
    currentState.username,
    currentState.password,
    (error, data) {
      print(error);
      print(data);

      dispatch(OtherEvent());
    },
  ));
} else if (event is OtherEvent) {
   // You can yield here what you want
   yield currentState.copyWith(formProcessing: false);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM