名称: asyncredux-dispatching-actions
描述: 使用所有可用方法分发动作:dispatch(), dispatchAndWait(), dispatchAll(), dispatchAndWaitAll(), 和 dispatchSync()。涵盖从widgets通过context extensions和其他动作内部的分发。
分发动作
AsyncRedux的基本原则是:更改应用程序状态的唯一方法是分发动作。 您可以从widgets(通过context extensions)或其他动作内部进行分发。
五种分发方法
1. dispatch()
标准方法,立即返回。对于同步动作,状态在返回前更新;对于异步动作,过程开始并在稍后完成。
dispatch(MyAction());
2. dispatchAndWait()
返回一个Future,当动作完成且状态改变时完成,无论动作是同步还是异步。返回一个ActionStatus对象。
var status = await dispatchAndWait(MyAction());
if (status.isCompletedOk) {
Navigator.pop(context);
}
3. dispatchAll()
并行分发多个动作,返回分发的动作列表。
dispatchAll([BuyAction('IBM'), SellAction('TSLA')]);
4. dispatchAndWaitAll()
并行分发动作并等待所有完成。
await dispatchAndWaitAll([
BuyAction('IBM'),
SellAction('TSLA'),
]);
5. dispatchSync()
类似dispatch(),但如果动作是异步的则抛出StoreException。在必须同步执行时使用。
dispatchSync(MyAction());
从Widgets分发
所有分发方法都可用作BuildContext扩展:
context.dispatch(Action());
context.dispatchAll([Action1(), Action2()]);
await context.dispatchAndWait(Action());
await context.dispatchAndWaitAll([Action1(), Action2()]);
context.dispatchSync(Action());
按钮实现示例:
ElevatedButton(
onPressed: () => context.dispatch(Increment()),
child: Text('Increment'),
)
对于回调中的异步分发:
ElevatedButton(
onPressed: () async {
var status = await context.dispatchAndWait(SaveAction());
if (status.isCompletedOk) {
Navigator.pop(context);
}
},
child: Text('Save'),
)
从动作内部分发
所有分发方法在动作内部通过ReduxAction基类可用:
class MyAction extends ReduxAction<AppState> {
Future<AppState?> reduce() async {
// 分发另一个动作并等待它
await dispatchAndWait(LoadDataAction());
// 分发而不等待
dispatch(LogAction('Data loaded'));
return state.copy(loaded: true);
}
}
在before()和after()中分发
您可以在before()和after()生命周期方法中分发动作:
class MyAction extends ReduxAction<AppState> {
Future<AppState?> reduce() async {
String description = await fetchData();
return state.copy(description: description);
}
void before() => dispatch(BarrierAction(true));
void after() => dispatch(BarrierAction(false));
}
ActionStatus
dispatchAndWait()方法返回一个ActionStatus对象,具有有用的属性:
var status = await dispatchAndWait(MyAction());
// 检查完成状态
status.isCompleted; // 动作执行完成
status.isCompletedOk; // 完成无错误
status.isCompletedFailed; // 完成有错误
// 访问错误信息
status.originalError; // 由before/reduce抛出的错误
status.wrappedError; // 经过wrapError()处理后的错误
// 检查方法完成
status.hasFinishedMethodBefore;
status.hasFinishedMethodReduce;
status.hasFinishedMethodAfter;
您也可以直接从动作实例访问状态:
var action = MyAction();
await dispatchAndWait(action);
print(action.status.isCompletedOk);
notify参数
分发方法接受一个可选的notify参数(默认true),控制widgets是否在状态更改时重建:
// 分发而不触发widgets重建
dispatch(MyAction(), notify: false);
摘要表
| 方法 | 返回 | 等待? | 使用场景 |
|---|---|---|---|
dispatch() |
void |
否 | 触发后不管 |
dispatchAndWait() |
Future<ActionStatus> |
是 | 需要知道何时完成 |
dispatchAll() |
List<ReduxAction> |
否 | 多个并行动作 |
dispatchAndWaitAll() |
Future<void> |
是 | 等待所有并行动作 |
dispatchSync() |
void |
N/A | 强制同步执行 |
参考资料
文档中的URLs:
- https://asyncredux.com/flutter/basics/dispatching-actions
- https://asyncredux.com/flutter/basics/using-the-store-state
- https://asyncredux.com/flutter/basics/sync-actions
- https://asyncredux.com/flutter/basics/async-actions
- https://asyncredux.com/flutter/basics/store
- https://asyncredux.com/flutter/advanced-actions/redux-action
- https://asyncredux.com/flutter/advanced-actions/action-status
- https://asyncredux.com/flutter/advanced-actions/before-and-after-the-reducer
- https://asyncredux.com/flutter/testing/dispatch-wait-and-expect
- https://asyncredux.com/flutter/miscellaneous/advanced-waiting