如果您在执行某些任务后不需要再次更新小部件,那么 Mikhail 接受的答案就很好。didChangeDependencies
方法。 (大多数时候情况并非如此。)
但如果你需要在执行任务后通知监听者,那就不行了。
上下文is可访问于initState
。
您需要添加参数listen: false
给提供者。
The docs https://pub.dev/documentation/provider/latest/provider/Provider/of.html say
听:必须为 false 才能调用Provider.of
inside [State.initState]
or the create
提供者的方法如下:...
@override
void initState() {
super.initState();
final _store = Provider.of<RecorderStore>(context, listen: false);
}
现在说说为什么要覆盖didChangeDependencies
这不是一个好主意:
In the docs https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html it says
例如,如果先前对 build 的调用引用了后来发生更改的 InheritedWidget,则框架将调用此方法来通知此对象有关更改的信息。
因此当你使用ChangeNotifierProvider
例如,当你打电话时notifyListeners()
这将调用didChangeDependencies
method.
所以当你打电话时notifyListeners
通过didChangeDependencies
它将导致无限循环。
或者即使你不打电话notifyListeners
明确地,每当didChangeDepencies
方法被调用,代码被执行多次。
所以更好用listen: false
在 initState 中确保代码只执行一次。