Как получить TextEditingController внутри слоя контроллера с помощью Getx?

У меня есть этот оператор в моем слое просмотра

TextEditingController controllerDestino = TextEditingController();

И я хочу восстановить этот контроллерDestino, чтобы использовать его в методе, находящемся на уровне моего контроллера.

 statusUberNaoChamado() {
showBoxAdress = true;

changeMainButton("Chamar", Color(0xFF1ebbd8), () {
  callUber("I need pass the controller here");
});

update();}

Заранее благодарю за внимание :)


person Lucas Baggio    schedule 27.01.2021    source источник
comment
Вы хотите сказать, что хотите отправить значение контроллера редактирования текста в callUber функцию, верно?   -  person Shubham Narkhede    schedule 27.01.2021
comment
У меня есть метод: callUber (контроллер TextEditingController) {###}. Итак, чтобы я мог вызвать этот метод в другом методе, мне нужно передать этот параметр TextEditingController. Проблема в том, что метод callUber () я вызываю непосредственно из слоя View, где создается экземпляр TextEditingController, поэтому я могу легко восстановить его. Но метод statusUberNaoChamado () находится внутри уровня контроллера, и мне было интересно, как я могу получить экземпляр TextEditingController, который находится на уровне просмотра   -  person Lucas Baggio    schedule 27.01.2021


Ответы (1)


Определите / создайте экземпляр 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 виджета формы.

В противном случае у вас, вероятно, будет TextEditingControllers, вызывающий 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
comment
Вы сделали хороший старт, выбрав GetX для управления состоянием. Здесь есть ссылки на несколько хороших видеороликов, которые помогут вам быстро освоиться: github .com / jonataslaw / getx / wiki / - person Baker; 28.01.2021