Sobes.tech
Middle

Do czego służą kontrolery widżetów w Flutterze?

sobes.tech AI

Odpowiedź od AI

Kontrolery widżetów w Flutterze służą do zarządzania stanem lub zachowaniem konkretnego widżetu z zewnątrz, a także do interakcji z nim.

Główne cele użycia:

  • Programowe zarządzanie: Zmiana właściwości widżetu (np. przewijanie listy, kontrola kursora w polu tekstowym) bez bezpośredniej interakcji użytkownika.
  • Pozyskiwanie informacji: Odczytanie aktualnego stanu widżetu (np. bieżąca pozycja przewijania, wprowadzony tekst).
  • Reakcja na zdarzenia: Wykonywanie działań związanych z widżetem w odpowiedzi na zdarzenia w innych częściach aplikacji.

Przykłady popularnych kontrolerów:

  • TextEditingController: Zarządzanie polami tekstowymi (TextField, TextFormField). Pozwala na pobieranie i ustawianie tekstu, zarządzanie zaznaczeniem i pozycją kursora.
    final myController = TextEditingController();
    
    // Pobierz tekst z pola
    final text = myController.text;
    
    // Ustaw tekst w polu
    myController.text = 'Nowy tekst';
    
  • ScrollController: Zarządzanie przewijalnymi widżetami (ListView, GridView, SingleChildScrollView). Pozwala na programowe przewijanie, pobieranie bieżącej pozycji przewijania i słuchanie zdarzeń przewijania.
    final myScrollController = ScrollController();
    
    // Przewiń do początku
    myScrollController.animateTo(
      0,
      duration: Duration(milliseconds: 500),
      curve: Curves.easeOut,
    );
    
    // Pobierz bieżącą pozycję przewijania
    final position = myScrollController.position.pixels;
    
  • PageController: Zarządzanie widżetami stron (PageView). Pozwala na przełączanie między stronami, pobieranie bieżącej strony i słuchanie zdarzeń zmiany strony.
    final myPageController = PageController();
    
    // Przejdź do następnej strony
    myPageController.nextPage(
      duration: Duration(milliseconds: 300),
      curve: Curves.easeIn,
    );
    
    // Pobierz bieżącą stronę
    final currentPage = myPageController.page;
    

Kontrolery zazwyczaj przekazywane są do odpowiedniego widżetu przez jego konstruktor. Zarządzanie cyklem życia kontrolera (tworzenie i usuwanie) powinno odbywać się w widżecie, który go używa, często w metodzie initState do tworzenia i dispose do usuwania.

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(); // Ważne jest zwolnienie zasobów
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _textController,
      // ... inne właściwości TextField
    );
  }
}

Użycie kontrolerów pozwala na wyraźne oddzielenie logiki zarządzania widżetem od jego prezentacji.