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
4 changed files with 84 additions and 5 deletions

View file

@ -37,7 +37,7 @@ class _FocusExampleForEditorState extends State<FocusExampleForEditor> {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.black,
title: const Text('Custom Theme For Editor'),
title: const Text('Focus Node Example'),
titleTextStyle: const TextStyle(color: Colors.white),
iconTheme: const IconThemeData(
color: Colors.white,
@ -52,7 +52,21 @@ class _FocusExampleForEditorState extends State<FocusExampleForEditor> {
builder: (context, snapshot) {
return !snapshot.hasData
? const Center(child: CircularProgressIndicator())
: AppFlowyEditor(editorState: snapshot.data!);
: AppFlowyEditor(
editorState: snapshot.data!,
header: const TextField(
textAlign: TextAlign.center,
decoration: InputDecoration(
hintText: 'Header: Please input something ...',
),
),
footer: const TextField(
textAlign: TextAlign.center,
decoration: InputDecoration(
hintText: 'Footer: Please input something ...',
),
),
);
},
),
),

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);