AsyncRedux分发动作技能Skill asyncredux-dispatching-actions

这个技能专注于在Flutter应用中使用AsyncRedux库分发动作的各种方法,包括dispatch、dispatchAndWait、dispatchAll、dispatchAndWaitAll和dispatchSync。它支持从widgets和其他动作内部进行分发,适用于状态管理和异步操作,关键词:AsyncRedux, Flutter, 分发动作, 状态管理, Dart, 移动开发。

移动开发 0 次安装 0 次浏览 更新于 3/19/2026

名称: 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: