Menu
CoddyTech

Leer un campo con un controlador

Parte de la sección Cómo hacerla interactiva del Journey de Flutter de Coddy. Lección 24 de 34.

onChanged detecta cada letra. A menudo solo quieres el texto cuando se pulsa un botón, como Añadir o Enviar. Para eso, dale al campo un controlador:

final TextEditingController _controller = TextEditingController();

TextField(controller: _controller)

El controlador vive en el State, junto a tus otras variables. Es final porque siempre es el mismo controlador; solo cambia el texto que contiene. _controller.text es lo que contiene el campo en este momento, y _controller.clear() lo vacía.

void _send() {
  print(_controller.text);
  _controller.clear();
}

Un controlador debe descartarse cuando se descarta su pantalla. Para eso sirve dispose: Flutter lo llama cuando el State desaparece.

@override
void dispose() {
  _controller.dispose();
  super.dispose();
}
challenge icon

Desafío

Intermedio
  • Añade un final TextEditingController _controller al estado y asígnaselo al campo con controller:.
  • Haz que _add muestre el texto del campo como Last added: Buy milk y, después, vacíe el campo.
  • Añade el método dispose de la teoría.

Pruébalo tú mismo

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String _last = 'nothing';

  void _add() {}

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Tasks')),
      body: Padding(
        padding: const EdgeInsets.all(24),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              decoration: const InputDecoration(
                labelText: 'New task',
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 12),
            ElevatedButton(onPressed: _add, child: const Text('Add')),
            const SizedBox(height: 24),
            Text('Last added: $_last', style: const TextStyle(fontSize: 20)),
          ],
        ),
      ),
    );
  }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Cómo hacerla interactiva

Practica por tu cuenta: Compilador de Flutter online