【问题标题】:Flutter Scoped Model - Passing multiple ModelsFlutter Scoped Model - 传递多个模型
【发布时间】:2019-07-23 08:07:41
【问题描述】:

我最近一直在玩 Scoped Model,想知道是否有更好的方法将多个模型推送到树上供儿童使用。

假设我有一个“AppModel”,它是我需要的所有模型的组合

class AppModel extends Model
{
  ModelA a = new ModelA();
  ModelB b = new ModelB();
  ModelC c = new ModelC();
}

我首先将此模型添加到来自 main 的树中

runApp(ScopedModel<AppModel>(
    model: AppModel(),
    child: MaterialApp(
      title: 'MyApp',
      home: Home(),
    )),);

这会导致应用程序从主页开始,并且树中有一个可用的 AppModel

主页是一系列按钮,每个按钮都指向另一个页面,该页面可能使用 AppModel 中的多个模型

按下按钮时,我想打开相关页面并传递 AppModel 所需的“子模型”

目前,我的按钮有 onPressed,看起来像这样,我在其中嵌套了 Scoped Models

() => Navigator.push(context, 
      MaterialPageRoute(builder: (context) => ScopedModel<ModelA>
          model: ScopedModel.of<AppModel>(context).a,
          child: ScopedModel<ModelB>(
             model: ScopedModel.of<AppModel>(context).b,
             child: PageAB())))))),

PageAB 内,我可以通过ScopedModel.of() 访问相关模型

ScopedModel.of<ModelA>(context).modelAGet
ScopedModel.of<ModelA>(context).modelAFunc()

ScopedModel.of<ModelB>(context).modelBGet
ScopedModel.of<ModelB>(context).modelBFunc()

这是共享(多个)模型的正确方法吗?还是有更优雅的解决方案?

【问题讨论】:

标签: flutter scoped-model


【解决方案1】:

这是您可以做到的一种方式。我使用 Mixins 将不同的行为/功能编译到 AppModel 中。每个模型负责应用程序中的一个部分/功能。例如,我有一个 UserModel、SettingsModel 和 ContentModel

它们都是 ScopedModel 库中 Model 类的 mixin

mixin UserModel on Model {
 ...
}
mixin SettingsModel on Model {
 ...
}
mixin ContentModel on Model {
 ...
}

然后我的主 AppModel 看起来像这样

class AppModel extends Model with UserModel, SettingsModel, ContentModel {
  ...
}

通过这种方式,我将来自不同模型的行为组合在一起,如果您只想公开一种类型的模型,您可以转换它并使用该接口。

我目前倾向于这种方式,其中模型文件管理某些功能的所有状态,并且在这些模型中,我注入作为单例实例的服务,以便在需要时在它们之间共享信息。这些服务执行我所有的实际业务逻辑、连接到 API、序列化并编译为我的应用程序的上下文信息。

【讨论】:

  • 谢谢,这看起来是一个有趣的替代方案 - 我必须对 mixins 进行一些复习!
  • @user6635665 不客气 :) 这是文章的链接,它帮助我了解了它存在的原因以及如何使用它。 medium.com/flutter-community/dart-what-are-mixins-3a72344011f3
  • @FilledStack 我正在为类似的问题而苦苦挣扎——您能否与我分享您的 PageAB 的代码,以便我看看您是如何在其中检索 ScopedModel 的?你在 PageAB 的构造函数中传递 ScopedModel 吗?
  • @Matt 我在 ScopedModel 上做了一个完整的视频。简而言之,我使用 get_it 在需要的地方注入模型。 youtu.be/JsjDLHxGz4M
  • 今天会去看看,谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2018-12-03
  • 2021-09-05
  • 2020-08-04
  • 1970-01-01
  • 2016-08-03
相关资源
最近更新 更多