跳至主要内容

MouseTracker 不再附加注释

摘要

#

已删除 MouseTracker 的方法 attachAnnotationdetachAnnotationisAnnotationAttached

上下文

#

鼠标事件,例如鼠标指针进入、离开或悬停在某个区域时,通过在渲染阶段放置在感兴趣区域上的MouseTrackerAnnotation来检测。在每次更新(新帧或新事件)时,MouseTracker会比较更新前后鼠标指针悬停的注释,然后相应地分派回调。

MouseTracker类管理鼠标指针的状态,过去需要在挂载时使用MouseRegion附加注释,并在卸载时分离注释。MouseTracker使用此功能执行挂载退出检查(例如,如果退出是由部件卸载导致的,则不应调用MouseRegion.onExit),以防止调用卸载部件的setState并抛出异常(在Issue #44631中详细解释)。

此机制已被替换,MouseRegion变为有状态部件,因此它可以通过在卸载时阻止回调来自行执行挂载退出检查。因此,这些方法已被移除,MouseTracker不再跟踪屏幕上的所有注释。

更改说明

#

MouseTracker类已删除三个与附加注释相关的函数

dart
class MouseTracker extends ChangeNotifier {
  // ...
  void attachAnnotation(MouseTrackerAnnotation annotation) {/* ... */}

  void detachAnnotation(MouseTrackerAnnotation annotation) {/* ... */}

  @visibleForTesting
  bool isAnnotationAttached(MouseTrackerAnnotation annotation) {/* ... */}
}

RenderMouseRegionMouseTrackerAnnotation不再执行挂载退出检查,而MouseRegion仍然执行。

迁移指南

#

MouseTracker.attachAnnotationdetachAnnotation的调用应移除,几乎不会产生影响。

  • MouseRegion的使用完全不受影响。
  • 如果您的代码直接使用RenderMouseRegionMouseTrackerAnnotation,请注意,当退出是由过去调用MouseTracker.detachAnnotation的事件导致时,现在会调用onExit。如果未涉及任何状态,则这不成问题,否则您可能需要添加挂载退出检查,尤其是在回调泄漏的情况下,外部部件可能会在其中调用setState。例如

迁移前的代码

dart
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); };
  }
}

迁移后的代码

dart
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