Start Debugging

Flutter vs React Native vs .NET MAUI: ¿cuál deberías elegir para un nuevo proyecto móvil en 2026?

Para una aplicación móvil nueva en 2026, elige Flutter 3.44 cuando importen una UI idéntica píxel a píxel y el presupuesto de animación, React Native 0.82 cuando tu equipo ya viva en TypeScript y necesites un hermano real en el navegador, y .NET MAUI 11 cuando iOS y Android sean parte de un producto .NET más amplio y necesites soporte de primera mano de Microsoft.

Para una nueva aplicación de iOS y Android que empieza hoy, la respuesta honesta es: elige Flutter 3.44 si la UI idéntica píxel a píxel, la animación a 120 Hz sin tirones y una única base de código en Dart son las prioridades. Elige React Native 0.82 si tu equipo de ingeniería es TypeScript primero, quieres el ecosistema de paquetes JS a la mano y una futura versión para navegador está dentro del alcance. Elige .NET MAUI 11 si móvil es una de las superficies de un producto .NET 11 más amplio y Microsoft en el contrato de soporte no es negociable. El rendimiento es un empate en el 95% de las aplicaciones de negocio. El encaje del equipo y el encaje del ecosistema eligen por ti.

Este artículo cubre Flutter 3.44 (estable desde mayo de 2026, paquetes de Material 3 separados), React Native 0.82 (estable desde abril de 2026, New Architecture obligatoria, Bridgeless por defecto) y .NET MAUI 11 (versión preliminar al momento de escribir, GA en noviembre de 2026, CoreCLR por defecto en Android e iOS). Las tres publican en iOS 18 y Android 15+, las tres soportan hot reload, y las tres tienen ejemplos en producción en la App Store y Play Store. Las diferencias que realmente deciden un proyecto son el lenguaje, el modelo de renderizado, la madurez del ecosistema y a qué plataforma puedes llevar al equipo sin reescribir el backend.

Qué es cada uno en 2026

Flutter 3.44 es un toolkit de UI Dart primero, renderizado con Skia. Dibuja todo por sí mismo: un Button no es un UIButton ni un AppCompatButton, son los píxeles que el motor de Flutter dibujó basándose en el widget Material o Cupertino que usaste. Los usuarios de iOS obtienen widgets con tema Cupertino que se ven nativos, los usuarios de Android obtienen widgets Material 3, pero el framework controla cada layout y gesto. La versión 3.44 movió material y cupertino a paquetes separados distribuidos vía Swift Package Manager del lado de iOS, lo que hace más fáciles de rastrear los deltas a nivel de módulo pero añade un costo único de migración en tu pubspec.yaml.

React Native 0.82 es un framework de JavaScript / TypeScript que mapea a vistas nativas de iOS y Android a través de un puente de turbo-modules. Desde la 0.78 la New Architecture (renderer Fabric + TurboModules + JSI) ha sido la predeterminada para proyectos nuevos; desde la 0.82 el puente legado se eliminó por completo. El modo Bridgeless significa que JavaScript llama a código nativo de manera síncrona cuando es posible, lo que hace que la queja histórica de “RN se siente con lag” sea sustancialmente menos cierta en 2026 que en 2022. El motor JS es Hermes por defecto en ambas plataformas, y expo es el orquestador de build de facto: una plantilla react-native init desnuda aún existe, pero ya no es el camino recomendado para aplicaciones nuevas.

.NET MAUI 11 es el framework de primera mano de Microsoft. Envuelve los controles nativos de la plataforma: un Button en MAUI es un UIButton en iOS, un AppCompatButton en Android, un Microsoft.UI.Xaml.Controls.Button en Windows y un NSButton en Mac Catalyst. CoreCLR ahora es el runtime predeterminado en Android e iOS en .NET 11, lo que cierra la mayor parte de la brecha histórica de tiempo de inicio con Flutter y RN. MAUI comparte la misma pila de XAML / C# con WinUI 3 y Blazor Hybrid, así que tiene más sentido cuando iOS y Android son hermanos de un producto de escritorio Windows o un producto web Blazor, no cuando móvil es todo el universo.

La matriz de características

CapacidadFlutter 3.44React Native 0.82.NET MAUI 11
Lenguaje principalDart 3.7TypeScript / JavaScriptC# 14
Modelo de renderizadoSkia, píxeles idénticos por plataformavistas nativas vía Fabric / TurboModulescontroles nativos por plataforma
iOS
Android
Escritorio Windowssí (estable desde 3.16)comunidad (react-native-windows)sí (WinUI 3)
Escritorio macOSsí (estable desde 3.16)comunidad (react-native-macos)Mac Catalyst
Escritorio Linuxsí (estable desde 3.10)nono
Web (navegador)versión preliminar, no producción para aplicaciones grandessí (vía React DOM, compartición de código limitada)no (Blazor Hybrid es aparte)
Hot reloadsub-segundo, con estadoFast Refresh, con estadosí (.NET 11)
Runtime predeterminado en Android (.NET 11)Dart compilado AOTHermes JSCoreCLR
IDE predeterminadoVS Code, Android StudioVS Code, WebStormVisual Studio 2026, Rider
Ecosistema de paquetespub.dev, 50k+ paquetesnpm, el mundo JS enteroNuGet, ecosistema .NET
Soporte de primera manoGoogleMeta + comunidadMicrosoft
Línea base de New Architecture / runtimeAOT siempre activoobligatoria desde 0.80CoreCLR por defecto desde .NET 11 Preview 4
LicenciaBSD-3MITMIT
Gestión de estado por defectoRiverpod, Bloc, ProviderRedux Toolkit, Zustand, TanStack QueryCommunityToolkit.Mvvm

Tres filas deciden la mayoría de los proyectos: lenguaje principal, modelo de renderizado y soporte de primera mano. El resto es refinamiento. Si tu equipo de ingeniería escribe TypeScript y tu backend es Node, el esfuerzo para llegar a React Native es de días, no meses. Si tu equipo escribe C# contra .NET y Entity Framework Core, MAUI les permite compartir DTOs, validación e incluso ViewModels con la capa web. Flutter es el único donde el lenguaje productivo es esencialmente único del framework, lo que es un impuesto real si tu equipo nunca ha escrito Dart.

Cuándo elegir Flutter 3.44

Elige Flutter cuando:

Un main.dart mínimo de 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')),
      );
}

La bandera useMaterial3: true ahora es la predeterminada en 3.44 (consulta la separación de paquetes Material y Cupertino de Flutter 3.44 para ver qué cambió bajo el capó), así que puedes omitir la línea en proyectos nuevos.

Cuándo elegir React Native 0.82

Elige React Native cuando:

Un App.tsx mínimo de 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 es ahora el scaffold predeterminado. npx create-expo-app para un proyecto nuevo, expo prebuild si necesitas un módulo nativo personalizado, y EAS Build para artefactos .ipa y .aab compilados en la nube. El “bare workflow” aún existe, pero el equipo no lo ha recomendado para proyectos nuevos desde Expo SDK 51.

Cuándo elegir .NET MAUI 11

Elige MAUI cuando:

Un MauiProgram.cs mínimo de 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();
    }
}

El cambio a CoreCLR por defecto en .NET 11 Preview 4 cierra la mayor parte de la brecha histórica de arranque en frío de MAUI en Android e iOS, que es la actualización individual más grande del framework desde 8.0 GA.

El benchmark: arranque en frío y tamaño del paquete

Los números a continuación son de una plantilla “Hello World” por framework, compilada en release e instalada en un Pixel 8 (Android 15) y un iPhone 15 (iOS 18.4). Arranque en frío medido desde am start (Android) y una traza Launch de Instruments (iOS), sin preoptimización de perfil, sin Native AOT para MAUI, Impeller activado para Flutter, Hermes + Fabric para RN.

MétricaFlutter 3.44React Native 0.82MAUI 11 (CoreCLR)
Arranque en frío Android, solo código de la app320 ms450 ms480 ms
Tamaño APK Android, release, arquitectura única19 MB24 MB22 MB
Arranque en frío iOS, solo código de la app280 ms340 ms360 ms
Tamaño IPA iOS, release28 MB35 MB38 MB
Huella de memoria en reposo (Android)78 MB110 MB132 MB
Frames por segundo bajo scroll pesado119.2117.8118.4

Flutter gana el arranque en frío en todos los frentes porque su motor es Dart compilado AOT desde el lanzamiento y no levanta primero un runtime JS o CoreCLR. React Native está más cerca de MAUI de lo que solía estar porque Hermes + Fabric pagan su costo de inicialización una vez, no por fotograma. MAUI sobre CoreCLR está más cerca de RN que el número de MAUI-sobre-Mono que pudiste haber visto citado (que era ~720 ms en Android para la misma plantilla). La fila de FPS es esencialmente un empate: las tres renderizan al techo de refresco del dispositivo una vez que la aplicación está arriba. El arranque en frío importa para la percepción del lanzamiento de la aplicación. Los FPS sostenidos importan para la sensación dentro de la aplicación. La primera fila decide “se siente ágil al tocar el icono”. La última fila decide “la aplicación se siente moderna”. La brecha en la primera fila es real pero pequeña; la brecha en la última fila no es medible.

El obstáculo que decide por ti

Tres cosas fuerzan la decisión independientemente de la preferencia:

  1. El lenguaje existente de tu equipo. Un equipo de TypeScript elige React Native. Un equipo de C# elige MAUI. Solo un equipo sin pila incumbente, o uno específicamente dispuesto a aprender Dart, elige Flutter. El costo de enseñar a un ingeniero senior un tercer lenguaje que solo usará en el proyecto móvil es real, y no aparece en una tabla de matriz de características.
  2. La web está en el roadmap, aunque no en la v1. Si “publicaremos una versión web eventualmente” está en la especificación del producto, RN con react-native-web o Flutter Web son los dos caminos viables, y solo RN está listo para producción en 2026. Flutter Web es un destino de calidad preliminar para aplicaciones no triviales; el equipo de Flutter lo ha dicho. MAUI no tiene historia de navegador (Blazor Hybrid es una pila aparte con un modelo de programación distinto). Si eliges MAUI y luego necesitas una versión web, estás escribiendo una segunda aplicación.
  3. Módulos nativos de primera mano que no puedes abstraer. Diálogos de App Tracking Transparency, App Clips, Live Activities, widgets Dynamic Island, mosaicos Wear OS, Health Connect, App Intents. Flutter tiene plugins para la mayoría de estos; algunos siguen siendo mantenidos por la comunidad. RN tiene la cobertura de plugins más amplia gracias al ecosistema Expo. MAUI expone las APIs nativas de la plataforma directamente porque el control subyacente es el widget real de la plataforma, así que los huecos de plugins por característica son menos frecuentes. Si la especificación de tu producto lista tres o más características específicas de la plataforma iOS en el primer trimestre, MAUI tiene la menor fricción; si lista tres o más características específicas de Android, Flutter o RN son más fáciles porque el ecosistema de plugins es más amplio.

Un ejemplo práctico de cómo divergen los ecosistemas: integración con IA. El SDK de Anthropic para TypeScript y Python es de primera mano; el SDK de Anthropic para Dart es mantenido por la comunidad; el SDK de Anthropic para .NET es mantenido por la comunidad pero está cubierto por Microsoft.Extensions.AI en .NET 11, que es de primera mano para la capa de abstracción si no para el cliente del proveedor. Si tu aplicación móvil hace llamadas directas a IA, RN es el camino con menor fricción en 2026 por un margen notable.

Recomendación reformulada

Para una nueva aplicación móvil que empieza hoy:

Si estás sopesando una migración desde una aplicación existente:

Relacionados

Fuentes

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Volver