使用用户个人资料进行Flutter状态管理

时间:2020-07-09 03:53:32

标签: flutter provider changenotifier

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

我在Flutter中也有类似的设置。我有一个UserProfilesChangeNotifier,其中包含一个Map 。每次打开用户页面时,我都会使用ChangeNotifierProvider.value向其提供地图。在initState中,我将检查Map中是否存在特定的user_id,如果不存在,则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也必须重建。

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

1 个答案:

答案 0 :(得分:0)

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

想象一下一个非常大的小部件树,其中只有一个需要更新的值扔给了userprofile,例如,您可以使用Consumer,它在侦听器之后的作用完全相同收到通知,但它只会在其上方重建树,这意味着您可以定义很好,只需要重新加载特定部分。

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

检查本文对提供者可能提供的服务确实非常有用 https://medium.com/flutter-community/making-sense-all-of-those-flutter-providers-e842e18f45dd