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'

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!


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)
}