Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 142
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме FlutterВсе вопросы
FlutterMiddleТеория

Каков жизненный цикл виджета StatefulWidget?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Жизненный цикл StatefulWidget: createState → initState (инициализация) → didChangeDependencies → build (при каждой перерисовке) → didUpdateWidget (при смене параметров) → deactivate → dispose (освобождение ресурсов).

1. createState()

Фреймворк вызывает этот метод при первой вставке виджета в дерево. Создаёт объект State:

class ProfilePage extends StatefulWidget {
  final String userId;
  const ProfilePage({super.key, required this.userId});

  @override
  State<ProfilePage> createState() => _ProfilePageState();
}

Жизненный цикл StatefulWidget

StatefulWidget состоит из двух классов: неизменяемого виджета и отдельного объекта State, который хранит изменяемое состояние и управляет жизненным циклом.

Методы жизненного цикла в порядке вызова

2. initState()

Вызывается один раз после создания State. Место для инициализации: контроллеров, подписок, асинхронных запросов:

class _ProfilePageState extends State<ProfilePage> {
  late final TextEditingController _nameController;
  StreamSubscription? _subscription;

  @override
  void initState() {
    super.initState(); // обязательно первым
    _nameController = TextEditingController();
    _loadUser(); // запустить асинхронную загрузку
    _subscription = userStream.listen(_onUserUpdate);
  }

  Future<void> _loadUser() async {
    final user = await UserService.fetch(widget.userId);
    if (mounted) { // проверяем перед setState
      setState(() => _user = user);
    }
  }
}

3. didChangeDependencies()

Вызывается после initState() и при изменении InheritedWidget, от которого зависит State. Безопасное место для обращения к MediaQuery, Theme, провайдерам:

@override
void didChangeDependencies() {
  super.didChangeDependencies();
  // Theme.of(context) безопасен здесь, но не в initState()
  final locale = Localizations.localeOf(context);
  _formatter = NumberFormat.currency(locale: locale.toString());
}

4. build()

Вызывается каждый раз, когда нужно отрисовать виджет — после setState(), смены зависимостей или перестройки родителя. Должен быть чистым и быстрым:

@override
Widget build(BuildContext context) {
  if (_user == null) return const CircularProgressIndicator();
  return Text(_user!.name);
}

5. didUpdateWidget()

Вызывается когда родитель перестраивает виджет с новыми параметрами. Старый виджет доступен через oldWidget:

@override
void didUpdateWidget(ProfilePage oldWidget) {
  super.didUpdateWidget(oldWidget);
  if (oldWidget.userId != widget.userId) {
    // userId изменился — перезагружаем данные
    _loadUser();
  }
}

6. setState()

Не метод жизненного цикла, но ключевой метод: уведомляет фреймворк о необходимости перерисовки. Вызывает build() для этого State и его поддерева.

7. deactivate()

Вызывается при временном удалении State из дерева (например, при навигации). Редко используется напрямую.

8. dispose()

Вызывается при окончательном удалении из дерева. Место для освобождения ресурсов:

@override
void dispose() {
  _nameController.dispose();
  _subscription?.cancel();
  _animationController.dispose();
  super.dispose(); // обязательно последним
}

Полный пример с жизненным циклом

class _ProfilePageState extends State<ProfilePage> {
  User? _user;
  late final TextEditingController _nameController;

  @override
  void initState() {
    super.initState();
    _nameController = TextEditingController();
    _loadUser();
  }

  @override
  void didUpdateWidget(ProfilePage oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (oldWidget.userId != widget.userId) _loadUser();
  }

  Future<void> _loadUser() async {
    final user = await UserService.fetch(widget.userId);
    if (mounted) setState(() => _user = user);
  }

  @override
  Widget build(BuildContext context) =>
      _user == null ? const CircularProgressIndicator() : Text(_user!.name);

  @override
  void dispose() {
    _nameController.dispose();
    super.dispose();
  }
}

Подводные камни

  • Вызов setState() в dispose() — гарантированный крэш; всегда проверяйте mounted перед setState() после async-операций.
  • super.initState() должен вызываться первым, super.dispose() — последним; нарушение порядка приводит к assertion errors.
  • Использование context в initState() — допустимо только через WidgetsBinding.instance.addPostFrameCallback, так как виджет ещё не встроен в дерево.
  • Забытый dispose() для AnimationController, TextEditingController или StreamSubscription — утечка памяти.
  • Обращение к widget.* в initState() — корректно; обращение к Theme.of(context) в initState() — нет (контекст ещё не готов).
  • didChangeDependencies() может вызываться несколько раз — размещайте в нём только идемпотентные операции или защищайте флагом.

Частые вопросы на собеседовании

  • Как работает управление состоянием (state management) во Flutter? Назовите распространённые решения.
  • Как работает дерево виджетов (widget tree) во Flutter (widget tree, element tree, render tree)?
  • Каковы лучшие практики оптимизации производительности Flutter?
  • В чём разница между StatelessWidget и StatefulWidget?

Типичные ошибки

  • Сводить «Каков жизненный цикл виджета StatefulWidget» к синтаксису и не объяснять element tree.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии flutter-11.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

Что проверяет интервьюер

  • Формулирует точную модель для «Каков жизненный цикл виджета StatefulWidget» и подтверждает ее корректным примером.
  • Умеет связать ответ с render tree, тестированием и отладкой на устройстве.
  • Называет ограничения подхода flutter-11, включая производительность, память и сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме Flutter →

Источники

  • https://docs.flutter.dev/ui
←Предыдущий вопросВ чём разница между `StatelessWidget` и `StatefulWidget`?Следующий вопрос→Что такое `BuildContext` во Flutter и для чего он используется?

Связанные темы

Fluttermemory-lifecycle-debuggingMobile-Engineeringui-rendering-performance