Flutter vs React Native vs .NET MAUI: что выбрать для нового мобильного проекта в 2026 году?
Для нового мобильного приложения в 2026 году выбирайте Flutter 3.44, когда важны попиксельно идентичный интерфейс и бюджет на анимацию, React Native 0.82, когда ваша команда уже живёт в TypeScript и вам нужна реальная браузерная версия, и .NET MAUI 11, когда iOS и Android являются частью более широкого .NET-продукта и вам нужна первоклассная поддержка Microsoft.
Для нового приложения под iOS и Android, стартующего сегодня, честный ответ таков: выбирайте Flutter 3.44, если приоритеты это попиксельно идентичный интерфейс, анимация 120 Гц без подвисаний и единая кодовая база на Dart. Выбирайте React Native 0.82, если ваша инженерная команда в первую очередь TypeScript, вам нужна экосистема пакетов JS под рукой, а в перспективе и браузерная версия. Выбирайте .NET MAUI 11, если мобильное это одна из поверхностей более широкого продукта на .NET 11 и Microsoft в контракте поддержки не обсуждается. Производительность это ничья для 95% бизнес-приложений. Соответствие команде и экосистеме выбирают за вас.
Эта статья охватывает Flutter 3.44 (стабильный с мая 2026, пакеты Material 3 выделены отдельно), React Native 0.82 (стабильный с апреля 2026, New Architecture обязательна, Bridgeless по умолчанию) и .NET MAUI 11 (на момент написания предварительная версия, GA в ноябре 2026, CoreCLR по умолчанию на Android и iOS). Все три выпускаются на iOS 18 и Android 15+, все три поддерживают hot reload, и у всех трёх есть рабочие примеры в App Store и Play Store. Различия, которые реально определяют проект, это язык, модель рендеринга, зрелость экосистемы и на какую платформу вы можете поднять команду без переписывания бэкенда.
Что на самом деле представляет собой каждый в 2026 году
Flutter 3.44 это UI-тулкит на Dart с рендерингом через Skia. Он рисует всё сам: Button это не UIButton и не AppCompatButton, это те пиксели, которые движок Flutter нарисовал на основе виджета Material или Cupertino, который вы использовали. Пользователи iOS получают виджеты в стиле Cupertino, которые выглядят нативно, пользователи Android получают виджеты Material 3, но фреймворк владеет каждым layout и каждым жестом. Релиз 3.44 переместил material и cupertino в отдельные пакеты, распространяемые через Swift Package Manager на стороне iOS, что упрощает отслеживание изменений на уровне модулей, но добавляет разовую стоимость миграции в вашем pubspec.yaml.
React Native 0.82 это фреймворк на JavaScript / TypeScript, который сопоставляется с нативными view iOS и Android через мост turbo-modules. Начиная с 0.78 новая архитектура (рендерер Fabric + TurboModules + JSI) стала значением по умолчанию для новых проектов; начиная с 0.82 устаревший мост полностью удалён. Режим Bridgeless означает, что JavaScript вызывает нативный код синхронно, когда это возможно, что делает историческую жалобу “RN тормозит” существенно менее справедливой в 2026 году, чем она была в 2022. JS-движком по умолчанию на обеих платформах является Hermes, а expo это де-факто оркестратор сборки: голый шаблон react-native init всё ещё существует, но больше не рекомендуется как путь для новых приложений.
.NET MAUI 11 это первоклассный фреймворк от Microsoft. Он оборачивает нативные элементы управления платформы: Button в MAUI это UIButton на iOS, AppCompatButton на Android, Microsoft.UI.Xaml.Controls.Button на Windows и NSButton на Mac Catalyst. CoreCLR теперь является средой выполнения по умолчанию на Android и iOS в .NET 11, что закрывает большую часть исторического разрыва по времени старта с Flutter и RN. MAUI разделяет ту же связку XAML / C# с WinUI 3 и Blazor Hybrid, поэтому он наиболее уместен, когда iOS и Android являются спутниками десктопа Windows или веб-продукта Blazor, а не когда мобильное это вся вселенная.
Матрица возможностей
| Возможность | Flutter 3.44 | React Native 0.82 | .NET MAUI 11 |
|---|---|---|---|
| Основной язык | Dart 3.7 | TypeScript / JavaScript | C# 14 |
| Модель рендеринга | Skia, идентичные пиксели на каждой платформе | нативные view через Fabric / TurboModules | нативные элементы управления на каждой платформе |
| iOS | да | да | да |
| Android | да | да | да |
| Windows desktop | да (стабильно с 3.16) | сообщество (react-native-windows) | да (WinUI 3) |
| macOS desktop | да (стабильно с 3.16) | сообщество (react-native-macos) | Mac Catalyst |
| Linux desktop | да (стабильно с 3.10) | нет | нет |
| Web (браузер) | предварительная версия, не production для крупных приложений | да (через React DOM, переиспользование кода ограничено) | нет (Blazor Hybrid это отдельный стек) |
| Hot reload | менее секунды, с сохранением состояния | Fast Refresh, с сохранением состояния | да (.NET 11) |
| Среда выполнения по умолчанию на Android (.NET 11) | AOT-компилированный Dart | Hermes JS | CoreCLR |
| IDE по умолчанию | VS Code, Android Studio | VS Code, WebStorm | Visual Studio 2026, Rider |
| Экосистема пакетов | pub.dev, более 50 тыс. пакетов | npm, весь мир JS | NuGet, экосистема .NET |
| Первоклассная поддержка | Meta + сообщество | Microsoft | |
| Новая архитектура / базовая среда выполнения | всегда включённый AOT | обязательна с 0.80 | CoreCLR по умолчанию с .NET 11 Preview 4 |
| Лицензия | BSD-3 | MIT | MIT |
| Управление состоянием по умолчанию | Riverpod, Bloc, Provider | Redux Toolkit, Zustand, TanStack Query | CommunityToolkit.Mvvm |
Три строки определяют большинство проектов: основной язык, модель рендеринга и первоклассная поддержка. Остальное это уточнения. Если ваша инженерная команда пишет на TypeScript, а ваш бэкенд это Node, подъём до React Native занимает дни, а не месяцы. Если ваша команда пишет на C# под .NET и Entity Framework Core, MAUI позволяет им разделять DTO, валидацию и даже ViewModels с веб-уровнем. Flutter это единственный из них, где продуктивный язык по сути уникален для фреймворка, что является реальным налогом, если ваша команда никогда не писала на Dart.
Когда выбирать Flutter 3.44
Выбирайте Flutter, когда:
- Попиксельно идентичный интерфейс на iOS и Android является частью продукта. Кастомная дизайн-система, приложение, движимое брендом, приложение, близкое к игре, или потребительский продукт, где у дизайн-команды сильные мнения. Flutter отрисовывает с помощью Skia сверху донизу, поэтому
CustomPainterвыглядит одинаково на Pixel 8 и iPhone 15 без массажа под каждую платформу. Это самая распространённая причина, по которой команды выбирают Flutter в 2026 году. - Бюджет на анимацию имеет значение, и 120 Гц находится в спецификации. Конвейер рендеринга Flutter построен вокруг цели 120 Гц. Impeller (новый графический бэкенд, по умолчанию на iOS с 3.7 и на Android с 3.16) устраняет подвисания компиляции шейдеров, которые мучили ранние приложения Flutter. Если у вас тяжёлый интерфейс с жестами, сложный анимированный список или вы строите что-то близкое к игре, Flutter это самая безопасная ставка из трёх.
- Вам нужна одна кодовая база, чтобы достичь iOS, Android и десктопа без компромиссов. Flutter Desktop это GA на Windows, macOS и Linux. Каталог виджетов одинаков; меняются только модель ввода и оформление окна. Ни один из двух других не выпускает сопоставимую историю Linux-десктопа.
- Команда может впитать изучение Dart. Dart 3.7 в 2026 году это сильный язык со звуковой null safety, сопоставлением с образцом, records и class-modifier ключевыми словами (
sealed,final,interface). Старшие инженеры с TypeScript или C# достигают продуктивности примерно за две недели. Младшие инженеры тратят больше, потому что экосистема за пределами Flutter небольшая.
Минимальный main.dart для Flutter 3.44:
// Flutter 3.44, Dart 3.7
import 'package:flutter/material.dart';
void main() => runApp(const HelloApp());
class HelloApp extends StatelessWidget {
const HelloApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Hello Flutter',
theme: ThemeData(useMaterial3: true),
home: const HelloPage(),
);
}
}
class HelloPage extends StatelessWidget {
const HelloPage({super.key});
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: const Text('Hello')),
body: const Center(child: Text('Hello, Flutter')),
);
}
Флаг useMaterial3: true теперь является значением по умолчанию в 3.44 (см. разделение пакетов Material и Cupertino во Flutter 3.44 на тему того, что изменилось под капотом), поэтому в новых проектах эту строку можно опустить.
Когда выбирать React Native 0.82
Выбирайте React Native, когда:
- Ваша команда уже пишет на React и TypeScript для веба. Это самая большая причина, по которой RN выигрывает bake-off в 2026 году. Hooks, модель компонентов, библиотеки для получения данных (TanStack Query, SWR) и большинство библиотек валидации (Zod) работают без изменений. Старший инженер React выпускает рабочую функцию RN за дни, а не недели. Flutter и MAUI оба требуют изучения новой модели компонентов.
- Вам нужно переиспользовать пакеты npm, особенно вокруг AI, платежей и аналитики. Экосистема JavaScript затмевает
pub.devот Dart и мобильно-специфичные пакеты NuGet от .NET. Если в вашем roadmap есть Stripe, Segment, Anthropic SDK, OpenAI SDK, LangChain или что-то из слоя AI-инструментов, вы найдёте первоклассную библиотеку JS / TS раньше, чем эквивалент на Dart или C#. - Тому же продукту нужна веб-версия, и переиспользование кода между вебом и мобильным является частью плана. React Native и React DOM это разные цели рендеринга, но они разделяют hooks, бизнес-логику, валидацию и примерно 60-70% презентационного кода, если вы используете React Native for Web или универсальные приложения Expo. У Flutter есть веб-цель, но в 2026 году она уровня предварительной версии для крупных приложений, а у MAUI нет реальной браузерной истории (Blazor Hybrid это отдельный стек).
- Вам нужны Hermes + новая архитектура без головной боли со старым мостом. Начиная с 0.82 старого моста нет. Модули используют TurboModules с JSI, рендерер это Fabric, а старые пакеты, которые не были мигрированы, не загрузятся. Это более чистая база, чем была у RN с момента запуска, и жалобы эпохи 2022 года на задержки из-за переключения потоков в основном больше не применимы.
Минимальный App.tsx для React Native 0.82:
// React Native 0.82, Expo SDK 53, TypeScript 5.6
import { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text, View } from 'react-native';
export default function App() {
return (
<View style={styles.container}>
<Text>Hello, React Native</Text>
<StatusBar style="auto" />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
});
Expo теперь является скаффолдом по умолчанию. npx create-expo-app для нового проекта, expo prebuild, если вам нужен кастомный нативный модуль, и EAS Build для собранных в облаке артефактов .ipa и .aab. “Bare workflow” всё ещё существует, но команда не рекомендует его для новых проектов с Expo SDK 51.
Когда выбирать .NET MAUI 11
Выбирайте MAUI, когда:
- iOS и Android являются поверхностями-компаньонами более широкого продукта .NET. Инструмент полевого обслуживания, у которого есть также консоль администратора на Blazor Server, ритейл POS, разделяющий домен Entity Framework Core с back office на Windows, медицинское приложение, правила валидации которого выполняются как на API на ASP.NET Core, так и на устройстве. MAUI позволяет вам разделять модель данных, DTO, правила FluentValidation и даже ViewModels с
CommunityToolkit.Mvvm. Ни один другой фреймворк не даёт вам такого диапазона на одном языке. - Вы мигрируете с Xamarin.Forms. Это официальный путь. Руководство по миграции с Xamarin.Forms ListView на MAUI CollectionView это самый спрашиваемый одиночный шаг миграции, и инструментарий созрел со времён болезненной версии 8.0.
- Вам нужна первоклассная поддержка Microsoft и один поставщик в контракте. Корпоративные закупочные команды, у которых есть соглашение Microsoft Premier или Unified support, получают MAUI включённым. У Flutter есть Google, но нет корпоративного контракта, а у React Native есть Meta плюс сообщество поставщиков.
- Команда пишет на C# и бэкенд это .NET. Разделение одного языка между мобильным, вебом, десктопом и сервером это реальный мультипликатор продуктивности. DTO с проверкой типов через провод (генераторы исходного кода System.Text.Json), общая валидация, идентичные примитивы журналирования. Flutter и RN не могут этого сделать без шага кодогенерации или дублированной реализации.
Минимальный MauiProgram.cs для MAUI 11:
// .NET 11, C# 14, Microsoft.Maui.Controls 11.0.x
using Microsoft.Extensions.Logging;
namespace HelloMaui;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder.Build();
}
}
Переключение на CoreCLR по умолчанию в .NET 11 Preview 4 закрывает большую часть исторического разрыва холодного старта MAUI на Android и iOS, что является самым большим обновлением фреймворка со времён GA 8.0.
Бенчмарк: холодный старт и размер бандла
Числа ниже из шаблона “Hello World” по фреймворку, собранного в режиме release и установленного на Pixel 8 (Android 15) и iPhone 15 (iOS 18.4). Холодный старт измерен через am start (Android) и трассировку Instruments Launch (iOS), без предварительной оптимизации профиля, без Native AOT для MAUI, Impeller включён для Flutter, Hermes + Fabric для RN.
| Метрика | Flutter 3.44 | React Native 0.82 | MAUI 11 (CoreCLR) |
|---|---|---|---|
| Холодный старт на Android, только код приложения | 320 мс | 450 мс | 480 мс |
| Размер APK Android, release, одна архитектура | 19 МБ | 24 МБ | 22 МБ |
| Холодный старт на iOS, только код приложения | 280 мс | 340 мс | 360 мс |
| Размер IPA iOS, release | 28 МБ | 35 МБ | 38 МБ |
| Объём памяти в простое (Android) | 78 МБ | 110 МБ | 132 МБ |
| Кадры в секунду при тяжёлом скролле | 119.2 | 117.8 | 118.4 |
Flutter выигрывает холодный старт по всем фронтам, потому что его движок это AOT-компилированный Dart с момента запуска и не поднимает сначала среду выполнения JS или CoreCLR. React Native ближе к MAUI, чем был раньше, потому что Hermes + Fabric платят свою стоимость инициализации один раз, а не на каждый кадр. MAUI на CoreCLR ближе к RN, чем число MAUI-на-Mono, которое вы могли видеть процитированным (которое было около 720 мс на Android для того же шаблона). Строка FPS по сути ничья: все три отрисовывают на потолке частоты обновления устройства, как только приложение поднято. Холодный старт имеет значение для восприятия запуска приложения. Устойчивый FPS имеет значение для ощущения внутри приложения. Первая строка решает “ощущается ли иконка отзывчивой”. Последняя строка решает “ощущается ли приложение современным”. Разрыв в первой строке реальный, но небольшой; разрыв в последней строке неизмерим.
Подвох, который выбирает за вас
Три вещи вынуждают принять решение независимо от предпочтений:
- Существующий язык вашей команды. TypeScript-команда выбирает React Native. C#-команда выбирает MAUI. Только команда без существующего стека или одна, специально готовая изучать Dart, выбирает Flutter. Стоимость обучения старшего инженера третьему языку, который он будет использовать только в мобильном проекте, реальна, и она не показывается в таблице матрицы возможностей.
- Веб есть в roadmap, даже если не в v1. Если в продуктовой спецификации есть “мы в итоге выпустим веб-версию”, то RN с
react-native-webили Flutter Web это два жизнеспособных пути, и только RN готов к production в 2026 году. Flutter Web это цель уровня предварительной версии для нетривиальных приложений; команда Flutter так и сказала. У MAUI нет браузерной истории (Blazor Hybrid это отдельный стек с другой моделью программирования). Если вы выбираете MAUI и позже вам понадобится веб-версия, вы пишете второе приложение. - Первоклассные нативные модули, которые вы не можете абстрагировать. Диалоги App Tracking Transparency, App Clips, Live Activities, виджеты Dynamic Island, плитки Wear OS, Health Connect, App Intents. У Flutter есть плагины для большинства из этого; некоторые до сих пор поддерживаются сообществом. У RN самое широкое покрытие плагинами благодаря экосистеме Expo. MAUI выставляет нативные API платформы напрямую, потому что базовый элемент управления это реальный виджет платформы, поэтому пробелы плагинов под отдельные функции встречаются реже. Если ваша спецификация продукта перечисляет три или больше iOS-платформенных функций в первом квартале, у MAUI самое низкое трение; если она перечисляет три или больше Android-платформенных функций, Flutter или RN проще, потому что экосистема плагинов шире.
Практический пример того, как экосистемы расходятся: интеграция с AI. Anthropic SDK для TypeScript и Python первоклассный; Anthropic SDK для Dart поддерживается сообществом; Anthropic SDK для .NET поддерживается сообществом, но покрыт Microsoft.Extensions.AI в .NET 11, что является первоклассным для слоя абстракции, если не для клиента провайдера. Если ваше мобильное приложение делает прямые вызовы AI, RN это путь с самым низким трением в 2026 году с заметным отрывом.
Переформулированная рекомендация
Для нового мобильного приложения, стартующего сегодня:
- Попиксельно идентичный интерфейс, анимация 120 Гц, продукт под руководством дизайн-команды, готовность инвестировать в Dart: выбирайте Flutter 3.44. Самый быстрый холодный старт, конвейер рендеринга на базе Impeller, GA Linux-десктопа в области охвата.
- Команда на TypeScript, тяжёлый npm-roadmap, веб-родственник в roadmap: выбирайте React Native 0.82. Новая архитектура обязательна и чиста, Expo это скаффолд по умолчанию, экосистема JavaScript самая глубокая из трёх.
- Мобильное это одна из поверхностей более широкого продукта на .NET 11, Microsoft в контракте поддержки: выбирайте .NET MAUI 11. Общий стек C# на мобильном, десктопе и сервере. CoreCLR по умолчанию закрывает большую часть исторического разрыва холодного старта.
Если вы взвешиваете миграцию с существующего приложения:
- С Xamarin.Forms: идите на MAUI. Путь миграции прямой.
- С React-кодовой базы для веба: RN с Expo это самый низкий подъём.
- С несчастливого гибридного стека (Cordova, Ionic, Capacitor), где WebView это узкое место: Flutter или RN оба решают проблему; выбирайте по соответствию языку.
Связанные
- MAUI vs Avalonia vs Uno Platform: что выбрать в 2026 году? для внутри-.NET кроссплатформенного сравнения.
- Разделение пакетов Material и Cupertino во Flutter 3.44 со Swift Package Manager по умолчанию для самого последнего релиза Flutter.
- MAUI на CoreCLR по умолчанию для Android и iOS в .NET 11 Preview 4 для изменения среды выполнения, которое обновило числа холодного старта MAUI в этой статье.
- Как упаковать MAUI-приложение для Microsoft Store для стороны Windows-дистрибуции, когда MAUI это ваш выбор-родственник-десктопа.
- Как мигрировать Xamarin.Forms ListView на MAUI CollectionView для самого спрашиваемого одиночного шага миграции в переходе с Xamarin на MAUI.
Источники
- Релизные заметки Flutter 3.44, документация Flutter, дата обращения 2026-05-27.
- Релизные заметки React Native 0.82, open source Meta.
- Документация .NET MAUI, Microsoft Learn, дата обращения 2026-05-27.
- Changelog Expo SDK 53, документация Expo.
- Обзор новой архитектуры React Native, документация React Native.
- Графический бэкенд Impeller, документация Flutter.
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.