Как реализовать логаут?

Пишу приложение на Flutter используя Provider для хранения состояния и DI, но столкнулся с такой проблемой как логаут. У меня больше десяти экранов, но не могу придумать простого механизма для очистки состояний всех экранов. В нативной разработке это было доволи просто, если не было оговорена другое, то после основных действий я перезапускал приложение, тут же нет такой возможности. Даже если это реализовать это на уровне нативной, то вот для iOSтакое не реализуемо.

Может я что-то не дочитался в документации Provider или есть какие-то другие решения.

P.S. Видел пару плагинов для этих целей, но:

  • не совсем понял принцип их реализации;
  • не хотелось бы тянуть в проект плагин ради таких целей.

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

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

Provider хороший инструмент для DI, но не является полноценным стейт менеджером (на одну из причин вы как раз и попали).

Способ через GlobalKey (hard-reset с сохранением поддерева):

Widget build(BuildContext context) {
  return Provider(
    key: ObjectKey(someIdentifier),
    builder: (_) => Foo(),
    child: SomeSubtree(
      key: GlobalObjectKey(context),
    ),
  );
}

Через общий интерфейс (добавить интерфейс и метод очистки, вызывать вручную для каждого сейта) + отдельный отдельный Provider для управления:

abstract class ProviderInterface with ChangeNotifier {
  void clean();
}

class ProviderImplementation with ChangeNotifier implements ProviderInterface {
  @override
  void clean(){...}
}
→ Ссылка