Определите / создайте экземпляр TextEditingController как поле внутри вашего GetxController, которое вы используете для управления вашей формой / реализации бизнес-логики.
class DestinoFormControllerX extends GetxController {
static DestinoFormControllerX get i => Get.find();
final GlobalKey<FormBuilderState> key = GlobalKey<FormBuilderState>();
// ↓ place the text editing controller inside your... controller :)
var controllerDestino = TextEditingController();
И используйте значения TextEditingController везде, где вам нужно, в GetxController.
void resetForm() {
key.currentState.reset();
controllerDestino.text = '';
focusNode.requestFocus();
}
На своем уровне просмотра вставьте свой GetxController и получите контроллер редактирования текста и получите доступ к любым другим методам / полям, которые вам нужны.
class DestinoForm extends StatelessWidget {
final void Function() submitHandler;
DestinoForm({this.submitHandler});
@override
Widget build(BuildContext context) {
final dcx = Get.put(DestinoFormControllerX());
// ↑ inject GetxController, be careful to put *inside* build method
return FormBuilder(
key: dcx.key,
child: Column(
children: [
FormBuilderTextField(
name: 'destino',
controller: dcx.controllerDestino,
decoration: InputDecoration(
labelText: 'Destino',
),
В большинстве форм есть кнопки «Сбросить» и «Отправить». Там вы можете вызывать методы вашего GetxController ....
actions: [
FlatButton(
child: Text('Reset'),
onPressed: () => DestinoFormControllerX.i.resetForm(),
),
Примечание
Если вы создаете / внедряете свой GetxController в виджет формы с помощью Get.put()
, сделайте это внутри метода build
виджета формы.
В противном случае у вас, вероятно, будет TextEditingController
s, вызывающий setState
в StatefulWidget (текстовое поле), который больше не монтируется в дереве виджетов:
════════ Exception caught by foundation library ════════════════════════════════════════════════════
The following assertion was thrown while dispatching notifications for TextEditingController:
setState() called after dispose(): _FormBuilderTextFieldState#96390(lifecycle state: defunct, not mounted)
Хороший
class DestinoForm extends StatelessWidget {
final void Function() submitHandler;
DestinoForm({this.submitHandler});
@override
Widget build(BuildContext context) {
final dcx = Get.put(DestinoFormControllerX());
// ↑ inject GetxController, be careful to put *inside* build method
Плохой
class DestinoForm extends StatelessWidget {
final void Function() submitHandler;
final dcx = Get.put(DestinoFormControllerX());
// ↑ wrong place, DestinoFormControllerX gets linked to previous route
DestinoForm({this.submitHandler});
@override
Widget build(BuildContext context) {
Подробнее о Github с упоминанием правильного внедрения / использования GetX.
person
Baker
schedule
28.01.2021
callUber
функцию, верно? - person Shubham Narkhede   schedule 27.01.2021