与Redux一起颤抖:如何从中间件显示警报?我在哪里可以获得BuildContext

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了与Redux一起颤抖:如何从中间件显示警报?我在哪里可以获得BuildContext相关的知识,希望对你有一定的参考价值。

在我使用Redux架构的Flutter上的聊天应用程序中,我需要在一些异步调用的结果后显示对话框。我的主要问题是为show对话框获取当前的BuildContext。这个异步调用可以在不同的屏幕上完成,我需要当前屏幕的上下文。

我对中间件方面的看法如下:

void _setCompanionToChat(String groupChatId) {

  var documentReference = _getChatDocument(groupChatId);

  documentReference.get().then((snapshot) {
     var closed = snapshot[ChatDatabase.CLOSED_ATTRIBUTE];

     if (snapshot.exists && !closed) {
         // SOME OPERATIONS
     } else {
        //  SHOW DIALOG
     }
  });
}

有什么建议怎么做?

答案

也许您可以将对话框作为回调传递:

  • 以这种方式创建请求操作:
class MyDataRequestAction {
  ...
  Function onError;
  MyDataRequestAction({this.onError});
}
  • 在您的屏幕中,在StoreConnector中调度这些操作,例如
@override
Widget build(BuildContext context) {
  ...
  StoreConnector<AppState, _MyScreenViewModel>(
  onInit: (store) => store.dispatch(MyDataRequestAction(
    onError: () => showDialog(context: context, builder: (context) => AlertDialog(...));
  ));
  ...
  • 最后在你的中间件中:
class MyMiddleware extends MiddlewareClass<AppState> {
  ...
  @override
  void call(Store<AppState> store, action, NextDispatcher next) async {
    ...
    _setCompanionToChat(groupChatId, action) // PASS THE ACTION!!
  }

  void _setCompanionToChat(String groupChatId, dynamic action) {
    ...
    if (snapshot.exists && !closed) {
      // SOME OPERATIONS
    } else {
      action.onError();
    }

以上是关于与Redux一起颤抖:如何从中间件显示警报?我在哪里可以获得BuildContext的主要内容,如果未能解决你的问题,请参考以下文章

redux-saga 与 redux 一起使用会导致 render() 被调用两次

redux:与 compose 中间件一起设置初始状态

如何让我的服务器端 Joi 验证与 redux-form 一起正常工作?

如何将 Redux 4.0 TypeScript 绑定与 redux-thunk 一起使用

[Redux/Mobx] Redux怎么添加新的中间件?

如何在 redux-observable 史诗中链接 RxJS 可观察?