Flutter范围模型-传递多个模型

use*_*665 1 flutter scoped-model

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

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

class AppModel extends Model
{
  ModelA a = new ModelA();
  ModelB b = new ModelB();
  ModelC c = new ModelC();
}
Run Code Online (Sandbox Code Playgroud)

我首先将此模型添加到 main

runApp(ScopedModel<AppModel>(
    model: AppModel(),
    child: MaterialApp(
      title: 'MyApp',
      home: Home(),
    )),);
Run Code Online (Sandbox Code Playgroud)

这将导致应用程序从树中可用的AppModel的主页开始。

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

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

目前onPressed,我的按钮看起来像这样,在其中嵌套了范围模型

() => 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())))))),
Run Code Online (Sandbox Code Playgroud)

PageAB这些我可以通过以下方式访问相关模型ScopedModel.of()

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

ScopedModel.of<ModelB>(context).modelBGet
ScopedModel.of<ModelB>(context).modelBFunc()
Run Code Online (Sandbox Code Playgroud)

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

Fil*_*cks 8

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

它们都是ScopedModel库中Model类上的mixins

mixin UserModel on Model {
 ...
}
mixin SettingsModel on Model {
 ...
}
mixin ContentModel on Model {
 ...
}
Run Code Online (Sandbox Code Playgroud)

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

class AppModel extends Model with UserModel, SettingsModel, ContentModel {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这样,我将合并来自不同模型的行为,如果您只想公开一种类型的模型,则可以对其进行转换并使用该接口。

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