【发布时间】:2020-03-22 23:00:26
【问题描述】:
我创建了一个自定义小部件,它监听 ChangeNotifier 并在通知程序触发时调用提供的回调。这用于在通知器更改时执行一次性任务,例如导航。
一切似乎都很好,但我偶然发现了documentation of didUpdateWidget,上面写着:
如果 State 的 build 方法依赖于一个自身可以改变状态的对象,例如 ChangeNotifier 或 Stream,或者其他可以订阅接收通知的对象,那么请确保在 initState、didUpdateWidget 中正确订阅和取消订阅,并处理:
- 在 initState 中,订阅对象。
- 如果更新的小部件配置需要替换对象,则在 didUpdateWidget 中取消订阅旧对象并订阅新对象。
- 在 dispose 中,取消订阅对象。
出于显而易见的原因,我正在处理第一点和最后一点,但有人可以解释为什么我还必须实施 didUpdateWidget 吗?如果我不这样做会出什么问题?
额外问题:我还没有在我的应用程序中使用提供程序。它是否提供了开箱即用的类似功能?我找不到这样的东西。
我的小部件代码:
class ChangeNotifierListener<T extends ChangeNotifier> extends StatefulWidget {
final Widget child;
final T changeNotifier;
final void Function(T changeNotifier) onChanged;
ChangeNotifierListener(
{@required this.child,
@required this.changeNotifier,
@required this.onChanged});
@override
_ChangeNotifierListenerState createState() =>
_ChangeNotifierListenerState<T>();
}
class _ChangeNotifierListenerState<T extends ChangeNotifier>
extends State<ChangeNotifierListener<T>> {
VoidCallback _callback;
@override
Widget build(BuildContext context) => widget.child;
@override
void initState() {
super.initState();
_callback = () {
widget.onChanged(widget.changeNotifier);
};
widget.changeNotifier.addListener(_callback);
}
@override
void dispose() {
widget.changeNotifier.removeListener(_callback);
super.dispose();
}
}
【问题讨论】: