Saltar al contenido
Framework Ecosystems LabsUn contrato, muchos ecosistemas, la misma prueba.

🐦 Flutter — 2017#

⬅️ Atlas · 🎯 Ecosistema Dart · 🗂️ Índice

Flutter toma la decisión más radical del catálogo en interfaces multiplataforma: no usa los componentes del sistema operativo. Dibuja cada píxel con su propio motor gráfico, igual que un videojuego. Todo lo bueno y todo lo malo de Flutter sale de ahí.

🎯 Por qué está en este programa Porque es la columna opuesta a React Native en la comparación del módulo 09: dibujar propio frente a usar componentes nativos. Es el compromiso multiplataforma en su forma más nítida, y ninguna de las dos columnas gana en abstracto.

Aparición 2017, desarrollado por Google
Clasificación ui-sdk
Ecosistema Dart
Licencia BSD-3-Clause
Estado 🟢 Activo
Documentación https://docs.flutter.dev/

💡 Cómo funciona por dentro#

La arquitectura tiene tres capas, y entenderlas explica todo lo demás [flutter-architecture]:

┌─────────────────────────────────────────┐
│  Widgets (Dart)  — tu código            │  Composición declarativa
├─────────────────────────────────────────┤
│  Motor (C++)     — dibujo y texto       │  Rasteriza CADA píxel
├─────────────────────────────────────────┤
│  Sistema operativo — lienzo y eventos   │  Solo aporta superficie y entrada
└─────────────────────────────────────────┘

Al sistema operativo se le pide una superficie donde dibujar y los eventos de entrada. Nada más. Los botones, las listas y los campos de texto los pinta Flutter.

// Todo es un widget, y los widgets se componen.
class PanelTareas extends StatelessWidget {
  final List<Tarea> tareas;
  const PanelTareas({super.key, required this.tareas});

  @override
  Widget build(BuildContext context) {
    final pendientes = tareas.where((t) => !t.done).length;  // derivado, no guardado
    return Column(children: [
      Text('Pendientes: $pendientes'),
      Expanded(child: ListView(children: tareas.map((t) => Text(t.title)).toList())),
    ]);
  }
}

Es el mismo modelo declarativo de React —vista = f(estado)— once años después y en otra plataforma [windmill-flutter]. Esa repetición es una de las tesis del Atlas: las ideas de arquitectura de interfaz viajan entre plataformas.

⚖️ El compromiso, con las dos columnas#

Flutter (dibuja propio) React Native (componentes nativos)
Aspecto Idéntico en todas las plataformas El de cada sistema
Componente nuevo del sistema No aparece hasta que Flutter lo implemente Aparece solo
Control del píxel Total Limitado a lo que expone el sistema
Accesibilidad Depende de que Flutter la reimplemente bien Hereda la del sistema
Tamaño mínimo Mayor: el motor va dentro Menor
Animaciones Muy consistentes Dependen de la plataforma

La fila de accesibilidad es la más importante y la que menos se discute. Cuando no usas los componentes del sistema, el lector de pantalla no los reconoce solos: el framework tiene que exponer un árbol de accesibilidad equivalente. Flutter lo hace, y aun así el módulo 03 obliga a lo mismo que en la web: verificarlo con un lector real, no darlo por supuesto.

🧬 El lenguaje al servicio del framework#

Flutter es el único caso del catálogo donde el framework moldeó el lenguaje. Dart existía desde 2011 y había fracasado en su objetivo original —sustituir a JavaScript—. Flutter le dio una razón de ser, y a cambio Dart incorporó lo que Flutter necesitaba: compilación en dos modos —rápida en desarrollo para la recarga en caliente, anticipada en producción—, recolección de basura ajustada a objetos de vida muy corta, y nulabilidad comprobada en compilación.

La relación completa está en la página del ecosistema, y es la razón de que Dart tenga una entrada propia en el Atlas.

🧭 Lo que hay que declarar antes de elegirlo#

1. Un lenguaje más para el equipo. Dart se aprende rápido y sigue siendo un lenguaje que probablemente nadie del equipo usa en otro sitio. El módulo 11 pide separar «lo que sabemos» de «lo que podemos aprender», y aquí esa distinción tiene coste.

2. La estrategia de salida es cara. El código de interfaz no se reutiliza fuera de Flutter. Lo que sobrevive a una migración es el dominio — si está separado, que es la regla del módulo 02.

3. La web es un destino distinto. Flutter compila a web, pero el resultado es un lienzo dibujado, no un documento HTML. Eso afecta a la indexación, a la selección de texto y a la accesibilidad de forma que hay que evaluar caso por caso, no asumir.

🎓 Las tres lecciones#

1. Dibujar propio compra consistencia y vende herencia. No heredas los cambios de la plataforma —ni los buenos ni los malos—, y eso es una decisión de producto, no técnica.

2. La accesibilidad es la fila que decide en interfaces no nativas. Si el framework no la reimplementa bien, la pagas tú en cada componente.

3. Las ideas de interfaz viajan. El modelo declarativo de React aparece en Flutter, en SwiftUI y en Jetpack Compose. Reconocerlo abarata aprender la siguiente plataforma.

🔗 Enlaces#

Fuentes#