Sobes.tech
Middle

Барои чӣ контроллерҳои widget дар Flutter истифода мешаванд?

sobes.tech AI

Ҷавоб аз AI

Дар Flutter, контроллерҳои виджетҳо барои идоракунии ҳолат ё рафтори конкретии виджет аз берун истифода мешаванд, инчунин барои муошират бо он.

Ҳадафҳои асосӣ:

  • Идоракунии барномавӣ: Тағйир додани хосиятҳои виджет (масалан, гузаронидани рӯйхат, идоракунии курсор дар майдони матн) бе муошират бо корбар.
  • Гирдоварии маълумот: хондани ҳолати ҳозираи виджет (масалан, ҷойгиршавии ҳозираи рӯйгардонӣ, матни воридшуда).
  • Вокуниш ба ҳодисаҳо: иҷрои амалҳо, ки бо виджет алоқаманданд, дар посух ба ҳодисаҳо дар қисмҳои дигари барнома.

Масаланҳои маъмултарини контроллер:

  • TextEditingController: идоракунии майдонҳои матн (TextField, TextFormField). Имкон медиҳад, ки матнро гиред ва гузоред, интихоб ва ҷойгиршавии курсорро идора кунед.
    final myController = TextEditingController();
    
    // Гирифтани матн аз майдон
    final text = myController.text;
    
    // Гузоштани матн дар майдон
    myController.text = 'Матни нав';
    
  • ScrollController: идоракунии виджетҳои рӯйгардоншаванда (ListView, GridView, SingleChildScrollView). Имкон медиҳад, ки ба таври барномавӣ рӯйгардонед, ҷойгиршавии ҳозираи рӯйгардонро гиред ва ҳодисаҳои рӯйгардонро гӯш кунед.
    final myScrollController = ScrollController();
    
    // Рӯйгардон ба оғози
    myScrollController.animateTo(
      0,
      duration: Duration(milliseconds: 500),
      curve: Curves.easeOut,
    );
    
    // Гирифтани ҷойгиршавии ҳозираи рӯйгардон
    final position = myScrollController.position.pixels;
    
  • PageController: идоракунии виджетҳои саҳифа (PageView). Имкон медиҳад, ки байни саҳифаҳо гузаред, саҳифаи ҳозираро гиред ва ҳодисаҳои тағирёбии саҳифаро гӯш кунед.
    final myPageController = PageController();
    
    // гузариш ба саҳифаи оянда
    myPageController.nextPage(
      duration: Duration(milliseconds: 300),
      curve: Curves.easeIn,
    );
    
    // гирифтани саҳифаи ҳозира
    final currentPage = myPageController.page;
    

Контроллерҳо одатан тавассути конструктор ба виджети дахлдор дода мешаванд. Идоракунии давраи ҳаёти контроллер (сохтани ва тоза кардани он) бояд дар виджети, ки онро истифода мебарад, анҷом дода шавад, одатан дар методи initState барои сохтани он ва dispose барои тоза кардан.

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(); // муҳим аст, ки манбаъҳоро озод кунед
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _textController,
      // ... хосиятҳои дигар
    );
  }
}

Истифодаи контроллерҳо имкон медиҳад, ки логикаи идоракунии виджетро аз намоиш ҷудо кунед.