Home > Back-end >  TextEditingController is Not Listening to Chanages in TextField I am Using Provider Package to Handl
TextEditingController is Not Listening to Chanages in TextField I am Using Provider Package to Handl

Time:02-18

Class for IsButtonActive

class isButtonActive with ChangeNotifier {
 
  bool _isButtonActive = false;
  TextEditingController controller = TextEditingController();
  void activeButton() {
    controller.addListener(() {
      final _isButtonActive = controller.text.isNotEmpty;

      this._isButtonActive = _isButtonActive;
    });
    notifyListeners();
  }

  get isButtonActive => _isButtonActive;

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }
}

On Textfield Widget Controller is Called With Cosumer

Consumer<isButtonActive>(
                          builder: (context, mybutton, child) {
                            return ElevatedButton(
                              style: ElevatedButton.styleFrom(
                                primary: appPrimaryColor, // background
                                onPrimary: Colors.white, // foreground
                                fixedSize: Size(context.screenWidth * 0.80,
                                    context.screenHeight * 0.07),
                                onSurface: appPrimaryColor,
                                shape: RoundedRectangleBorder(
                                  borderRadius: BorderRadius.circular(15),
                                ),
                              ),
                              onPressed: mybutton.isButtonActive
                                  ? () {
                                      mybutton.activeButton();
                                      loginAction(); // Calling the Login fucntion from the HomeScreen to Perform LoginAction
                                    }
                                  : null,

When i Type Something in Textfield Button Show be Active if Clear Textfield button should be Deactive

CodePudding user response:

You might want to move the notifyListener() instead the listener of your controller.

  void activeButton() {
    controller.addListener(() {
      final _isButtonActive = controller.text.isNotEmpty;

      this._isButtonActive = _isButtonActive;
      notifyListeners();
    });
  }

As you didn't provide all your code, I'm not sure.

Make sure your TextField is given the controller of your model.

Also, you are enabling the ElevatedButton only isButtonActive is true. But the I only see mybutton.activeButton(); called in the onPressed of the ElevatedButton which looks inactive by default...

So the user will never be able to click on the button to active it.

CodePudding user response:

The issue is most probably this function:

void activeButton() {
  controller.addListener(() {
    final _isButtonActive = controller.text.isNotEmpty;

    this._isButtonActive = _isButtonActive;
  });
  notifyListeners();
}

You are calling the `notifyListeners() only once, when this function is called. What you need is to call it inside the listener like so:

controller.addListener(() {
    final _isButtonActive = controller.text.isNotEmpty;

    this._isButtonActive = _isButtonActive;
    notifyListeners();
  });
  • Related