Flutter Redux 小吃店

Posted

技术标签:

【中文标题】Flutter Redux 小吃店【英文标题】:Flutter Redux SnackBar 【发布时间】:2018-09-27 23:40:27 【问题描述】:

我在颤振代码中使用 redux。我有一个按钮,按下时会发送一个动作来调用异步 API(在我的中间件中)。我想要做的是当 api 调用执行并返回响应时,我想显示小吃栏,说明它已成功更新数据或错误消息。我的问题是如何通过调度一个动作来显示它。或者有没有更好的方法在 redux 中做到这一点?

【问题讨论】:

您可以将回调(完成和错误)作为中间件可以使用的操作的一部分传递 @aqwert 你能详细说明一下吗?我不明白这一点。另外,我的问题更多是关于如何在异步 api 响应后显示小吃栏。对于我可以使用 appState 的值,对吗? 添加了答案 【参考方案1】:

免责声明: 这不是在 IDE 中编写并运行的代码。它只是描述问题解决方案的一种方式。可能有错误。

假设您拥有 Redux 存储并使用异步进行 API 调用。

您的页面小部件:

... 

_onSubmit(Store<MyState> store) 
   store.dispatch(new SubmitAction(onCompleted: _onCompleted, onError: _onError))



_onCompleted() 
    Scaffold.of(context).showSnackBar(new SnackBar(
       content: new Text("Item Completed")));



_onError(error) 
    Scaffold.of(context).showSnackBar(new SnackBar(
       content: new Text("Error Occurred")));

你的 Redux 中间件:

apiMiddleware(Store<MyState> store, action, NextDispatcher next) 

    if(action is SubmitAction) 
        yourAPICall()
            .then((data) => action.onCompleted())
            .catchError((e) => action.onError(error));
    

    next(action);

MyAction 类:

typedef void VoidCallback();
typedef void ErrorCallback(error);
class MyAction 
   MyAction(this.onCompleted, this.onError)

   VoidCallback onCompeleted;
   ErrorCallback onError;

其中一些可以通过期货来完成,但这很简单。

【讨论】:

非常感谢。这种方法奏效了。我发现的另一种方法是使用全局键,并在中间件中使用此键在从 api 获得响应后显示小吃栏。 当然……不管怎样,你对中间件与 UI 的耦合程度感到满意 如果单击提交时我也发送加载操作怎么办。这将触发当前小部件被替换为新小部件,并显示进度条。回调将指向已销毁的上下文。回调是无状态小部件的安全机制吗? 取决于您传递的上下文。如果您停留在同一页面上,则可以传递页面上下文,而不是按钮的上下文。 但这对于 Redux 提出的架构是否可行?

以上是关于Flutter Redux 小吃店的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 小吃店替代方案还是比将所有内容包装在 Scaffold 中更简单的方法?

Flutter:使用barcode_scan插件后Snackbar不显示

如何在 Flutter 中的 navigator.pop(context) 之后显示小吃栏?

每次推送新路线时,都会再次显示最后的 Flutter SnackBar

Flutter - 'showSnackBar' 已弃用 - 如何更新?

Flutter SnackBar 的高度