Sobes.tech
Middle

Kam skirti widget valdikliai Flutter'yje?

sobes.tech AI

Atsakymas iš AI

Flutter'e widget'ų valdikliai naudojami valdyti konkretaus widget'o būseną arba elgesį iš išorės, taip pat sąveikauti su juo.

Pagrindiniai tikslai:

  • Programinis valdymas: Keisti widget'o savybes (pavyzdžiui, sąrašo nuskaitymas, žymeklio valdymas teksto lauke) be tiesioginio naudotojo sąveikos.
  • Informacijos gavimas: Skaityti esamą widget'o būseną (pavyzdžiui, nuskaitymo poziciją, įvestą tekstą).
  • Įvykių reakcija: Atlikti veiksmus, susijusius su widget'u, kaip atsaką į įvykius kitose programos dalyse.

Populiarių valdiklių pavyzdžiai:

  • TextEditingController: Tekstinių laukų (TextField, TextFormField) valdymas. Leidžia gauti ir nustatyti tekstą, valdyti žymeklio ir pozicijos valdymą.
    final myController = TextEditingController();
    
    // Gauti tekstą iš lauko
    final text = myController.text;
    
    // Nustatyti tekstą lauke
    myController.text = 'Naujas tekstas';
    
  • ScrollController: Slinkimo valdiklių (ListView, GridView, SingleChildScrollView) valdymas. Leidžia programiškai slinkti, gauti esamą poziciją ir klausytis slinkimo įvykių.
    final myScrollController = ScrollController();
    
    // Slinkti į pradžią
    myScrollController.animateTo(
      0,
      duration: Duration(milliseconds: 500),
      curve: Curves.easeOut,
    );
    
    // Gauti esamą slinkimo poziciją
    final position = myScrollController.position.pixels;
    
  • PageController: Puslapių valdymas (PageView). Leidžia pereiti tarp puslapių, gauti esamą puslapį ir klausytis puslapio keitimo įvykių.
    final myPageController = PageController();
    
    // Pereiti į kitą puslapį
    myPageController.nextPage(
      duration: Duration(milliseconds: 300),
      curve: Curves.easeIn,
    );
    
    // Gauti esamą puslapį
    final currentPage = myPageController.page;
    

Valdikliai dažniausiai perduodami atitinkamam widget'ui per jo konstruktorių. Valdiklio gyvavimo ciklo valdymas (sukūrimas ir ištrynimas) turėtų būti atliekamas widget'e, kuris jį naudoja, dažniausiai initState metodą kur kuriama ir dispose kur ištrinama.

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(); // Svarbu atlaisvinti išteklius
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _textController,
      // ... kiti TextField parametrai
    );
  }
}

Valdiklių naudojimas leidžia aiškiai atskirti valdiklio valdymo logiką nuo jo pateikimo.