Skip to content
This repository has been archived by the owner on Jun 12, 2023. It is now read-only.

监听回调多次触发 #45

Closed
YDJSZY opened this issue Jul 1, 2020 · 25 comments
Closed

监听回调多次触发 #45

YDJSZY opened this issue Jul 1, 2020 · 25 comments

Comments

@YDJSZY
Copy link

YDJSZY commented Jul 1, 2020

dispose时有移除监听,但下次进来还是会多次触发

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

在模拟器只要重新运行就会加一次回调

@JiangJuHong
Copy link
Owner

你好,请确定 addListener 只运行了一次,或 及时 removeListener

@JiangJuHong
Copy link
Owner

请检查是否移除监听成功

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

我发现只要重新flutter run就不会了。但之后每次R运行就会加一次回调。确定在页面dispose时都有移除监听了。

@JiangJuHong
Copy link
Owner

因为Flutter热加载机制在部分情况下会重新运行 initState 方法,且不会运行 dispose 方法,所以请注意热加载时的问题!

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

好的,谢谢!

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

顺便问下getMessages能做分页么

@JiangJuHong
Copy link
Owner

getMessage 目前支持分页,只需要传 lastMessage 参数即可

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

我想移除监听是不是有问题,就算我在initState里先remove再addlisten,回调还是一次次增加

@JiangJuHong
Copy link
Owner

removeListener 以及 addListener 需要接收一个方法引用,当你对象不相同时,就没法移除其它对象的引用。请确保 removeListener 传入的方法和addListener传入的方法相同。

@JiangJuHong
Copy link
Owner

所以在引用不相同的情况下,先remove始终会无效,这是Dart机制。

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

TencentImPlugin.removeListener(_messageListener);
TencentImPlugin.addListener(_messageListener);
是同一个的。

@JiangJuHong
Copy link
Owner

同一个的判定条件还有对象,也就是类的对象

@JiangJuHong
Copy link
Owner

假设你在对象A中添加,是没有办法在对象B中移除,即使他们的方法是相同的。因为他们在内存中的“址”是不相同的。

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

@OverRide
void initState() {
super.initState();
TencentImPlugin.removeListener(_messageListener);
TencentImPlugin.addListener(_messageListener);
}

_messageListener(ListenerTypeEnum type, params) {}
就这样呀,在同一个文件里。同一个类里

@JiangJuHong
Copy link
Owner

同一个文件,同一个类,不代表“对象”相同,对象是类的实例化,类只是抽象的表述。

@JiangJuHong
Copy link
Owner

你可通过Debug模式排查,在 initState 中和dispose 中进行打断点排查,确保调用 addListener 和 removeListener 是正确的.

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

我觉得监听跟移除监听写法应该没错的。在同一个文件同一个页面里。

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

你没遇到过吗?shift+R重新进入聊天界面,监听回调多执行了一次

@YDJSZY
Copy link
Author

YDJSZY commented Jul 1, 2020

必须要关闭重新flutter run才回到一次

@JiangJuHong
Copy link
Owner

因为Flutter热加载机制在部分情况下会重新运行 initState 方法,且不会运行 dispose 方法,所以请注意热加载时的问题!

请检查是否多次调用 addListener 或 removeListener 不及时

@JiangJuHong
Copy link
Owner

我觉得监听跟移除监听写法应该没错的。在同一个文件同一个页面里。

据上面所说,同一个类、同一文件,创建两个对象后,他们内部的方法引用是不相同的。
如果你需要验证 先remove再add,请将回调方法更改为 static.

@YDJSZY
Copy link
Author

YDJSZY commented Jul 3, 2020

看来是热重载时dispose没执行导致监听没被移除掉,这样在模拟器无解了?官方好像没提供解决方法

@JiangJuHong
Copy link
Owner

JiangJuHong commented Jul 3, 2020 via email

@YDJSZY
Copy link
Author

YDJSZY commented Jul 3, 2020

嗯,只是开发时有点麻烦。谢谢

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants