Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How can I listen to a String variable change and perform an action when there is a change?

Is it possible to execute a function, lets call it myFunction() if a variable _myString is changed, but have this happen on the fly?

What I have is a textfield with a controller

var _myString;

const TextField(
        controller:_controller
)

Now elsewhere in my widget tree, I have a button that can change the value of _myString, in this case I’m changing ‘_myString’ to ‘Testing’

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

GestureDetector(
     onTap:(){ _myString = 'Testing'; }
     child: Text('Testing')
)

Now what I’m hoping to achieve is that when the value of _myString changes in any way, I can perform some action of my choosing. In this case, I want to edit the TextField using the _controller, but I don’t only want to do that, but a few other things, so I think its better to listen to changes in that variable and then execute a function

void myFunction(){
///Do some stuff
}

I’m using riverpod for state management in my app, and I was thinking I could try to use it, but have no idea how to use it to watch a single variable, I’m more familiar with using it for entire widgets. Alternatively using riverpod for something like this might be overkill.

I just don’t know how to approach this problem, so any guidance would be really appreciated!

>Solution :

I believe you could use a ValueNotifier for this, a value notifier is a class that holds some value and "notifies" its listeners when this value changes. It is a simpler version of ChangeNotifier:

ValueNotifier<String> _myString = ValueNotifier<String>('');

With the above, whenever you want to read or write the value, use the value getter/setter:

print(_myString.value);
_myString.value = 'some value';

Now, to listen to changes you should use the addListener method:

@override
initState() {
  // update _controller with value whenever _myString changes
  _myString.addListener(() => _controller.text = _myString.value);

  // print value on change
  _myString.addListener(() => print(_myString.value));

  // do stuff
  _myString.addListener(myFunction)
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading