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);
);