MouseTracker 不再附加注释
摘要
#已删除 MouseTracker
的方法 attachAnnotation
、detachAnnotation
和 isAnnotationAttached
。
上下文
#鼠标事件,例如鼠标指针进入、离开或悬停在某个区域时,通过在渲染阶段放置在感兴趣区域上的MouseTrackerAnnotation
来检测。在每次更新(新帧或新事件)时,MouseTracker
会比较更新前后鼠标指针悬停的注释,然后相应地分派回调。
MouseTracker
类管理鼠标指针的状态,过去需要在挂载时使用MouseRegion
附加注释,并在卸载时分离注释。MouseTracker
使用此功能执行挂载退出检查(例如,如果退出是由部件卸载导致的,则不应调用MouseRegion.onExit
),以防止调用卸载部件的setState
并抛出异常(在Issue #44631中详细解释)。
此机制已被替换,MouseRegion
变为有状态部件,因此它可以通过在卸载时阻止回调来自行执行挂载退出检查。因此,这些方法已被移除,MouseTracker
不再跟踪屏幕上的所有注释。
更改说明
#MouseTracker
类已删除三个与附加注释相关的函数
class MouseTracker extends ChangeNotifier {
// ...
void attachAnnotation(MouseTrackerAnnotation annotation) {/* ... */}
void detachAnnotation(MouseTrackerAnnotation annotation) {/* ... */}
@visibleForTesting
bool isAnnotationAttached(MouseTrackerAnnotation annotation) {/* ... */}
}
RenderMouseRegion
和MouseTrackerAnnotation
不再执行挂载退出检查,而MouseRegion
仍然执行。
迁移指南
#MouseTracker.attachAnnotation
和detachAnnotation
的调用应移除,几乎不会产生影响。
MouseRegion
的使用完全不受影响。- 如果您的代码直接使用
RenderMouseRegion
或MouseTrackerAnnotation
,请注意,当退出是由过去调用MouseTracker.detachAnnotation
的事件导致时,现在会调用onExit
。如果未涉及任何状态,则这不成问题,否则您可能需要添加挂载退出检查,尤其是在回调泄漏的情况下,外部部件可能会在其中调用setState
。例如
迁移前的代码
class MyMouseRegion extends SingleChildRenderObjectWidget {
const MyMouseRegion({this.onHoverChange});
final ValueChanged<bool> onHoverChange;
@override
RenderMouseRegion createRenderObject(BuildContext context) {
return RenderMouseRegion(
onEnter: (_) { onHoverChange(true); },
onExit: (_) { onHoverChange(false); },
);
}
@override
void updateRenderObject(BuildContext context, RenderMouseRegion renderObject) {
renderObject
..onEnter = (_) { onHoverChange(true); }
..onExit = (_) { onHoverChange(false); };
}
}
迁移后的代码
class MyMouseRegion extends SingleChildRenderObjectWidget {
const MyMouseRegion({this.onHoverChange});
final ValueChanged<bool> onHoverChange;
@override
RenderMouseRegion createRenderObject(BuildContext context) {
return RenderMouseRegion(
onEnter: (_) { onHoverChange(true); },
onExit: (_) { onHoverChange(false); },
);
}
@override
void updateRenderObject(BuildContext context, RenderMouseRegion renderObject) {
renderObject
..onEnter = (_) { onHoverChange(true); }
..onExit = (_) { onHoverChange(false); };
}
@override
void didUnmountRenderObject(RenderMouseRegion renderObject) {
renderObject
..onExit = onHoverChange == null ? null : (_) {};
}
}
必须移除对MouseTracker.isAnnotationAttached
的调用。此功能在技术上不再可行,因为不再跟踪注释。如果您以某种方式需要此功能,请提交问题。
时间线
#包含于版本:1.15.4
稳定版本:1.17
参考
#API 文档
相关 PR
- MouseTracker 不再需要附加注释,进行了此更改。
- 改进 MouseTracker 生命周期:将检查移至帧后,首次引入了挂载退出更改,在onExit 的更改中进行了说明。
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面最后更新于 2024-08-16。 查看源代码 或 报告问题。