Flutter Scoped Model - 传递多个模型

Posted

技术标签:

【中文标题】Flutter Scoped Model - 传递多个模型【英文标题】:Flutter Scoped Model - Passing multiple Models 【发布时间】: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()

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

【问题讨论】:

我已经在这个链接上回答了这个问题,它也可以帮助那些仍在考虑将多个模型组合在一个模型中的人。 ***.com/a/56692571/3589715 【参考方案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 今天会去看看,谢谢! :)

以上是关于Flutter Scoped Model - 传递多个模型的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scoped Model 在 Flutter 中维护应用程序状态

尝试使用导航器页面访问时找不到 Flutter scoped_model

Flutter - Scoped BloCs 问题

Flutter状态管理——ScopedModel

Dart Flutter:如何从作用域模型运行动画?

Vue中的scoped属性