MouseTracker 不再附加註解
概述
#移除了 MouseTracker 的 attachAnnotation、detachAnnotation 和 isAnnotationAttached 方法。
背景
#滑鼠事件,例如滑鼠指標進入、退出或懸停在某個區域時,是透過放置在感興趣區域的 MouseTrackerAnnotation 在渲染階段檢測到的。在每次更新(新幀或新事件)時,MouseTracker 會比較更新前後滑鼠指標懸停的註解,然後相應地分派回撥。
MouseTracker 類負責管理滑鼠指標的狀態,過去需要 MouseRegion 在掛載時附加註解,在解除安裝時分離註解。MouseTracker 使用此功能執行掛載-退出檢查(例如,如果退出是由 widget 解除安裝引起的,則不得呼叫 MouseRegion.onExit),以防止呼叫已解除安裝 widget 的 setState 並丟擲異常(在 Issue #44631 中有詳細說明)。
該機制已被替換,現在 MouseRegion 是一個有狀態的 widget,因此它可以自行執行掛載-退出檢查,透過在解除安裝時阻止回撥來完成。因此,這些方法已被移除,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。如果沒有涉及狀態,這不應該有問題,否則您可能需要添加掛載-退出檢查,特別是當回撥洩漏時,外部 widget 可能會在其中呼叫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 的呼叫。該功能在技術上不再可能,因為註解不再被跟蹤。如果您以某種方式需要此功能,請提交一個 issue。
時間線
#引入版本: 1.15.4
穩定版本: 1.17
參考資料
#API 文件
相關 PR
- MouseTracker 不再需要附加註解,這促成了此次更改。
- 改進 MouseTracker 生命週期:將檢查移至幀後,該 issue 首先引入了掛載-退出更改,詳情請參閱onExit 的更改。