fix: reorder bugs

This commit is contained in:
appflowy 2022-08-05 09:49:16 +08:00
parent 20f34dc952
commit c25237c767
5 changed files with 48 additions and 51 deletions

View File

@ -129,24 +129,16 @@ class _BoardContentState extends State<BoardContent> {
void initState() {
_overlayEntry = BoardOverlayEntry(
builder: (BuildContext context) {
List<Widget> children = widget.dataController.columnDatas.map((columnData) {
return _buildColumn(
columnData.id,
widget.dataController.columnIds,
widget.dataController.columnController(columnData.id),
);
}).toList();
final interceptor = OverlapReorderFlexDragTargetInteceptor(
reorderFlexId: widget.dataController.identifier,
acceptedReorderFlexId: widget.dataController.columnIds,
delegate: widget.delegate,
);
Widget reorderFlex = ReorderFlex(
final reorderFlex = ReorderFlex(
key: widget.key,
scrollController: widget.scrollController,
config: widget.config,
scrollController: widget.scrollController,
onDragStarted: widget.onDragStarted,
onReorder: widget.onReorder,
onDragEnded: widget.onDragEnded,
@ -154,7 +146,7 @@ class _BoardContentState extends State<BoardContent> {
direction: Axis.horizontal,
spacing: widget.spacing,
interceptor: interceptor,
children: children,
children: _buildColumns(),
);
return Stack(
@ -178,33 +170,37 @@ class _BoardContentState extends State<BoardContent> {
);
}
Widget _buildColumn(
String columnId,
List<String> acceptColumns,
BoardColumnDataController dataController,
) {
return ChangeNotifierProvider.value(
key: ValueKey(columnId),
value: dataController,
child: Consumer<BoardColumnDataController>(
builder: (context, value, child) {
return ConstrainedBox(
constraints: widget.columnConstraints,
child: BoardColumnWidget(
headerBuilder: widget.headerBuilder,
footBuilder: widget.footBuilder,
cardBuilder: widget.cardBuilder,
acceptedColumns: acceptColumns,
dataController: dataController,
scrollController: ScrollController(),
onReorder: (_, int fromIndex, int toIndex) {
dataController.move(fromIndex, toIndex);
},
phantomController: widget.phantomController,
),
);
},
),
);
List<Widget> _buildColumns() {
final acceptColumns = widget.dataController.columnIds;
final List<Widget> children = widget.dataController.columnDatas.map((columnData) {
final dataController = widget.dataController.columnController(columnData.id);
return ChangeNotifierProvider.value(
key: ValueKey(columnData.id),
value: dataController,
child: Consumer<BoardColumnDataController>(
builder: (context, value, child) {
return ConstrainedBox(
constraints: widget.columnConstraints,
child: BoardColumnWidget(
headerBuilder: widget.headerBuilder,
footBuilder: widget.footBuilder,
cardBuilder: widget.cardBuilder,
acceptedColumns: acceptColumns,
dataController: dataController,
scrollController: ScrollController(),
phantomController: widget.phantomController,
onReorder: (_, int fromIndex, int toIndex) {
dataController.move(fromIndex, toIndex);
},
),
);
},
),
);
}).toList();
return children;
}
}

View File

@ -15,7 +15,7 @@ class FlexDragTargetData extends DragTargetData {
Widget? get draggingWidget => state.draggingWidget;
Size? get draggingFeedbackSize => state.feedbackSize;
Size? get feedbackSize => state.feedbackSize;
/// Indicate the dragTarget come from which [ReorderFlex].
final DraggingReorderFlex draggingReorderFlex;

View File

@ -66,7 +66,7 @@ abstract class CrossReorderFlexDragTargetDelegate {
void updateDragTargetData(
String reorderFlexId,
FlexDragTargetData dragTargetData,
int index,
int dragTargetIndex,
);
}

View File

@ -386,20 +386,20 @@ class ReorderFlexState extends State<ReorderFlex> with ReorderFlexMinxi, TickerP
});
}
bool handleOnWillAccept(BuildContext context, int? dragIndex, int childIndex) {
bool handleOnWillAccept(BuildContext context, int? dragIndex, int dragTargetIndex) {
/// The [willAccept] will be true if the dargTarget is the widget that gets
/// dragged and it is dragged on top of the other dragTargets.
///
Log.trace(
'[$ReorderDragTarget] ${widget.dataSource.identifier} on will accept, count: ${widget.dataSource.items.length}');
Log.debug(
'[$ReorderDragTarget] ${widget.dataSource.identifier} on will accept, dragIndex:$dragIndex, dragTargetIndex:$dragTargetIndex, count: ${widget.dataSource.items.length}');
bool willAccept = dragState.dragStartIndex == dragIndex && dragIndex != childIndex;
bool willAccept = dragState.dragStartIndex == dragIndex && dragIndex != dragTargetIndex;
setState(() {
if (willAccept) {
int shiftedIndex = dragState.calculateShiftedIndex(childIndex);
int shiftedIndex = dragState.calculateShiftedIndex(dragTargetIndex);
dragState.updateNextIndex(shiftedIndex);
} else {
dragState.updateNextIndex(childIndex);
dragState.updateNextIndex(dragTargetIndex);
}
_requestAnimationToNextIndex(isAcceptingNewTarget: true);

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import '../../../flowy_board.dart';
import '../../utils/log.dart';
import '../flex/drag_state.dart';
@ -126,7 +127,7 @@ class BoardPhantomController extends OverlapReorderFlexDragTargetDelegate with C
delegate.controller(toColumnId)?.insert(phantomIndex, PhantomColumnItem(phantomContext));
WidgetsBinding.instance.addPostFrameCallback((_) {
Future.delayed(const Duration(milliseconds: 00), () {
Future.delayed(const Duration(milliseconds: 100), () {
columnsState.notifyDidInsertPhantom(toColumnId);
});
});
@ -172,13 +173,13 @@ class BoardPhantomController extends OverlapReorderFlexDragTargetDelegate with C
}
@override
void updateDragTargetData(String reorderFlexId, FlexDragTargetData dragTargetData, int index) {
phantomRecord?.updateInsertedIndex(index);
void updateDragTargetData(String reorderFlexId, FlexDragTargetData dragTargetData, int dragTargetIndex) {
phantomRecord?.updateInsertedIndex(dragTargetIndex);
assert(phantomRecord != null);
if (phantomRecord!.toColumnId == reorderFlexId) {
/// Update the existing phantom index
_updatePhantom(phantomRecord!.toColumnId, dragTargetData, index);
_updatePhantom(phantomRecord!.toColumnId, dragTargetData, dragTargetIndex);
}
}
}