Флаттер с использованием нескольких моделей с моделью Scoped - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать приложение для отслеживания расходов во Flutter и решил использовать Scoped Model для управления состоянием. Приложение имеет пользователя, который может иметь много учетных записей, и каждая учетная запись может иметь много транзакций.

Как мне смоделировать их для использования с Scoped Model, я застрял в выборе хорошей архитектуры.

Если я создаю UserModel со списком Учетных записей, где каждая Учетная запись является AccountModel, то запуск и обновление изнутри AccountModel не вызовут те, которые обращаются к классу UserModel.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Начнем с основного вопроса . Является ли модель с областью действия MVVM? Мой ответ - да, она должна использоваться как таковая, если сущности должны быть где-то сохранены.

Итак, я бы хотелачтобы ответить вам хорошо после его использования в течение двух месяцев.На мой взгляд, есть две возможности, которые могут быть более абстрактными без необходимости воссоздания структуры моделей, и одна, которую я видел, использовавшейся, которая должна быть исключена, если вы не хотите сталкиваться с проблемами управления данными между представлениями.

Первый - классический:

Widget build(BuildContext context) {
// At the top level of our app, we'll, create a ScopedModel Widget. This
// will provide the CounterModel to all children in the app that request it
// using a ScopedModelDescendant.
return ScopedModel<UserModel>( // <========
  model: userModel,
  child: ScopedModel<CounterModel>( // <========
    model: counterModel,
    child: MaterialApp(
      title: 'Scoped Model Demo',
      home: CounterHome('Scoped Model Demo'),
     ),
   ),
  );
 }
}

Второй, на мой взгляд, самый интеллектуальный метод - загрузка наиболее важных моделей в мире, которые нужны только для некоторых представлений.например, таймер, чтобы вставить их на самом верхнем используемом уровне страницы.

Второй пример: In main.dart

return ScopedModel<UserModel>(
  model: UserModel(),
  child: MaterialApp(
    theme: ThemeData(
      primaryColor: PrimaryColor,
    ),
    home: new SplashScreen2(),
  ),
);

В workout.dart:

return ScopedModel<TimerModel>(
model: TimerModel(),
child: Scaffold(
child:Center(_widget)
 ),
);

Теперь в своем _widget вы можете использовать ScopedModelDescendant для UserModel и TimerModel ..

Чего я не советую вам делать, так это создать основную модель со смесью и расширить все остальные модели.К сожалению, я видел некоторые видео, которые делают это, не объясняя последствия.Или, если вы хотите сделать это, убедитесь, что между ними нет ссылок, потому что это может создать путаницу между тем, что действительно нужно обновить, или нет, я советую вам использовать это решение, только если у вас есть 2-3 модели .

Надеюсь, я помог кому-то, кому было интересно, как его использовать

0 голосов
/ 16 января 2019
class CombinedWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final username =
      ScopedModel.of<UserModel>(context, rebuildOnChange: true).username;
    final counter =
      ScopedModel.of<CounterModel>(context, rebuildOnChange: true).counter;

    return Text('$username tapped the button $counter times');

  }
}

Вы можете увидеть полный пример в source .

...