Flutter Scoped 模型 - 传递多个模型
Flutter Scoped Model - Passing multiple Models
我最近一直在玩 Scoped Model,想知道是否有更好的方法将多个模型推到树上供 children 使用。
假设我有一个'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
所需的 'sub-models'
目前我的按钮 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()
这是共享(多个)模型的正确方法吗?或者有更优雅的解决方案吗?
这是您可以做到的一种方式。我使用 Mixins 将不同的行为/功能编译到 AppModel 中。每个模型在应用程序中负责一个section/feature。例如,我有一个 UserModel、SettingsModel 和 ContentModel
它们都是来自 ScopedModel 库class 的模型 class 的 mixin
mixin UserModel on Model {
...
}
mixin SettingsModel on Model {
...
}
mixin ContentModel on Model {
...
}
然后我的主要 AppModel 看起来像这样
class AppModel extends Model with UserModel, SettingsModel, ContentModel {
...
}
通过这种方式,我结合了不同模型的行为,如果您只想公开一种类型的模型,您可以转换它并使用该接口。
我目前倾向于这种方式,其中模型文件管理某些功能的所有状态,并且在这些模型中,我注入了单例实例服务,以便在需要时在它们之间共享信息。这些服务执行我所有的实际业务逻辑,连接到 API,序列化并编译为我的应用程序的上下文信息。
我最近一直在玩 Scoped Model,想知道是否有更好的方法将多个模型推到树上供 children 使用。
假设我有一个'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
所需的 'sub-models'目前我的按钮 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()
这是共享(多个)模型的正确方法吗?或者有更优雅的解决方案吗?
这是您可以做到的一种方式。我使用 Mixins 将不同的行为/功能编译到 AppModel 中。每个模型在应用程序中负责一个section/feature。例如,我有一个 UserModel、SettingsModel 和 ContentModel
它们都是来自 ScopedModel 库class 的模型 class 的 mixin
mixin UserModel on Model {
...
}
mixin SettingsModel on Model {
...
}
mixin ContentModel on Model {
...
}
然后我的主要 AppModel 看起来像这样
class AppModel extends Model with UserModel, SettingsModel, ContentModel {
...
}
通过这种方式,我结合了不同模型的行为,如果您只想公开一种类型的模型,您可以转换它并使用该接口。
我目前倾向于这种方式,其中模型文件管理某些功能的所有状态,并且在这些模型中,我注入了单例实例服务,以便在需要时在它们之间共享信息。这些服务执行我所有的实际业务逻辑,连接到 API,序列化并编译为我的应用程序的上下文信息。