【问题标题】:Where to put Provider/BlocProvider in the widget tree?在小部件树中将 Provider/BlocProvider 放在哪里?
【发布时间】:2022-07-19 00:49:58
【问题描述】:

目前我认为放置它们的最佳位置是创建路线时。那是因为我可以轻松地模拟导航器推送调用。但是当我有某种带有 3 个不同的单独屏幕的 TabScreen 时,我对我应该做什么感到困惑,我们通常在没有路由的情况下实现这些屏幕。如果我在创建 tabviews 时将 Providers 分别放在不同的地方,我的意思是结构将像 tabs:[ProvidersForScreen1(Screen1), ProvidersForScreen2(Screen2)...],那么看起来我们获得了孤立的功能,这很好但在这种情况下我无法创建 TabScreen 来测试它,因为 Providers是在 TabScreen 中创建的,我无法模拟它们。如果有的话,有人可以告诉我更好的方法吗?

【问题讨论】:

  • 为什么不直接封装应用并在顶层提供所有这些?
  • @user18309290 这是一个不好的做法,因为它永远不会被释放,它可以在应用程序的任何位置无缘无故地访问

标签: flutter flutter-provider flutter-bloc


【解决方案1】:

根据经验,您应该将每个提供者放在最近的父级。例如,如果您必须从所有 3 个不同屏幕的提供程序中的值访问某些内容,请将值提供程序 Foo 放置在所有 3 个屏幕的父级。

您仍然可以拥有特定于屏幕的提供程序,将每个屏幕包装在您的 TabScreen 中。或者,您可以让特定于屏幕的提供程序在需要时侦听父值提供程序Foo 中的更改并做出反应。

对于测试,您可以分别测试 TabScreen 和各个屏幕。测试TabScreen 时,模拟共享提供程序Foo,并继续使用屏幕特定提供程序的真实实例(旁注:如果您在特定屏幕提供程序中有API 调用,请记住包装您的TabScreen使用模拟存储库的提供者,假设您调用存储库方法来进行 API 调用)。同样,您可以像往常一样通过使用模拟实例的提供者包装每个屏幕来测试各个屏幕。

关键是始终将提供者作为视图小部件的父级,以便您可以使用模拟实例的提供者包装视图小部件。我有一个example repository,它显示了我如何在每个功能的view 文件夹中分离页面和视图,其中每个page 类仅包含提供程序和view 类,而view 仅消耗他们。通过使用包含模拟的提供程序包装它们,可以更轻松地测试您的视图。

【讨论】:

    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 2019-03-14
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多