Модель Flutter Scoped — передача нескольких моделей

Недавно я играл с 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()

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


person user6635665    schedule 01.03.2019    source источник
comment
Я уже ответил на этот вопрос по этой ссылке, это также может помочь тем, кто все еще рассматривает возможность объединения нескольких моделей в одну модель. stackoverflow.com/a/56692571/3589715   -  person AlexPad    schedule 20.06.2019


Ответы (1)


Это один из способов сделать это. Я использую Mixins для компиляции различных beahviours/features в 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, сериализуют и компилируют в контекстную информацию для моего приложения.

person Filled Stacks    schedule 01.03.2019
comment
Спасибо, это выглядит как интересная альтернатива — мне нужно немного освежить миксины! - person user6635665; 01.03.2019
comment
@ user6635665 пожалуйста :) вот ссылка на статью, которая помогла мне понять причину ее существования и как ее использовать. medium.com/flutter-community/dart-what-are-mixins- 3a72344011f3 - person Filled Stacks; 01.03.2019
comment
@FilledStack Я борюсь с аналогичной проблемой - не могли бы вы поделиться со мной кодом вашей страницы AB, чтобы я мог посмотреть, как вы извлекаете оттуда ScopedModel? Вы передаете ScopedModel в конструкторе PageAB? - person Matt; 10.05.2019
comment
@Matt Я сделал полное видео здесь, на ScopedModel. Короче говоря, я использую get_it для внедрения модели там, где это необходимо. youtu.be/JsjDLHxGz4M - person Filled Stacks; 10.05.2019
comment
сегодня проверю, спасибо! :) - person Matt; 13.05.2019