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。 檢視原始碼 或 回報問題。