[踩坑]Flutter使用setState出错call setState() on a State object for a widget that no longer appears in th

Posted HackShendi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[踩坑]Flutter使用setState出错call setState() on a State object for a widget that no longer appears in th相关的知识,希望对你有一定的参考价值。

Hi,I’m Shendi


最近用Flutter开发APP出现了一个问题
在使用 setState 的时候报

call setState() on a State object for a widget that no longer appears in the widget tree

百度后找到的答案是在setState之前先判断 mounted

if (mounted) 
	setState();

加上后的确不报错了,但是功能上出问题了,我功能是WebSocket接收到数据后刷新当前列表,数据的确拿到了,但是现在列表也不刷新,错误也不报(mounted为false导致不执行setState)

更重要的是出现的情况是偶尔,这就让我摸不着头脑了

经过种种排查后,发现这种情况是切换页面的时候发生的,然后查阅关于 mounted 的资料,说这个参数在dispose后就为false了,于是又进行了大半天的排查,最后猜到了一种可能性,就是使用的对象不一致,最终问题解决

应该是每次页面切换过去在换回来,都会是一个新的对象,我的websocket只用开启一次,于是就造成了websocket使用的是第一个对象,后面的都没有,于是就造成了这种情况了

解决
在类里面定义一个全局变量,在init里面使用this初始化此变量,后面在使用的时候都用这个变量里的属性

例如

class Test extends State<> 
	// 唯一对象
	var that;

	// 属性
	var a,b,c;

	@override
	void initState() 
    	super.initState();
	    that = this;
	

	load() 
		that.setState(
			a = 1;
			b = 2;
			c = 3;
		);
	


以上是关于[踩坑]Flutter使用setState出错call setState() on a State object for a widget that no longer appears in th的主要内容,如果未能解决你的问题,请参考以下文章

[踩坑]Flutter使用setState出错call setState() on a State object for a widget that no longer appears in th

Flutter的setState更新原理和流程

在 Flutter 中更新下拉数据会出错

React Native 踩坑日记(十二) —— 数组的复制

react Hook踩坑指北—一文解决你所有关于setState的疑惑

什么时候在 Flutter 中使用 setState?