Различие между эфемерным состоянием и состоянием приложения

В этом документе рассказывается о состоянии приложения, эфемерном состоянии и о том, как можно управлять каждым из них в приложении Flutter.

В самом широком смысле состояние приложения - это все, что существует в памяти во время работы приложения. Сюда входят активы приложения, все переменные, которые фреймворк Flutter хранит о пользовательском интерфейсе, состояние анимации, текстуры, шрифты и так далее. Хотя это максимально широкое определение состояния является правильным, оно не очень полезно для архитектуры приложения.

Во-первых, вы даже не управляете некоторыми состояниями (например, текстурами). За вас это делает фреймворк. Поэтому более полезное определение состояния - это "любые данные, которые вам нужны для перестройки пользовательского интерфейса в любой момент времени". Во-вторых, состояние, которым вы управляете самостоятельно, можно разделить на два концептуальных типа: эфемерное состояние и состояние приложения.

Эфемерное состояние

Эфемерное состояние (иногда называемое состоянием пользовательского интерфейса или локальным состоянием ) — это состояние, которое вы можете аккуратно содержать в одном виджете.

Это намеренно расплывчатое определение, поэтому вот несколько примеров.

  • текущая страница в PageView

  • текущий прогресс сложной анимации

  • текущая выбранная вкладка в BottomNavigationBar

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

Другими словами, нет необходимости использовать методы управления состоянием (ScopedModel, Redux и т. д.) для такого состояния. Все, что вам нужно, это файл StatefulWidget.

Ниже вы видите, как текущий выбранный элемент на нижней панели навигации удерживается в _indexполе _MyHomepageStateкласса. В этом примере _indexэто эфемерное состояние.

class MyHomepage extends StatefulWidget {
  const MyHomepage({Key? key}) : super(key: key);

  @override
  _MyHomepageState createState() => _MyHomepageState();
}

class _MyHomepageState extends State<MyHomepage> {
  int _index = 0;

  @override
  Widget build(BuildContext context) {
    return BottomNavigationBar(
      currentIndex: _index,
      onTap: (newIndex) {
        setState(() {
          _index = newIndex;
        });
      },
      // ... items ...
    );
  }
}

Здесь использование setState()и поля внутри класса State StatefulWidget совершенно естественно. Ни одна другая часть вашего приложения не нуждается в доступе _index. Переменная изменяется только внутри MyHomepageвиджета. И, если пользователь закрывает и перезапускает приложение, вы не возражаете, что _indexсбрасывается до нуля.

Состояние приложения

Состояние, которое не является эфемерным, которым вы хотите поделиться во многих частях вашего приложения и которое вы хотите сохранить между сеансами пользователей, — это то, что мы называем состоянием приложения (иногда также называемым общим состоянием).

Примеры состояния приложения:

  • Пользовательские настройки

  • Информация для входа

  • Уведомления в приложении социальной сети

  • Корзина в приложении электронной коммерции

  • Статус прочитанных/непрочитанных статей в новостном приложении

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

Не существует четкого правила

Чтобы быть ясным На самом деле, команда Flutter делает это во многих простых примерах приложений (включая стартовое приложение, которое вы получаете при каждом создании flutter).

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

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

Last updated