【发布时间】:2021-09-27 03:57:33
【问题描述】:
想象一个非常简单的应用程序,它有两个页面,PostList 和 PostDetail。在前一页上,我们显示 posts 的列表,在后一页上,显示单个 post 的详细信息。
现在考虑以下情况。我们的用户点击第一个 PostItem 并导航到 PostDetail 页面。我们从服务器获取完整的 post 数据。此 post 的 likes_count 增加 1。现在,如果我们的用户导航回第一页,PostItem 应该会更新并显示新的 likes_count。
一种可能的解决方案是创建一个帖子池。现在,当我们从服务器获取一些新数据时,我们可以更新相应的池实例对象,而不是创建新的 post 对象。例如,如果我们导航到 id=3 的帖子,我们可以这样做:
Post oldPost = PostPool.get(3)
oldPost.updateFromJson(servers_new_json_for_post_3)
由于PostDetail页面上使用了相同的对象,我们在PostList页面上的PostItem也会随之更新。
在整个应用程序中不使用 Post 对象的唯一“单个实例”的其他方法实施起来并不干净,并且需要一些技巧来保持 UI 同步。
但 ObjectPool 方法也有其自身的问题,并且会导致内存泄漏,因为池的大小会随着时间的推移变得越来越大。为了解决这个问题,我们需要手动计算每个池对象实例的引用数,并在该计数为零时丢弃它们。这种手动计算充满了错误,我想知道是否有更好的方法来实现这一点。
【问题讨论】:
标签: flutter dart flutter-provider object-pooling flutter-state