【问题标题】:Flutter/Dart: Communication between features in Clean ArchitecureFlutter/Dart:清洁架构中功能之间的通信
【发布时间】:2020-01-12 15:11:49
【问题描述】:

我是 Flutter/dart 的新手,我正在尝试使用 Clean Architecture 设计创建一个小应用程序。 在开始编写代码以充分利用它之前,我阅读了一些关于 Bob 叔叔的清洁架构的博客和一些演示文稿,现在是时候实现它了。

我想我的应用程序可以分为 3 个主要功能:

  • 身份验证
  • 课程(访问特定主题的课程/测验)
  • 管理员(管理用户、创建课程等)

我开始按照干净的模式实现身份验证功能,也就是说使用域、数据和表示层,我想我做得很好。它(几乎)已经过全面测试(我正在尝试做一些 TDD)并且似乎可以按我的意愿工作。

现在问题来了。我想实现 classes 功能。我希望它可以独立于 authentication 但事实并非如此...... classes 功能需要从 authentication 获取经过身份验证的用户特征。我在互联网上搜索了很多,但我找不到如何实现具有多个需要共享一些数据的功能的清洁架构。

所以我有两个问题:

  • 如何将数据从一个特征传递到另一个特征?
  • 如何在需要来自另一个功能的数据的功能中注入依赖项?(我将 get_it 用于 authentication 功能并在构建应用程序之前在 main() 方法中注入所有依赖项. 因为它不需要任何外部数据,所以效果很好。现在似乎不可能对 classes 功能做同样的事情,因为它首先需要从 authentication中获取一些数据> 功能)。

提前感谢您的回答。

【问题讨论】:

    标签: flutter design-patterns dart clean-architecture


    【解决方案1】:

    除了您的 3 个功能之外,您还应该添加另一个名为 core 的功能,并且在该文件夹中您可以添加需要共享的内容。它对我有用。祝你好运

    【讨论】:

    • 如果您提供更精确的示例或代码示例,它将改进此答案
    【解决方案2】:

    一种选择是,如果您在用户已经登录后实例化类,您可以将该数据作为构造函数参数传入。

    更一般地说,Provider 可能是 Flutter 最好的依赖注入工具。如果您为应用程序的其余部分“提供”身份验证类到小部件树,您可以在它下面的任何位置说 Provider.of(context) 来访问它和它拥有的任何公共字段。

    【讨论】:

    • 感谢您抽出宝贵时间回答(对于我迟到的回复感到抱歉)。我想没有一个独特的解决方案,尽管我仍然发现身份验证和类功能非常耦合,但您提出的解决方案对我来说非常有效。
    【解决方案3】:

    希望您在很长一段时间后仍在从事 Flutter 项目。

    我一直在研究 Bob 大叔的 Clean 架构,几个月前我设法在 Flutter 中实现了它。

    它非常完美,它将您的代码分成组件(如果您来自原生 Android 开发环境,则为模块)并隔离您的数据源,因此,如果您想更改发出 API 请求的方式,例如,您将只需要更改应用程序中的远程数据源部分,您的所有应用程序都应该按预期工作。

    我已经使用我刚刚上传到 github 上的 Clean Architecture 制作了一个测试应用,并添加了一个简单的自述文件,描述了该应用的基本架构和组件,我很快就会撰写描述代码的文章。

    现在您可以从here 访问回购

    【讨论】:

    • 您好,感谢您的回复。不幸的是,我已经阅读了你的 git repo 中的所有内容(其中大部分直接来自 Reso Coder),我的问题不是如何实现一个独特的功能,而是当多个功能需要共享一些数据时如何处理。
    • 是的,大部分代码来自reso coder,我在架构中添加了一些基类,例如基本本地数据源,基本远程数据源和基本存储库,请您用一个描述示例您希望如何在多个功能之间共享数据
    • 在我最初发表的文章中,我描述了这种情况的一个例子。身份验证功能负责登录用户,但类功能需要访问它。这就是我正在努力以“干净”的方式抽象的依赖关系(类需要来自身份验证的数据)。
    • 所以对我来说,您想要实现的是,您使用某些功能登录,然后在存储库中您应该处理本地数据源来存储用户令牌或一些数据他,这可以通过本地数据库或共享首选项来实现,然后当您需要进行 API 调用或检索用户身份验证时,您可以使用“GetAuthenticatedUser”或任何其他功能来处理本地数据源并检索用户的数据
    【解决方案4】:

    一段时间以来,我一直在努力寻找答案……我的解决方案是在模型类中创建一些转换方法。例如,我在主页功能文件中有一个 ProductModel(我可以从中将产品添加到购物车),在订单历史功能文件中有一个 ProductInOrderHistoryModel。因此,在 ProductInOrderHistoryModel 文件中,我有一个名为 toProductModel 的方法,它获取 ProductInOrderHistoryModel 的实例并转换为 ProductModel。这样我就可以直接从我的历史订单页面将产品添加到购物车。 可能这不是最好的解决方案,Bom 叔叔会真的生我的​​气。但这是我设法解决问题的方法......

    【讨论】:

      猜你喜欢
      • 2017-05-24
      • 2020-06-18
      • 1970-01-01
      • 2022-10-14
      • 2014-06-22
      • 2021-06-17
      • 2021-02-12
      • 1970-01-01
      • 2017-04-14
      相关资源
      最近更新 更多