Flutter: обновлять переменную класса при изменении глобальной переменной с помощью MVVM

#flutter #mvvm #state-management

#flutter #mvvm #управление состоянием

Вопрос:

У меня есть настройка моего приложения таким образом, что SessionRepository поставщик оборачивает MaterialApp. Этот репозиторий позволяет мне отслеживать данные о сеансе во всем приложении.

   @override
  Widget build(BuildContext context) {
    return Provider<SessionRepository>(
      create: (_) => SessionRepository()),
      child: MaterialApp(
        ...
      ),
    );
  }
  

На одном из своих экранов я создаю модель представления, поскольку я следую архитектуре MVVM, и использую SessionRepository для инициализации некоторых переменных модели представления.

 Widget build(BuildContext context) {
    final session = Provider.of<SessionRepository>(context, listen: false);

    return Provider<TestViewModel>(
      create: (context) => TestViewModel(session),
      child: ...
    );
}
  

В моей модели просмотра это происходит:

 class TestViewModel{
  final SessionRepository session;
  final var foo;
  final var bar;

  TestViewModel(this.session) : foo = session.foo, bar = session.bar;
}
  

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

Ответ №1:

Если вы хотите уведомлять свое представление при изменении свойства SessionRepository и воссоздавать свою viewmodel с новыми значениями, SessionRepository должен реализовать ChangeNotifier. Ознакомьтесь с примерами ChangeNotifierProvider.

Комментарии:

1. Это то, о чем я думал, но не дорого ли перестраивать все приложение material всякий раз, когда я обновляю переменную сеанса?

2. Поставщик создает виджеты только там, где вы повторно обращаетесь к SessionRepository, как этот Provider.of<SessionRepository> (контекст, прослушивание: true);