Можно ли отказаться от Cupertino-виджетов в Flutter-приложении?

«Можно ли отказаться от Cupertino-виджетов в Flutter-приложении?» — вопрос из категории UI и вёрстка, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, полностью отказаться от Cupertino-виджетов можно, и многие приложения так и делают, особенно если:

  1. Приложение использует только Material Design — единый дизайн для всех платформ
  2. Целевая аудитория в основном на Android
  3. Команда хочет упростить поддержку — один код вместо двух дизайн-систем

Как отказаться:

  1. Удалите зависимость из pubspec.yaml (если она есть):

    # Удалите или закомментируйте эту строку:
    # cupertino_icons: ^1.0.2
  2. Используйте только Material-виджеты:

    MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        useMaterial3: true, // Современный Material Design
      ),
      home: Scaffold(
        appBar: AppBar(title: Text('Material Only')),
        body: Center(
          child: Column(
            children: [
              ElevatedButton(
                onPressed: () {},
                child: Text('Material Button'),
              ),
              Switch(
                value: true,
                onChanged: (value) {},
              ),
            ],
          ),
        ),
      ),
    )

Что вы теряете при отказе от Cupertino:

  • Нативный iOS-вид — приложение будет выглядеть как Android-приложение на iPhone
  • Плавность iOS-анимаций — особенно заметно в CupertinoPicker, CupertinoSlidingSegmentedControl
  • iOS-специфичные паттерны — например, модальные окна с iOS-стилем

Мой опыт:

В корпоративном приложении, где 80% пользователей были на Android, мы использовали только Material Design. Это сократило время разработки на 30%. Однако для B2C-приложения с премиальной аудиторией на iOS я бы добавил Cupertino-виджеты через проверку платформы:

Widget buildPlatformAwareWidget() {
  final isIOS = Theme.of(context).platform == TargetPlatform.iOS;

  return isIOS
      ? CupertinoButton(
          onPressed: () {},
          child: Text('iOS Style'),
        )
      : ElevatedButton(
          onPressed: () {},
          child: Text('Android Style'),
        );
}

Решение зависит от бизнес-требований: если важна максимальная нативность на iOS — используйте Cupertino, если приоритет — скорость разработки и единый дизайн — выбирайте Material.