TGViewer
Flutter Friendly Flutter Friendly @flutterfriendly · 995 subscribers
Post #202 804
➡️Привет, это Катя, Flutter Dev Friflex

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

Что мы хотим сделать?
Кнопка будет вести себя вот так:
Сначала — кнопка с текстом GET ➡️ нажимаем — она превращается в спиннер (идет подготовка загрузки) ➡️ потом появляется круговая загрузка с иконкой отмены ➡️ когда все скачалось — кнопка показывает OPEN

1. Создаем виджет DownloadButton
Это обычный StatelessWidget, который получает извне текущее состояние загрузки и отображает нужный UI.

enum DownloadStatus {
  notDownloaded,
  fetchingDownload,
  downloading,
  downloaded,
}


2. Показываем форму кнопки
Когда ничего не загружается — кнопка с закругленными краями.
Когда начинается загрузка — кнопка превращается в прозрачный круг (чтобы потом анимировать индикатор поверх него). Пример:

AnimatedContainer(
  duration: transitionDuration,
  decoration: ShapeDecoration(
    shape: isDownloading || isFetching
        ? CircleBorder()
        : StadiumBorder(),
    color: isDownloading || isFetching
        ? Colors.transparent
        : CupertinoColors.lightBackgroundGray,
  ),
  child: ...
);


3. Добавляем текст
GET → когда еще не загружено
OPEN → когда уже загружено
В промежуточных состояниях текст скрыт

AnimatedOpacity(
  opacity: isDownloading || isFetching ? 0.0 : 1.0,
  duration: transitionDuration,
  child: Text(
    isDownloaded ? 'OPEN' : 'GET',
    style: TextStyle(
      fontWeight: FontWeight.bold,
      color: CupertinoColors.activeBlue,
    ),
  ),
);


4. Добавляем индикатор загрузки
Если статус fetchingDownload — отображаем крутящийся спиннер.
Если downloading — прогресс-бар и иконка «стоп» по центру, чтобы отменить загрузку.

Stack(
  alignment: Alignment.center,
  children: [
    CircularProgressIndicator(value: progress),
    if (isDownloading)
      Icon(Icons.stop, size: 14, color: CupertinoColors.activeBlue),
  ],
);


5. Обработка нажатий
Когда пользователь нажимает кнопку — вызывается соответствующий колбэк:

void _onPressed() {
  switch (status) {
    case DownloadStatus.notDownloaded:
      onDownload();
      break;
    case DownloadStatus.downloading:
      onCancel();
      break;
    case DownloadStatus.downloaded:
      onOpen();
      break;
    case DownloadStatus.fetchingDownload:
      break;
  }
}


🟢В итоге — получаем кнопку с красивой анимацией и демонстрацией происходящего.

Подробнее можно прочитать в официальной документации.
  • 🔥 11
  • ❤ 7
  • 👍 5
More from @flutterfriendly
  1. May 14, 2026👀Какой сложный вопрос или тема по Flutter вас сейчас беспокоят? Может, задача не идет, ба…
  2. Apr 17, 2026💭Привет! Это Роза, Flutter-разработчица Friflex! Уверена, многие из вас знакомы с Dart De…
  3. Apr 8, 2026Привет, друзья! Делимся нашей страничкой на Хабре, чтобы всегда оставаться на связи. Там е…
  4. Apr 3, 2026🌸Апрель в календаре и на экране Весна зовет обновлять визуальное: убирать темные темы и в…
  5. Apr 1, 2026Всегда с нетерпением ждем этого дня, чтобы сделать подборку ИТ-мемов Пусть поводов для улы…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →