概述

#

移除了 MouseTrackerattachAnnotationdetachAnnotationisAnnotationAttached 方法。

背景

#

滑鼠事件,例如滑鼠指標進入、退出或懸停在某個區域時,是透過放置在感興趣區域的 MouseTrackerAnnotation 在渲染階段檢測到的。在每次更新(新幀或新事件)時,MouseTracker 會比較更新前後滑鼠指標懸停的註解,然後相應地分派回撥。

MouseTracker 類負責管理滑鼠指標的狀態,過去需要 MouseRegion 在掛載時附加註解,在解除安裝時分離註解。MouseTracker 使用此功能執行掛載-退出檢查(例如,如果退出是由 widget 解除安裝引起的,則不得呼叫 MouseRegion.onExit),以防止呼叫已解除安裝 widget 的 setState 並丟擲異常(在 Issue #44631 中有詳細說明)。

該機制已被替換,現在 MouseRegion 是一個有狀態的 widget,因此它可以自行執行掛載-退出檢查,透過在解除安裝時阻止回撥來完成。因此,這些方法已被移除,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。如果沒有涉及狀態,這不應該有問題,否則您可能需要添加掛載-退出檢查,特別是當回撥洩漏時,外部 widget 可能會在其中呼叫 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 的呼叫。該功能在技術上不再可能,因為註解不再被跟蹤。如果您以某種方式需要此功能,請提交一個 issue。

時間線

#

引入版本: 1.15.4
穩定版本: 1.17

參考資料

#

API 文件

相關 PR