![](/img/trans.png)
[英]How to "yield put" in redux-saga within a callback inside yield?
[英]Dart/Flutter - yield from callback function
我需要進行一個不返回任何內容的函數調用( void
)。 獲得有關函數完成通知的唯一方法是發送callback
函數。
現在我將BLoC
模式與ReDux
一起使用,當一個事件被調度時,我將另一個動作調度到redux
存儲中, action
完成后它調用callback
函數。 現在在callback
函數中,我想更新bloc
的state
。 下面是我的實現,
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
函數中dispatch
此event
,然后您可以在過濾events
的函數中執行您想要的操作。
我不知道您的 BLoC 的目的是什么,但此event
的名稱取決於用例,可以是UpdateForm
、 UpdateState
、 LoggedIn
、 LoggedOut
等。您會找到最適合您的用例的描述性名稱。
請記住,您還可以使用參數創建此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.