easemob / im_flutter_sdk

环信im flutter sdk, example中包含ui代码.
MIT License
237 stars 85 forks source link

关于模拟器下的监听问题 #513

Closed abellee closed 2 years ago

abellee commented 2 years ago

我现在的处理是: 1、reassemable下移除监听 2、mainbuild下添加监听,条件是

模拟器A运行后,日志输出 只看到触发了一次监听事件,我理解的这是正确的结果。

然后这时候我在另外一个模拟器B下发起添加好友,但是模拟器A相应的监听未触发,这个时候我保存一下,即触发热重载,这个时候等于是移除监听并添加监听,添加好友的监听被触发。

之后我做了另一个处理,我在登录的时候,会先调用一次登出,登出里会检测isLoginBefore,如果true的话,会先进行登出,登出成功后,取消所有监听。登录成功后,再次添加监听。 这样处理过后,重新运行至模拟器A,在模拟器B里添加好友,模拟器A相应的监听触发成功。

经过我反复的测试,结合热重载的环境考虑,我之前的理解是,由于热重载后,导致监听混乱,而无法接收到事件,所以我做了第1、2两点的处理后,得到了解决,后面我把登陆做了细化,是在我们用户登录后再去登陆环信,这个时候我发现,貌似连接成功的事件,是在登陆之后被触发的,也就是说,初始化并添加事件监听之后,其实还并没有连接环信服务器。但是监听又不正常了。 我也尝试了一下直接run到模拟器里,也就是不用热重载,上面的监听也还是有问题的。

我没做过flutter的原生插件,所以我不太理解这里的问题,想请教一下: 1、从现象来看,貌似登出会影响到监听? 2、热重载的时候,原生那边的socket会断开? 3、在单例的情况下,这个监听到底需要如何处理,才能保持稳定?

感谢!

dujiepeng commented 2 years ago

@abellee 我理解不存在你说的问题或者是我没太理解。 因为热重载的时只是重新执行build相关的代码,如果初始化和添加监听放到initState应该不会重复执行的。 所以添加监听放到initState里,移除监听放到dispose里就可以。

1、 登出会释放所有已有监听; 2、热重载不会断开socket; 3、单例的话不需要单独处理,但是登出的话需要重新添加监听;

如果方便可以给我提供一个简单的demo,发到邮箱 dujiepeng@easemob.com 或者是加我的QQ 347302029来进一步沟通。