Как не повторять запрос к сервису при переходе между страницами

Ситуация: При авторизации пользователя происходит запрос к веб сервису, веб сервис возвращает json ответ который через Navigator передается на домашнюю(Stateful) страницу приложения, из данных рисуется список виджетов. Вопрос: как сделать так чтобы при переходе с домашней страницы и обратно(например: home page->settings->home page) не требовалось делать повторного запроса к веб сервису для получения данных, чтобы потом снова "превратить" их в виджеты. То есть как сделать запрос к сервису всего один раз, и обращаться к результатам ответа сервиса в любой момент и из любого места?


Ответы (1 шт):

Автор решения: MiT

Есть несколько вариантов решить вашу проблему:

  1. Реализовать паттерн Singleton (Одиночка) — это паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
  2. Использовать Dependency Injection (Внедрение зависимости) — это такая техника, где посредством одного объекта (или статического метода) предоставляются зависимости другого объекта. Зависимость — это объект, который может быть использован (как сервис).

Реализация Singleton (с помощью factory конструктора):

class Singleton {
  static final Singleton _singleton = Singleton._internal();

  factory Singleton() {
    return _singleton;
  }

  Singleton._internal();

  int a;
  int b;
}

main() {
  var s1 = Singleton();
  var s2 = Singleton();
  print(identical(s1, s2));  // true
  print(s1 == s2);           // true

  s1.a = 10;
  s2.b = 20;

  print(s1.a + s1.b); // 30
  print(s2.a + s2.b); // 30
}

Для реализации Dependency Injection я рекомендую использовать уже готовы библиотеки:

  1. Provider предоставляет зависимости через дерево виджетов.
  2. get_it предоставляет зависимости через созданный сервис.
  3. Inject DI похожий на Dagger.

Все DI библиотеки необходимо изучать и понимать как работают, чтобы начать разрабатывать с помощью них. Эта тема сложная для новичка, по этому рекомендую использовать Singleton.

→ Ссылка