跳至主要內容

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