Sobes.tech
Middle

Para que são utilizados os controladores de widgets no Flutter?

sobes.tech IA

Resposta da IA

Os controladores de widgets no Flutter são utilizados para gerir o estado ou comportamento de um widget específico de fora, bem como para interagir com ele.

Objetivos principais de uso:

  • Gestão programática: Alterar as propriedades do widget (por exemplo, rolagem de listas, controlo do cursor num campo de texto) sem interação direta do utilizador.
  • Obtenção de informações: Ler o estado atual do widget (por exemplo, posição de rolagem atual, texto inserido).
  • Resposta a eventos: Executar ações relacionadas com o widget em resposta a eventos noutras partes da aplicação.

Exemplos de controladores populares:

  • TextEditingController: Gestão de campos de texto (TextField, TextFormField). Permite obter e definir texto, gerir a seleção e a posição do cursor.
    final myController = TextEditingController();
    
    // Obter texto do campo
    final text = myController.text;
    
    // Definir texto no campo
    myController.text = 'Novo texto';
    
  • ScrollController: Gestão de widgets roláveis (ListView, GridView, SingleChildScrollView). Permite rolar programaticamente, obter a posição de rolagem atual e ouvir eventos de rolagem.
    final myScrollController = ScrollController();
    
    // Rolar para o início
    myScrollController.animateTo(
      0,
      duration: Duration(milliseconds: 500),
      curve: Curves.easeOut,
    );
    
    // Obter a posição de rolagem atual
    final position = myScrollController.position.pixels;
    
  • PageController: Gestão de widgets de páginas (PageView). Permite mudar entre páginas, obter a página atual e ouvir eventos de mudança de página.
    final myPageController = PageController();
    
    // Ir para a próxima página
    myPageController.nextPage(
      duration: Duration(milliseconds: 300),
      curve: Curves.easeIn,
    );
    
    // Obter a página atual
    final currentPage = myPageController.page;
    

Os controladores geralmente são passados ao widget correspondente através do seu construtor. A gestão do ciclo de vida do controlador (criação e eliminação) deve ocorrer no widget que o utiliza, frequentemente no método initState para criar e dispose para eliminar.

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  late final TextEditingController _textController;

  @override
  void initState() {
    super.initState();
    _textController = TextEditingController();
  }

  @override
  void dispose() {
    _textController.dispose(); // É importante libertar recursos
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _textController,
      // ... outras propriedades do TextField
    );
  }
}

O uso de controladores permite separar claramente a lógica de gestão do widget da sua apresentação.