Модель Flutter Scoped - прохождение нескольких моделей - PullRequest
0 голосов
/ 01 марта 2019

Я недавно играл с 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

В настоящее время у меня есть onPressed для моих кнопок, выглядящих примерно так, где я вкладываю модели Scoped

() => 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()

. Это правильный способ обмена (несколькими) моделями?Или есть более элегантное решение?

1 Ответ

0 голосов
/ 01 марта 2019

Это один из способов, которым вы можете сделать это.Я использую Mixins для компиляции различных функций / функций в AppModel.Каждая модель отвечает за раздел / функцию в приложении.В качестве примера у меня есть UserModel, SettingsModel и ContentModel

Все они являются миксинами в классе Model из библиотеки ScopedModel

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

И тогда мой основной AppModel выглядит следующим образом

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

Таким образом, я комбинирую поведение из разных моделей, если вы хотите показать только один тип модели, который вы можете использовать и использовать этот интерфейс.

Я сейчас склоняюсь к этому путигде файлы модели управляют всем состоянием определенных функций, и в этих моделях я внедряю сервисы, которые являются единичным экземпляром для обмена информацией между ними, если это необходимо.Эти сервисы выполняют всю мою настоящую бизнес-логику: подключение к API, сериализация и компиляция в контекстную информацию для моего приложения.

...