TextEditingController
TextEditingController классы TextField виджетиндеги текст киргизүүнү көзөмөлдөө үчүн иштелип чыккан .
TextEditingController класс конструкторунун контроллер параметрин колдонуу менен орнотулат TextField жана TextFormField.
Бул класстын эки конструктору бар:
TextEditingController({String text})
TextEditingController.fromValue(TextEditingValue value)
Биринчи конструктор параметр катары баштапкы маанини алат, ал андан кийин байланышкан текст талаасында көрсөтүлөт. Экинчи конструктор да баштапкы маанини алат, бирок объект катарыTextEditingValue.
TextEditingController киргизүү талаасында киргизилген жана тандалган текстти башкарууга мүмкүндүк берет, анын үч касиети аныкталган:
selection: TextSelection объектиси катары тандалган текст.
text : учурдагы киргизилген текст String объекти катары.
value: TextEditingValue объектиси катары учурдагы маани.
Текст талаасындагы киргизүү өзгөргөндө, байланышкан объект TextEditingController угуучуларга өзгөртүү жөнүндө кабарлайт. Класста угуучулар тарабынан башкарылуучу чалуу функцияларын кошуу үчүн метод аныкталат addListener(). Бардык кошулган киргизилген текстти, ошондой эле тандалган текстти окуй алышат жана ошону менен болгон өзгөрүүлөр жөнүндө биле алышат.
TextEditingController объекти керек болбой калганда, аны чакырыңыз dispose(). Бул объект колдонгон бардык ресурстарды бошотот. Aлгач текст талаасынын баштапкы маанисин койгон TextEditingController аркылуу жөнөкөй тиркемени аныктайлы:
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(
home: Scaffold(
body: Person(),
appBar: AppBar(title: Text("AppBar")))
));
}
class Person extends StatefulWidget {
Person({ Key key}) : super(key: key);
@override
_PersonState createState() => _PersonState();
}
class _PersonState extends State<Person>{
String _name = "Tom";
final _controller = TextEditingController();
@override
void initState() {
super.initState();
_controller.text = _name;
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(children:[
Text("Имя пользователя: $_name", style: TextStyle(fontSize: 22)),
TextField(
style: TextStyle(fontSize: 22),
controller: _controller)
],
crossAxisAlignment: CrossAxisAlignment.start);
} }
Person виджети үчүн, бул учурда абал класс түрүндө аныкталат _PersonState. Класс _PersonStateабалды өзгөрмө түрүндө сактайт _name- колдонуучунун шарттуу аты. Бирок, мындан тышкары, ал ошондой эле объектти билдирген _PersonStateконстантты аныктайт, анын жардамы менен биз өзгөрмөнүн өзгөрүүсүнө көз салабыз ._controllerTextEditingController_name.
Демейки боюнча, өзгөрмөнүн _nameбаштапкы мааниси бар - "Том". Жана бул маанини контроллерге өткөрүү үчүн биз State классынын initState ыкмасын жокко чыгарабыз. Бул ыкма State объектинин абалын инициализациялоого арналган. Жана бул учурда, биз textTextEditingController объектинин касиетине өзгөрмөнүн маанисин өткөрүп жатабыз _name. Бул текст талаасына баштапкы маанисин берет.
TextEditingController объекти аны менен байланышкан бардык ресурстарды бошотушу үчүн, биз контроллер ыкмасын чакырган абал классындагы dispose()dispose() ыкмасын жокко чыгарабыз
Андан кийин, анын конструкторунда TextField виджетин түзүп жатканда, биз колдонула турган контроллерди койдук:
controller: _controller
Натыйжада, колдонмо башталганда, текст талаасы баштапкы маанини алат:
Эми текстти өзгөртүү процессин кошолу:
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(
home: Scaffold(
body: Person(),
appBar: AppBar(title: Text("AppBar ")))
));
}
class Person extends StatefulWidget {
Person({ Key key}) : super(key: key);
@override
_PersonState createState() => _PersonState();
}
class _PersonState extends State<Person>{
String _name = "Tom";
final _controller = TextEditingController();
_changeName(){
setState(() =>_name = _controller.text);
}
@override
void initState() {
super.initState();
_controller.text = _name;
_controller.addListener(_changeName);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(children:[
Text("Имя пользователя: $_name", style: TextStyle(fontSize: 22)),
TextField(
style: TextStyle(fontSize: 22),
controller: _controller)
],
crossAxisAlignment: CrossAxisAlignment.start);
} }
textТерип жатканыңызда, сиз киргизген бардык текст TextEditingController объектинин касиетинде сакталат . Аны алуу жана _name өзгөрмөсүн өзгөртүү үчүн бул жерде ыкма аныкталган _changeName:
_changeName(){
setState(() =>_name = _controller.text);
}
Бирок бул ыкманы качан чакыруу керек?
Методдо абал инициализацияланганда өзгөрүүлөргө көз салуу үчүн, TextEditingController дин addListener()initState() ыкмасын чакырабыз жана ага TextEditingController деги текст өзгөргөндө аткарыла турган функцияны өткөрөбүз.
_controller.addListener(_changeName);
Метод addListener()эч кандай параметрди албаган функцияны кабыл алат жана эч нерсе кайтарбайт - башкача айтканда, бул учурда ал методдун аныктамасына дал келет _changeName(). Бирок, биз ачык түрдө _changeName ыкмасын чакыра алабыз:
_controller.addListener((){
_changeName();
});
Натыйжада, текст талаасындагы текст өзгөргөндө, Адам виджетинин абалы да өзгөрөт: