是否可以执行一个函数,如果变量
myFunction()
发生更改,我们可以调用它_myString
,但这种情况是动态发生的吗?
我有一个
textfield
和 controller
var _myString;
const TextField(
controller:_controller
)
现在在我的小部件树的其他地方,我有一个 button 可以更改
_myString
的值,在本例中我将 '_myString' 更改为 'Testing'
GestureDetector(
onTap:(){ _myString = 'Testing'; }
child: Text('Testing')
)
现在我希望实现的是,当
_myString
的值发生任何变化时,我可以执行我选择的一些操作。在本例中,我想使用 _controller
编辑 TextField,但我不仅想这样做,还想执行其他一些操作,所以我认为最好监听该变量的更改,然后执行函数
void myFunction(){
///Do some stuff
}
我在我的应用程序中使用
riverpod
进行状态管理,我想我可以尝试使用它,但不知道如何使用它来监视单个变量,我更熟悉将它用于整个小部件。或者使用 Riverpod 来做这样的事情可能有点矫枉过正。
我只是不知道如何解决这个问题,所以任何指导将非常感激!
我相信你可以使用
ValueNotifier
来实现这一点,值通知器是一个保存某些值并在该值发生变化时“通知”其侦听器的类。这是ChangeNotifier
的简单版本:
ValueNotifier<String> _myString = ValueNotifier<String>('');
有了上面的内容,每当你想读取或写入值时,请使用值 getter/setter:
print(_myString.value);
_myString.value = 'some value';
现在,要监听更改,您应该使用
addListener
方法:
@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)
}
使用 Provider,您可以监听任何变量,当该变量发生变化时,您可以执行您想要的任何其他触发器。例如:
class DrawerProvider extends ChangeNotifier {
final advancedDrawerController = AdvancedDrawerController();
bool drawerStatus = false;
DrawerProvider() {
//? Variable interception started as soon as the provider became operational.
advancedDrawerController.addListener(_onDrawerVisibilityChanged);
}
void _onDrawerVisibilityChanged() {
//? is triggered if there is a change in the variable being listened to.
drawerStatus = advancedDrawerController.value.visible;
notifyListeners();
}
}