0

很长一段时间以来,我一直在纠结于状态管理,但有一个问题我正在努力解决。假设您的应用程序有一个名为“用户资料”的功能,类似于 Facebook 或 Instagram 的。用户可以多次打开用户页面,如果他们更新个人资料中的某些内容(例如帖子),则必须更新该用户的所有个人资料页面。现在在 React Native 中,我会有一个用户状态,它是 {user_id -> user_profile} 的映射。所有需要用户数据的用户配置文件页面都将引用具有特定用户 ID 的用户配置文件。因为用户 ID 只有一个用户配置文件,所以如果我更新某些内容,所有页面都会更新。

我在 Flutter 中有类似的设置。我有一个UserProfilesChangeNotifier包含 Map<user_id, user_profile>。每次打开用户页面时,我都会ChangeNotifierProvider.value向它提供地图。在initState,我会检查特定的 user_id 是否存在于 Map 中,如果不存在,则UserProfilesChangeNotifier必须从服务器获取数据。在build方法中,我将使用 读取用户数据userProfile.map[user_id],同样我也通过UserProfilesChangeNotifier(附带 notifyListeners() )更新数据。我可以想到此设置存在一些问题:

  • 根据 Flutter 文档,您应该避免使用ChangeNotifier大量侦听器,因为它是 O(N²) 来调度通知。在我的情况下,许多用户页面将不得不听它。它可以解决ChangeNotifierProvider吗?
  • 如果用户打开 id 为 1、2、3、4 的用户的个人资料页面,然后继续更新 id 为 4 的用户中的数据(将其写入 Map 和notifyListeners),则用户 1、2、3 的所有用户页面都必须重建以及,虽然不需要。

我觉得我的设置有很大缺陷,可能需要改进。在这种情况下你会怎么做?

4

1 回答 1

0

对于您的问题,是的ChangeNotifierProvider,例如可以解决。我正在开发一个音乐/视频应用程序,该应用程序现在也有很多复杂性,并且通过状态管理,您可以定义非常好的您想要重新加载而不是重新加载的内容。

想象一个非常大的小部件树,在那里你只有一个需要更新的值,userprofile例如你可以使用 a Consumer,它在侦听器收到通知后执行完全相同的操作,但它只重建自身上方的树,这意味着您可以很好地定义只有特定部分应该重新加载。

您还可以listen, false在不通知任何小部件的情况下调用带有语句的函数。在很多情况下,您只需调用函数本身。

检查这篇文章,它真的很好,因为提供者 https://medium.com/flutter-community/making-sense-all-of-those-flutter-providers-e842e18f45dd

于 2020-07-09T05:31:34.443 回答