如何监听字符串变量的变化并在变化时执行操作?

问题描述 投票:0回答:2

是否可以执行一个函数,如果变量

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 来做这样的事情可能有点矫枉过正。

我只是不知道如何解决这个问题,所以任何指导将非常感激!

flutter dart
2个回答
19
投票

我相信你可以使用

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

0
投票

使用 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();
  } 
}
© www.soinside.com 2019 - 2024. All rights reserved.