Flutter: gestión del enfoque de entrada del formulario

En este artículo, veremos cómo podemos administrar Form Input Focus en Flutter. Cuando se selecciona un widget de TextField y recibe una entrada, se dice que tiene el foco. Los usuarios pueden cambiar el enfoque a un TextField simplemente tocándolo.

Supongamos que tenemos una aplicación de mensajería, cuando el usuario navega a la pantalla de mensajería, podemos establecer el foco en el TextField donde escribimos el mensaje. Esto le permite a nuestro usuario comenzar a escribir el mensaje tan pronto como la pantalla esté visible, sin tocar manualmente el TextField .

Note: We need to manage the lifecycle of focus nodes using a
      State object as focus nodes are long-lived objects.

Podemos enfocarnos en TextField tan pronto como sea visible usando la propiedad de enfoque automático . Tiene la siguiente sintaxis:

Sintaxis:

TextField(
  autofocus: true,
);

También podemos enfocarnos en un campo de texto al tocar un botón usando la propiedad focusNode . Implica tres pasos:

Paso 1: Cree un FocusNode .

La siguiente sintaxis se puede usar para enfocar el Node:

Sintaxis:

FocusNode gfgFocusNode;
 @override
  void initState() {
    super.initState();
    gfgFocusNode = FocusNode();

Paso 2: pasar el FocusNode al TextField.

Puede usar el decorador @override con el generador de widgets para pasar el Node de enfoque como se muestra a continuación.

@override
  Widget build(BuildContext context) {
    return TextField(
      focusNode: gfgFocusNode,
    );
  }

Paso 3: Use requestFocus() para dar el foco al TextField al tocar el botón.

El método requestFocous() se puede usar para enfocarse en TextField cuando se toca el formulario como se muestra a continuación:

  onPressed: () => gfgFocusNode.requestFocus()

Ejemplo:

Dart

import 'package:flutter/material.dart';
  
void main() {
  runApp(MyApp());
}
  
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("GFG | Input Focus"),
          backgroundColor: Color.fromRGBO(15, 157, 88, 1),
        ),
        body: InputForm(),
      ),
    );
  }
}
  
// Defining a custom Form widget
class InputForm extends StatefulWidget {
  @override
  _InputFormState createState() => _InputFormState();
}
  
// Defining a corresponding State class
// This class holds data related to the InputForm
class _InputFormState extends State<InputForm> {
    
  // Defining the focus node
  FocusNode focusNode1;
  FocusNode focusNode2;
  
  @override
  void initState() {
    super.initState();
      
    // To manage the lifecycle, creating focus nodes in
    // the initState method
    focusNode1 = FocusNode();
    focusNode2 = FocusNode();
  }
  
  // Called when the object is removed
  // from the tree permanently
  @override
  void dispose() {
      
    // Clean up the focus nodes
    // when the form is disposed
    focusNode1.dispose();
    focusNode2.dispose();
    super.dispose();
  }
  
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(20.0),
      child: Column(
        children: [
          TextField(
              
            // The first TextField is focused
            // on as soon as the app starts
            autofocus: true,
            focusNode: focusNode1,
            decoration: InputDecoration(
              labelText: "First",
              labelStyle: TextStyle(fontSize: 25.0),
            ),
          ),
          SizedBox(
            height: 50.0,
          ),
          TextField(
              
            // The second TextField is focused
            // on when a user taps the second button
            focusNode: focusNode2,
            decoration: InputDecoration(
              labelText: "Second",
              labelStyle: TextStyle(fontSize: 25.0),
            ),
          ),
          SizedBox(
            height: 150.0,
          ),
          RaisedButton(
            onPressed: () {
              // When the button is pressed,
              // give focus to the first TextField
              // using focusNode1.
              focusNode1.requestFocus();
            },
            color: Color.fromRGBO(15, 157, 88, 1),
            textColor: Colors.white,
            child: Text(
              "Focus on First Text Field",
              style: TextStyle(
                color: Colors.white,
              ),
            ),
          ),
          SizedBox(
            height: 50.0,
          ),
          RaisedButton(
            onPressed: () {
              // When the button is pressed,
              // give focus to the second
              // TextField using focusNode2.
              focusNode2.requestFocus();
            },
            color: Color.fromRGBO(15, 157, 88, 1),
            child: Text(
              "Focus on Second Text Field",
              style: TextStyle(
                color: Colors.white,
              ),
            ),
          )
        ],
      ),
    );
  }
}

Producción:

Publicación traducida automáticamente

Artículo escrito por chetankhanna767 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *