es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Flutter: darle foco a un TextField recién agregado

Necesito enfocarme solo en el TextField recién creado.

El código de ejemplo se encuentra aquí: https://dartpad.dev/?id=1c84c70d956efde95fa12820c9afa4aa

class _TestPageState extends State<TestPage> {
  List<TextEditingController> controllers = [
    TextEditingController(text: 'field 0')
  ];

<p>@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: ListView.builder(
            itemCount: controllers.length,
            itemBuilder: (context, index) => TextField(
                controller: controllers[index],
                autofocus: index == controllers.length - 1)),
      ),
      floatingActionButton: FloatingActionButton(
        child: const Icon(Icons.add),
        onPressed: () {
          setState(() {
            controllers.add(
                TextEditingController(text: 'field ${controllers.length}'));
          });
        },
      ),
    );
  }
}

En el dartpad funciona correctamente, pero no en un dispositivo real.

¿Algún consejo sobre por qué no funciona en el dispositivo y cómo lograrlo?
Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para darle foco al TextField recién creado, puedes usar la clase FocusNode en Flutter. Aquí tienes una versión actualizada del código con los cambios:

    class _TestPageState extends State<testpage> {
      List<texteditingcontroller> controllers = [
        TextEditingController(text: 'campo 0')
      ];
      // Define una variable de tipo FocusNode para el TextField recién agregado
      FocusNode focusNode = FocusNode();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: SafeArea(
            child: ListView.builder(
              itemCount: controllers.length,
              itemBuilder: (context, index) => TextField(
                controller: controllers[index],
                autofocus: index == controllers.length - 1,
                // Asigna el focusNode al TextField recién agregado
                focusNode: index == controllers.length - 1 ? focusNode : null,
              ),
            ),
          ),
          floatingActionButton: FloatingActionButton(
            child: const Icon(Icons.add),
            onPressed: () {
              setState(() {
                controllers.add(TextEditingController(text: 'campo ${controllers.length}'));
                // Establece el foco en el TextField recién agregado
                focusNode.requestFocus();
              });
            },
          ),
        );
      }
    }
    

    Al utilizar la propiedad focusNode y establecerla en el TextField recién agregado, puedes darle foco cuando se crea.

Comments are closed.