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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python14 441
  • Облачные технологии10 873
  • QA вакансии3 236
  • Android1 700
  • Инженер данных1 216
  • Продакт-менеджер456

Разработка

  • Backend вакансии1 601
  • iOS1 573
  • AI вакансии776
  • Fullstack вакансии658
  • Frontend вакансии548
  • Mobile вакансии28

По стеку

  • Go7 890
  • Java5 126
  • Node.js1 605
  • Kotlin1 382
  • Rust1 310
  • .NET1 243
  • PHP535
  • C++382
  • C#353

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

  • Kubernetes6 204
  • Linux-инфраструктура4 735
  • DevOps вакансии4 419
  • Terraform / IaC3 428
  • Мониторинг и Observability1 570
  • CI/CD1 465
  • SRE446
  • Кибербезопасность74

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

  • Аналитик данных662
  • Бизнес-аналитик625
  • Data Scientist571
  • Системный аналитик90

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

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

По регионам

  • Вакансии в США32 905
  • Вакансии в Европе14 637
  • Работа в России3 880
  • Вакансии в Канаде3 170

По формату

  • Удалённые вакансии51 011
  • Релокация в США32 905
  • Гибридная работа9 286
  • Офисная работа6 524

По уровню

  • Senior вакансии29 196
  • Middle вакансии12 901
  • Junior вакансии4 717

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

Все компании
  • Wise191 вакансия
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Как обрабатывать deep linking в приложении Flutter?

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

Deep linking во Flutter: настраиваете intent filter (Android) и CFBundleURLSchemes (iOS), используете go_router с path-параметрами для маршрутизации. Пакет app_links обрабатывает cold start через getInitialLink() и warm start через uriLinkStream. Главный риск — пропустить один из двух кейсов запуска.

Базовая настройка с go_router

# pubspec.yaml
dependencies:
  go_router: ^13.0.0
// lib/router.dart
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

final router = GoRouter(
  initialLocation: '/',
  routes: [
    GoRoute(
      path: '/',
      builder: (context, state) => const HomeScreen(),
    ),
    GoRoute(
      // Этот путь откроется при deep link: myapp://product/42
      path: '/product/:id',
      builder: (context, state) {
        final id = state.pathParameters['id']!;
        return ProductScreen(productId: id);
      },
    ),
    GoRoute(
      path: '/promo',
      builder: (context, state) {
        // Query параметры: myapp://promo?code=SALE20
        final code = state.uri.queryParameters['code'];
        return PromoScreen(code: code);
      },
    ),
  ],
);
// lib/main.dart
import 'package:flutter/material.dart';
import 'router.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) => MaterialApp.router(
    routerConfig: router,
    title: 'Deep Link Demo',
  );
}

Что такое deep linking во Flutter

Deep link — это URL, который открывает конкретный экран приложения. Flutter поддерживает три варианта: custom scheme (myapp://product/42), universal links на iOS (https://example.com/product/42 через Associated Domains) и App Links на Android (через Digital Asset Links). С Flutter 3.x рекомендуемый подход — использовать go_router, который нативно интегрируется с механизмом deep link обеих платформ.

Настройка платформ

Android — добавляем intent filter в AndroidManifest.xml:

<!-- android/app/src/main/AndroidManifest.xml -->
<activity android:name=".MainActivity" ...>

  <!-- Custom scheme: myapp://product/42 -->
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" />
  </intent-filter>

  <!-- App Links: https://example.com/product/42 -->
  <intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" android:host="example.com" />
  </intent-filter>

</activity>

iOS — добавляем custom scheme в Info.plist:

<!-- ios/Runner/Info.plist -->
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>myapp</string>
    </array>
  </dict>
</array>

Для Universal Links нужен файл apple-app-site-association на сервере и включение Associated Domains в Xcode Capabilities.

Обработка ссылки, когда приложение уже запущено

go_router слушает incoming links автоматически через Router механизм Flutter. Если нужен кастомный перехват (например, для аналитики), используем app_links:

import 'package:app_links/app_links.dart';
import 'package:go_router/go_router.dart';

class DeepLinkService {
  final GoRouter router;
  DeepLinkService(this.router);

  late final AppLinks _appLinks;

  Future<void> init() async {
    _appLinks = AppLinks();

    // Ссылка, по которой приложение было запущено (cold start)
    final initialUri = await _appLinks.getInitialLink();
    if (initialUri != null) {
      _handleLink(initialUri);
    }

    // Ссылки, когда приложение уже работает (warm start)
    _appLinks.uriLinkStream.listen(
      _handleLink,
      onError: (err) => debugPrint('Deep link error: $err'),
    );
  }

  void _handleLink(Uri uri) {
    // Логируем для аналитики
    debugPrint('Incoming link: $uri');
    // Навигируем через go_router
    router.go(uri.path, extra: uri.queryParameters);
  }
}

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

  • Cold start vs warm start. Ссылка при запуске (приложение не было в памяти) приходит через getInitialLink(). Ссылка при возврате из фона — через stream. Пропустить один из кейсов — частая ошибка.
  • Навигация до готовности роутера. Если router.go() вызвать до инициализации MaterialApp, получим exception. Инициализируйте DeepLinkService в initState или после первого frame через WidgetsBinding.addPostFrameCallback.
  • Аутентификация и редиректы. Приватные экраны должны проверять auth state. В go_router используйте redirect колбэк — он перехватит deep link и отправит на логин с сохранением исходного пути.
  • Universal Links на iOS требуют HTTPS. Домен должен отдавать apple-app-site-association на /.well-known/apple-app-site-association со строгим Content-Type application/json. Любая ошибка — iOS fallback на браузер.
  • App Links на Android требуют верификации. autoVerify=true запускает верификацию при установке. Если assetlinks.json недоступен или содержит ошибку, ссылки открываются в браузере, а не в приложении.
  • Back stack. При open по deep link пользователь ожидает кнопку «Назад» на главный экран. go_router не добавляет автоматически родительские маршруты — используйте ShellRoute или явно управляйте стеком через GoRouter.push вместо go.
  • Тестирование на симуляторе. На iOS Simulator команда xcrun simctl openurl booted 'myapp://product/42', на Android Emulator — adb shell am start -W -a android.intent.action.VIEW -d 'myapp://product/42'. Без тестирования обоих платформ баги в cold start незаметны.

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

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

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

  • Сводить «обрабатывать deep linking в приложении Flutter» к синтаксису и не объяснять frame scheduling.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии flutter-28.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

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

  • Формулирует точную модель для «обрабатывать deep linking в приложении Flutter» и подтверждает ее корректным примером.
  • Умеет связать ответ с platform channel, тестированием и отладкой на устройстве.
  • Называет ограничения подхода flutter-28, включая производительность, память и сопровождение.

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

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

Источники

  • https://docs.flutter.dev/ui/navigation
←Предыдущий вопросЧто такое `FutureBuilder` и `StreamBuilder` и когда использовать каждый?Следующий вопрос→В чём разница между `Column` и `ListView`? Когда использовать `ListView.builder`?

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

FlutterMobile-Engineeringnavigation-architecture