MAUI Lab C# / .NET

04 / PRACTICAR

Toca, prueba y
comprueba la idea.

Simulaciones en JavaScript para aprender el modelo mental. No son un emulador de MAUI ni una base SQLite real.

EXAMEN PRÁCTICO

16 casos para razonar

Diagnostica código que falla, decide una corrección y explica por qué funciona.

Entrenar con escenarios →

Binding y ViewModel

¡Hola…!

El campo representa Entry TwoWay; la salida representa Label OneWay.

Ciclo de vida y guardado

Proceso activo. Guarda antes de perder cambios.

Permiso de cámara

Elige una respuesta simulada; no se abrirá tu cámara.

Objeto ↔ JSON

LABORATORIO DE NOTAS

Lista, persistencia y sincronización

Este modelo usa almacenamiento del navegador. Agrega, edita o elimina una nota; después elimina el proceso simulado y reconstruye la lista desde los datos guardados.

Async: la interfaz sigue disponible

La tarea simulada espera dos segundos. Durante la espera puedes pulsar el contador. No ejecuta C#.

Casos de código

La tabla todavía no existe

_db.CreateTableAsync<Nota>();
return _db.Table<Nota>().ToListAsync();
Ver solución y respuesta modelo

Ejemplo de corrección

private readonly SQLiteAsyncConnection _db;
private readonly Task _ready;
public NotaRepository(string ruta)
{
    _db = new SQLiteAsyncConnection(ruta);
    _ready = _db.CreateTableAsync<Nota>();
}
public async Task<List<Nota>> LeerAsync()
{
    await _ready;
    return await _db.Table<Nota>().ToListAsync();
}

Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.

El texto de la lista no cambia

notas[0].Texto = "Editada";
Ver solución y respuesta modelo

Ejemplo de corrección

public partial class Nota : ObservableObject
{
    [ObservableProperty] private string texto = "";
}
// La colección permanece igual.
Notas[0].Texto = "Texto corregido";

Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.

La interfaz se congela

var datos = cliente.GetStringAsync(url).Result;
Ver solución y respuesta modelo

Ejemplo de corrección

[RelayCommand]
private async Task SincronizarAsync()
{
    try
    {
        Mensaje = await _http.GetStringAsync("posts");
    }
    catch (HttpRequestException)
    {
        Mensaje = "No se pudo contactar el servidor.";
    }
}

Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.

Notas duplicadas al sincronizar

if (!Notas.Any(n => n.Texto == remota.Body))
    Guardar(remota);
Ver solución y respuesta modelo

Ejemplo de corrección

// Esquema: requiere un índice único por IdRemoto en el modelo.
var local = await repo.BuscarPorIdRemotoAsync(remota.Id);
if (local is null)
    await repo.InsertarRemotaAsync(remota);
else
    await repo.AplicarPoliticaDeConflictoAsync(local, remota);
// El contrato del servidor debe permitir reintentos idempotentes.

Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.

GPS sin resultado

var loc = await Geolocation.Default.GetLocationAsync();
Mostrar(loc.Latitude);
Ver solución y respuesta modelo

Ejemplo de corrección

try
{
    var request = new GeolocationRequest(
        GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));
    var loc = await Geolocation.Default.GetLocationAsync(request);
    if (loc is null) { Mensaje = "Sin ubicación disponible"; return; }
    Latitud = loc.Latitude;
    Longitud = loc.Longitude;
}
catch (PermissionException) { Mensaje = "Ubicación no autorizada"; }
catch (FeatureNotEnabledException) { Mensaje = "Activa la ubicación si deseas usarla"; }
// Tratar también cancelación y otros fallos según la plataforma.

Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.

Un record con lista

record Grupo(List<string> Nombres);
grupo.Nombres.Add("Luis");
Ver solución y respuesta modelo

Ejemplo de corrección

// Requiere System.Collections.Immutable.
public record Grupo(ImmutableArray<string> Nombres);
var original = new Grupo(ImmutableArray.Create("Ana"));
var nuevo = original with { Nombres = original.Nombres.Add("Luis") };
// original tiene Ana; nuevo tiene Ana y Luis.

Fragmento educativo: requiere los paquetes, imports y contexto del proyecto correspondientes.

Simulacros

Repaso combinado

Corrección inmediata con explicación.