如何在请求后更改块状态数据而不再次发送请求?
Posted
技术标签:
【中文标题】如何在请求后更改块状态数据而不再次发送请求?【英文标题】:How to change bloc state data after a request without sending the request again? 【发布时间】:2021-04-07 01:49:15 【问题描述】:我是 Flutter 的新手,我在使用 bloc 进行数据管理时遇到了一些问题。我正在构建一个应用程序,该应用程序使用 bloc 发出请求(get_things)并接收对象列表作为响应(例如:“things”:[“id”:1,“color”:“green”,“ id":2 , "color":"blue",...] )。
通过这个响应,我构建了一个使用 blocState 呈现这些“事物”的小部件。然后我创建另一个页面,调用同一个块来创建一个类似的小部件,但是在这个页面中,我们可以创建、修改或删除“事物”并请求在数据库上更改它们(modify_things)。
问题是我希望两个页面都在更改后更新列表,而无需请求后端使用修改后的列表重建列表。
我虽然作为一种解决方案是将初始请求的 blocState 数据保存在某处,然后在本地使用它来对小部件(列表)进行更改。我的意思是,我删除一个“东西”并发送修改数据库的请求,同时我在本地修改保存的 blocState 列表以反映此更改。这样我只需要使用一次 get_things 和 modify_things 只有当我对列表进行更改时。
这是一个好的方法吗?这种方法看起来很麻烦,但是由于我对颤动还很陌生,所以我想不出其他任何东西。
至于我需要减少请求并在本地进行管理,这是因为我被告知将来这些“东西”会变得非常大,并且每次我需要查看小部件最终可能是性能问题。
【问题讨论】:
【参考方案1】:如果我理解正确,您将["id": 1, "color" : "green","id":2 , "color":"blue",...]
发送到页面 A,然后您想在页面 B 上使用相同的数据。
我想,干净的方法是在页面 A 上添加一个带有 myBloc.add(["id": 1, "color" : "green","id":2 , "color":"blue",...] )
的事件,这也会触发页面 B 的加载。然后 myBloc 会产生一个包含该状态以及可能更多数据的状态,显示页面 B。
当然,您也可以在 myBloc 中声明 PageADisplayState storedState;
,然后在通过 storedState = things; yield PageADisplayState(things);
生成状态之前将其存储
【讨论】:
我已经通过调用发出请求 get_things 的页面 A 块来获取页面 B 上的数据。然后我制作了一个小部件,允许我选择一个“事物”,对其进行编辑,然后发送请求 edit_things 以反映我的数据库上的更改。我想要做的是让这个新的修改后的内容列表显示在两个页面中,而无需每次刷新页面时都发出请求。我想我要问的是是否可以修改存储在我的 blocState 上的数据,而无需检查后端是否有更改。如果我不够清楚,请告诉我。 如果您有 2 个 bloc,您可以使用我的问答将数据发送回 blocA:***.com/questions/64011595/…。为了不触发新的后端请求,我有时只是将数据作为 var 存储在该块中并使用if (myVar == null) then myVar = getData()
。所以数据在第一次执行时被提取,然后我重用或操作该数据
多么巧合!我只是想这样做。我认为我的问题是认为这是一个混乱的解决方案。我正在尝试将干净的架构与 bloc 一起使用,因此有意避免将 blocState 用于所有内容的想法对我来说有点陌生。感谢您的意见。
我会的!但在此之前,我还有另一个问题,您也许可以提供帮助。我在使用里面的列表管理 myVar 时遇到问题。我想用它在这些页面中构建管理我的“东西”的小部件。我一直在阅读有关状态管理的文章,但我对如何使 myVar 在页面之间共享一无所知,因此当它被修改(编辑或删除“事物”)时,每个页面都可以在刷新后反映更改。它应该像涉及此“事物”列表的页面中的某个“全局变量”一样工作。感谢您的帮助!以上是关于如何在请求后更改块状态数据而不再次发送请求?的主要内容,如果未能解决你的问题,请参考以下文章
更改 ajax 请求的 response.statuscode 会引发错误“发送 HTTP 标头后服务器无法设置状态”
如何在烧瓶中发布请求后使用 websockets 向客户端发送警报