From e16444f88e7ac956bdeee70e074e4febdd49509d Mon Sep 17 00:00:00 2001 From: "Lucas.Xu" Date: Fri, 22 Jul 2022 10:43:20 +0800 Subject: [PATCH] fix: make sure the state is implemnt selectable, otherwise return. --- .../lib/flowy_selection_service.dart | 68 ++++++++++--------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/frontend/app_flowy/packages/flowy_editor/lib/flowy_selection_service.dart b/frontend/app_flowy/packages/flowy_editor/lib/flowy_selection_service.dart index 6c55d6f955..b2a9f2b9c8 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/flowy_selection_service.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/flowy_selection_service.dart @@ -110,21 +110,22 @@ class _FlowySelectionWidgetState extends State } for (final node in nodes) { - final selectable = node.key?.currentState as Selectable?; - if (selectable != null) { - final selectionRects = selectable.getSelectionRectsInSelection( - panStartOffset!, panEndOffset!); - for (final rect in selectionRects) { - final overlay = OverlayEntry( - builder: ((context) => Positioned.fromRect( - rect: rect, - child: Container( - color: Colors.yellow.withAlpha(100), - ), - )), - ); - selectionOverlays.add(overlay); - } + if (node.key?.currentState is! Selectable) { + continue; + } + final selectable = node.key?.currentState as Selectable; + final selectionRects = selectable.getSelectionRectsInSelection( + panStartOffset!, panEndOffset!); + for (final rect in selectionRects) { + final overlay = OverlayEntry( + builder: ((context) => Positioned.fromRect( + rect: rect, + child: Container( + color: Colors.yellow.withAlpha(100), + ), + )), + ); + selectionOverlays.add(overlay); } } Overlay.of(context)?.insertAll(selectionOverlays); @@ -146,19 +147,20 @@ class _FlowySelectionWidgetState extends State } final selectedNode = nodes.first; - final selectable = selectedNode.key?.currentState as Selectable?; - if (selectable != null) { - final rect = selectable.getCursorRect(tapOffset!); - final cursor = OverlayEntry( - builder: ((context) => Positioned.fromRect( - rect: rect, - child: Container( - color: Colors.blue, - ), - )), - ); - selectionOverlays.add(cursor); + if (selectedNode.key?.currentState is! Selectable) { + return; } + final selectable = selectedNode.key?.currentState as Selectable; + final rect = selectable.getCursorRect(tapOffset!); + final cursor = OverlayEntry( + builder: ((context) => Positioned.fromRect( + rect: rect, + child: Container( + color: Colors.blue, + ), + )), + ); + selectionOverlays.add(cursor); Overlay.of(context)?.insertAll(selectionOverlays); } @@ -183,12 +185,6 @@ class _FlowySelectionWidgetState extends State final tapOffset = this.tapOffset; if (tapOffset != null) {} - if (node.parent != null && node.key != null) { - if (isNodeInOffset(node, offset)) { - return node; - } - } - for (final child in node.children) { final result = computeSelectedNodeByTap(child, offset); if (result != null) { @@ -196,6 +192,12 @@ class _FlowySelectionWidgetState extends State } } + if (node.parent != null && node.key != null) { + if (isNodeInOffset(node, offset)) { + return node; + } + } + return null; }