我们如何删除内联代码监听器?

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

假设我们在视图中添加了一个changeNotifier对象的监听器,如下所示:

someChangeNotifierObject.addListener((){ if (this.mounted) setState(){}});
  1. 当视图被处理时,我们是否需要显式删除侦听器?
  2. 如果不删除会有什么影响?
  3. 如何删除它,因为它是内联代码?
dart flutter
1个回答
0
投票
  1. 如果向超级对象(位于当前状态之外的对象)添加侦听器并在侦听器内部使用setState - 在这种情况下,应在当前状态dispose上显式删除它。
  2. 否则,当对象通知其侦听器时,setState将抛出异常,因为您添加侦听器的状态将被置于该时刻。
  3. 不要在addListener中使用内联函数。如果你需要mounted - 它可以在整个State的任何地方访问,除了静态方法。因此,只需在当前State类中创建一个新函数。

EG

@override
void initState() {
  super.initState();
  someChangeNotifierObject.addListener(myListenerFunc);
}

@override
void dispose() {
  someChangeNotifierObject.removeListener(myListenerFunc);
  super.dispose();
}

void myListenerFunc() {
  print("Heya the object has changed!");
  setState(() {
    // re-render current stateful widget.
  });
}

但是,无论您是否在侦听器中使用State的方法,在处置时删除侦听器只是一个好习惯。

© www.soinside.com 2019 - 2024. All rights reserved.