#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);