fix: the selection should be clear if header or footer is focusing (#525)

This commit is contained in:
Lucas.Xu 2023-10-10 16:53:12 +08:00 • committed by GitHub
commit 78b004565c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 84 additions and 5 deletions

View file

@ -0,0 +1,54 @@
import 'dart:math';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class IgnoreEditorSelectionGesture extends StatefulWidget {
const IgnoreEditorSelectionGesture({
super.key,
required this.child,
});
final Widget child;
@override
State<IgnoreEditorSelectionGesture> createState() =>
_IgnoreEditorSelectionGestureState();
}
class _IgnoreEditorSelectionGestureState
extends State<IgnoreEditorSelectionGesture> {
final key = Random(10000).toString();
late final SelectionGestureInterceptor interceptor;
late final EditorState editorState = context.read<EditorState>();
@override
void initState() {
super.initState();
interceptor = SelectionGestureInterceptor(
key: key,
canTap: (details) {
final renderObject = context.findRenderObject();
if (renderObject != null && renderObject is RenderBox) {
final offset = renderObject.globalToLocal(details.globalPosition);
return !renderObject.paintBounds.contains(offset);
}
return true;
},
);
editorState.selectionService.registerGestureInterceptor(interceptor);
}
@override
void dispose() {
editorState.selectionService.unregisterGestureInterceptor(key);
super.dispose();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}

View file

@ -1,4 +1,5 @@
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_editor/src/editor/block_component/base_component/widget/ignore_parent_gesture.dart';
import 'package:appflowy_editor/src/flutter/scrollable_positioned_list/scrollable_positioned_list.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -82,8 +83,16 @@ class PageBlockComponent extends BlockComponentStatelessWidget {
itemCount: items.length + extentCount,
itemBuilder: (context, index) {
editorState.updateAutoScroller(Scrollable.of(context));
if (header != null && index == 0) return header!;
if (footer != null && index == items.length + 1) return footer!;
if (header != null && index == 0) {
return IgnoreEditorSelectionGesture(
child: header!,
);
}
if (footer != null && index == items.length + 1) {
return IgnoreEditorSelectionGesture(
child: footer!,
);
}
return Padding(
padding: editorState.editorStyle.padding,
child: editorState.renderer.build(

View file

@ -196,7 +196,9 @@ class _DesktopSelectionServiceWidgetState
final canTap = _interceptors.every(
(element) => element.canTap?.call(details) ?? true,
);
if (!canTap) return;
if (!canTap) {
return updateSelection(null);
}
final offset = details.globalPosition;
final node = getNodeInOffset(offset);