gpt4 book ai didi

flutter - 在 dispose 方法中获取提供者方法不起作用

转载 作者:行者123 更新时间:2023-12-03 08:31:23 35 4
gpt4 key购买 nike

我正在尝试访问 dispose 函数中的提供程序方法。

@override
void dispose() {
if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData();
super.dispose();
}

但是当它被调用时我收到错误:

The following assertion was thrown while finalizing the widget tree:Looking up a deactivated widget's ancestor is unsafe.

At this point the state of the widget's element tree is no longerstable.

我做错了什么以及如何解决它?

最佳答案

错误描述基本上说明了一切。 dispose() 方法旨在处理您的小部件的状态依赖项和 Controller ,因此此时您不应该尝试查找此小部件的祖先,因为您的小部件已从小部件树中删除。

您应该在您的状态中创建一个变量,并在 initState() 中提供 MyProvider 值。然后您就可以从 dispose 中调用 MyProvider#clearData() ,如下所示:

class _MyWidgetState extends State<MyWidget> {

MyProvider _myProvider;

@override
void initState() {
super.initState();
_myProvider = Provider.of<MyProvider>(context, listen: false);
}

@override
void dispose() {
if (canRemoveData) _myProvider.clearData();
super.dispose();
}

@override
Widget build(BuildContext context) {
// implement
}
}

此外,如果您提供 MyProvider 作为小部件的直接父级,并且在处置后您在其他任何地方都不需要 MyProvider,则可以使用 ProxyProvider dispose 方法,如下所示:

ProxyProvider<SomeDependency, MyProvider>(
update: (context, someDependency, previous) => previous ?? MyProvider(someDependency),
dispose: (context, myProvider) => myProvider.clearData(),
),

关于flutter - 在 dispose 方法中获取提供者方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64981425/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com