🔥 Flutter Desde Cero - Guía Completa

Aprende Flutter desde los fundamentos hasta crear apps móviles profesionales

"Flutter es el framework de Google para construir aplicaciones hermosas y nativas."
Explorar Temas

📖 Temas del Curso

Haz clic en cualquier tema para ver el contenido detallado

📌 ¿Qué es Flutter?

Flutter es un framework de Google para crear aplicaciones móviles nativas (iOS y Android) con una sola base de código.

Características:

  • Hot Reload - Ve los cambios al instante
  • Un solo código para iOS y Android
  • Rendimiento nativo
  • Lenguaje Dart
💡 Dato curioso: Flutter usa Skia para renderizar, lo que le da rendimiento nativo.
← Volver a temas

🔧 Instalación

Windows:

# 1. Descargar Flutter SDK desde flutter.dev
# 2. Extraer el ZIP
# 3. Agregar a PATH
flutter doctor

Android Studio:

# Instalar Android Studio
# Configurar Android SDK
# Crear emulador

Verificar:

flutter --version
flutter doctor
← Volver a temas

👋 Hola Mundo

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Hola Mundo')),
        body: Center(child: Text('¡Hola Flutter!')),
      ),
    ),
  );
}

Crear proyecto:

flutter create mi_app
cd mi_app
flutter run
← Volver a temas

📦 Widgets Básicos

// Text
Text('Hola Mundo', style: TextStyle(fontSize: 24))

// Container
Container(
  padding: EdgeInsets.all(16),
  child: Text('Contenido'),
)

// Row y Column
Row(
  children: [Text('A'), Text('B')],
)

Column(
  children: [Text('1'), Text('2')],
)

// Image
Image.network('https://ejemplo.com/img.png')
← Volver a temas

🏗️ Estado y setState

class Contador extends StatefulWidget {
  @override
  _ContadorState createState() => _ContadorState();
}

class _ContadorState extends State {
  int _contador = 0;

  void _incrementar() {
    setState(() {
      _contador++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('$_contador'),
        ElevatedButton(
          onPressed: _incrementar,
          child: Text('Incrementar'),
        ),
      ],
    );
  }
}
← Volver a temas

🔀 Navegación

// Navegar a otra pantalla
Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => PantallaDos(),
  ),
);

// Con nombre
Navigator.pushNamed(context, '/detalle');

// Pasar datos
Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => DetalleScreen(datos: producto),
  ),
);

// Regresar
Navigator.pop(context);
← Volver a temas

📋 ListView y GridView

// ListView.simple
ListView(
  children: [
    ListTile(title: Text('Item 1')),
    ListTile(title: Text('Item 2')),
  ],
)

// ListView.builder (eficiente)
ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return ListTile(title: Text(items[index]));
  },
)

// GridView
GridView.builder(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
  ),
  itemBuilder: (context, index) {
    return Card(child: Center(child: Text('${index+1}')));
  },
)
← Volver a temas

📝 Formularios

final _formKey = GlobalKey<FormState>();
final _nombreController = TextEditingController();

Form(
  key: _formKey,
  child: Column(
    children: [
      TextFormField(
        controller: _nombreController,
        decoration: InputDecoration(labelText: 'Nombre'),
        validator: (value) {
          if (value == null || value.isEmpty) {
            return 'Ingresa tu nombre';
          }
          return null;
        },
      ),
      ElevatedButton(
        onPressed: () {
          if (_formKey.currentState!.validate()) {
            // Procesar datos
          }
        },
        child: Text('Enviar'),
      ),
    ],
  ),
)
← Volver a temas

🧩 Provider y Estado

// 1. Crear provider
class ContadorProvider extends ChangeNotifier {
  int _contador = 0;
  int get contador => _contador;

  void incrementar() {
    _contador++;
    notifyListeners();
  }
}

// 2. Proveer en main
MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (_) => ContadorProvider()),
  ],
  child: MyApp(),
)

// 3. Consumir
Consumer<ContadorProvider>(
  builder: (context, provider, child) {
    return Text('${provider.contador}');
  },
)
← Volver a temas

🔥 Firebase

// pubspec.yaml
dependencies:
  firebase_core: ^2.0.0
  cloud_firestore: ^4.0.0

// main.dart
import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

// Firestore
final db = FirebaseFirestore.instance;

// Guardar
await db.collection('usuarios').add({
  'nombre': 'Juan',
  'edad': 30,
});

// Leer
final snapshot = await db.collection('usuarios').get();
for (var doc in snapshot.docs) {
  print(doc.data());
}
← Volver a temas

🌐 APIs y HTTP

// pubspec.yaml
dependencies:
  http: ^1.0.0

// GET request
import 'dart:convert';
import 'package:http/http.dart' as http;

Future<List<dynamic>> fetchUsuarios() async {
  final response = await http.get(
    Uri.parse('https://api.ejemplo.com/usuarios'),
  );
  
  if (response.statusCode == 200) {
    return json.decode(response.body);
  } else {
    throw Exception('Error al cargar');
  }
}

// POST request
await http.post(
  Uri.parse('https://api.ejemplo.com/usuarios'),
  headers: {'Content-Type': 'application/json'},
  body: json.encode({'nombre': 'Juan'}),
);
← Volver a temas

🚀 Publicar en Stores

Google Play Store:

  • Crear cuenta de desarrollador ($25 una vez)
  • Generar APK firmado: flutter build appbundle
  • Crear listing en Play Console
  • Subir APK y completar información
  • Enviar a revisión

Apple App Store:

  • Crear cuenta Apple Developer ($99/año)
  • Generar IPA: flutter build ipa
  • Usar Xcode para subir a App Store Connect
  • Completar metadata y capturas
  • Enviar a revisión
💡 Tip: Usa flutter build appbundle para Android y flutter build ipa para iOS.
← Volver a temas

📚 Contenido del Curso

Módulo 1: Fundamentos

  • ¿Qué es Flutter?
  • Instalación
  • Widget hola mundo
  • Widgets básicos
Ir a temas →

Módulo 2: Intermedio

  • Estado y setState
  • Navegación
  • ListView y GridView
  • Formularios
Ir a temas →

Módulo 3: Avanzado

  • Provider y estado
  • Firebase
  • APIs y HTTP
  • Publicar en stores
Ir a temas →

📝 Ejemplos Rápidos

Widget Básico

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Home());
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Mi App')),
      body: Center(child: Text('¡Hola!')),
    );
  }
}

StatefulWidget

class Contador extends StatefulWidget {
  @override
  _ContadorState createState() => _ContadorState();
}

class _ContadorState extends State {
  int _count = 0;
  
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        Text('$_count'),
        ElevatedButton(
          onPressed: () => setState(() => _count++),
          child: Text('Incrementar'),
        ),
      ],
    );
  }
}

📖 Recursos Adicionales

Documentación Oficial

Herramientas

  • Android Studio
  • VS Code + Flutter extension
  • Firebase Console

Comunidades

  • Flutter Community
  • Reddit r/FlutterDev
  • Discord Flutter

👨‍💻 Desarrollado por Isaac Esteban Haro Torres

Ingeniero en Sistemas · Full Stack · Automatización · Data

📧 Email: zackharo1@gmail.com

📱 WhatsApp: 098805517

💻 GitHub: github.com/ieharo1

🌐 Portafolio: ieharo1.github.io/portafolio-isaac.haro/