3

下面的代码会被认为是安全的吗?

class SomeWidget extends HookWidget {

  @override
  Widget build(BuildContext context) {
    final controller = useScrollController();
    controller.addListener(_someCallback);

    return ...;
  }
}

我具体指的是addListener. 在这个ResoCoder 钩子教程中,他在initHook自定义钩子的函数中添加了监听器。

我知道 ResoCoder 编写了自定义钩子来处理 scrollController ...我对控制器侦听器的行为方式更加好奇(我不知道侦听器允许和不允许什么)。任何关于我可以了解它们的资源都会很棒。

谢谢 :)

4

1 回答 1

12

添加侦听器等副作用不应直接在内部完成build。如果小部件重建,这将导致再次添加侦听器

相反,您可以使用useEffect

final controller = useScrollController();

useEffect(() {
  controller.addListener(_someCallback);
  return () => controller.removeListener(_someCallback);
}, [controller]);

于 2020-09-10T14:49:04.883 回答