Flutter Provider 监听为 false,但仍然出现错误 "setState() or markNeedsBuild() called during build."
Flutter Provider with listen false, but still get error "setState() or markNeedsBuild() called during build."
我想在 networkProvider 更改时重置 userProvider。
在 userProvider.reset()
中,我有 notifyListeners
.
void didChangeDependencies() async {
super.didChangeDependencies();
final NetworkProvider networkProvider = Provider.of<NetworkProvider>(context);
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
userProvider.reset(); }
运行时出现错误“在构建过程中调用了 setState() 或 markNeedsBuild()”。
我的问题是,我已经将 listen 设置为 false,为什么它仍然重建这个小部件?
当只有一个UserProvider时,同样报错:
void didChangeDependencies() async {
super.didChangeDependencies();
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
userProvider.reset(); }
如果我的用法完全错误,有没有什么建议可以达到相同的结果?
因为您提到 NetworkProvider
发生了变化,我猜它也在发布通知,在这种情况下您还希望这不会触发使用 listen: false
参数的重建。不过,您似乎确实需要这些通知,以便您可以重置 UserProvider
。我建议您不要在 Widget 的生命周期中尝试这样做,而是使用 ProxyProvider 来创建和更新您的 UserProvider
,它依赖于 NetworkProvider
.
好的,我找到了答案。它写在他们主页的后面。
我在问题中尝试的是不允许的,因为状态更新是同步的。
这意味着一些小部件可能会在突变发生之前构建(获取旧值),而其他小部件将在突变完成后构建(获取新值)。这可能会导致您的 UI 不一致,因此是不允许的。
相反,您应该在对整棵树产生同等影响的地方执行该突变:
class MyNotifier with ChangeNotifier {
MyNotifier() {
_fetchSomething();
}
Future<void> _fetchSomething() async {
}
要在构建中使用它:
Future.microtask(() =>
context.read<MyNotifier>().fetchSomething(someValue);
);
我想在 networkProvider 更改时重置 userProvider。
在 userProvider.reset()
中,我有 notifyListeners
.
void didChangeDependencies() async {
super.didChangeDependencies();
final NetworkProvider networkProvider = Provider.of<NetworkProvider>(context);
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
userProvider.reset(); }
运行时出现错误“在构建过程中调用了 setState() 或 markNeedsBuild()”。 我的问题是,我已经将 listen 设置为 false,为什么它仍然重建这个小部件?
当只有一个UserProvider时,同样报错:
void didChangeDependencies() async {
super.didChangeDependencies();
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
userProvider.reset(); }
如果我的用法完全错误,有没有什么建议可以达到相同的结果?
因为您提到 NetworkProvider
发生了变化,我猜它也在发布通知,在这种情况下您还希望这不会触发使用 listen: false
参数的重建。不过,您似乎确实需要这些通知,以便您可以重置 UserProvider
。我建议您不要在 Widget 的生命周期中尝试这样做,而是使用 ProxyProvider 来创建和更新您的 UserProvider
,它依赖于 NetworkProvider
.
好的,我找到了答案。它写在他们主页的后面。 我在问题中尝试的是不允许的,因为状态更新是同步的。
这意味着一些小部件可能会在突变发生之前构建(获取旧值),而其他小部件将在突变完成后构建(获取新值)。这可能会导致您的 UI 不一致,因此是不允许的。
相反,您应该在对整棵树产生同等影响的地方执行该突变:
class MyNotifier with ChangeNotifier {
MyNotifier() {
_fetchSomething();
}
Future<void> _fetchSomething() async {
}
要在构建中使用它:
Future.microtask(() =>
context.read<MyNotifier>().fetchSomething(someValue);
);