mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: optimize rebuild column
This commit is contained in:
parent
9ce7fcb704
commit
6e0a191be1
@ -88,12 +88,14 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
|
|||||||
didReceiveGridUpdate: (GridPB grid) {
|
didReceiveGridUpdate: (GridPB grid) {
|
||||||
emit(state.copyWith(grid: Some(grid)));
|
emit(state.copyWith(grid: Some(grid)));
|
||||||
},
|
},
|
||||||
didReceiveRows: (List<RowInfo> rowInfos) {
|
|
||||||
emit(state.copyWith(rowInfos: rowInfos));
|
|
||||||
},
|
|
||||||
didReceiveError: (FlowyError error) {
|
didReceiveError: (FlowyError error) {
|
||||||
emit(state.copyWith(noneOrError: some(error)));
|
emit(state.copyWith(noneOrError: some(error)));
|
||||||
},
|
},
|
||||||
|
didReceiveGroups: (List<GroupPB> groups) {
|
||||||
|
emit(state.copyWith(
|
||||||
|
groupIds: groups.map((group) => group.groupId).toList(),
|
||||||
|
));
|
||||||
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@ -170,6 +172,7 @@ class BoardBloc extends Bloc<BoardEvent, BoardState> {
|
|||||||
|
|
||||||
boardController.addColumns(columns);
|
boardController.addColumns(columns);
|
||||||
initializeGroups(groups);
|
initializeGroups(groups);
|
||||||
|
add(BoardEvent.didReceiveGroups(groups));
|
||||||
},
|
},
|
||||||
onDeletedGroup: (groupIds) {
|
onDeletedGroup: (groupIds) {
|
||||||
//
|
//
|
||||||
@ -223,6 +226,8 @@ class BoardEvent with _$BoardEvent {
|
|||||||
const factory BoardEvent.didReceiveGridUpdate(
|
const factory BoardEvent.didReceiveGridUpdate(
|
||||||
GridPB grid,
|
GridPB grid,
|
||||||
) = _DidReceiveGridUpdate;
|
) = _DidReceiveGridUpdate;
|
||||||
|
const factory BoardEvent.didReceiveGroups(List<GroupPB> groups) =
|
||||||
|
_DidReceiveGroups;
|
||||||
}
|
}
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
@ -230,16 +235,16 @@ class BoardState with _$BoardState {
|
|||||||
const factory BoardState({
|
const factory BoardState({
|
||||||
required String gridId,
|
required String gridId,
|
||||||
required Option<GridPB> grid,
|
required Option<GridPB> grid,
|
||||||
|
required List<String> groupIds,
|
||||||
required Option<RowPB> editingRow,
|
required Option<RowPB> editingRow,
|
||||||
required List<RowInfo> rowInfos,
|
|
||||||
required GridLoadingState loadingState,
|
required GridLoadingState loadingState,
|
||||||
required Option<FlowyError> noneOrError,
|
required Option<FlowyError> noneOrError,
|
||||||
}) = _BoardState;
|
}) = _BoardState;
|
||||||
|
|
||||||
factory BoardState.initial(String gridId) => BoardState(
|
factory BoardState.initial(String gridId) => BoardState(
|
||||||
rowInfos: [],
|
|
||||||
grid: none(),
|
grid: none(),
|
||||||
gridId: gridId,
|
gridId: gridId,
|
||||||
|
groupIds: [],
|
||||||
editingRow: none(),
|
editingRow: none(),
|
||||||
noneOrError: none(),
|
noneOrError: none(),
|
||||||
loadingState: const _Loading(),
|
loadingState: const _Loading(),
|
||||||
|
@ -32,13 +32,15 @@ class BoardPage extends StatelessWidget {
|
|||||||
create: (context) =>
|
create: (context) =>
|
||||||
BoardBloc(view: view)..add(const BoardEvent.initial()),
|
BoardBloc(view: view)..add(const BoardEvent.initial()),
|
||||||
child: BlocBuilder<BoardBloc, BoardState>(
|
child: BlocBuilder<BoardBloc, BoardState>(
|
||||||
|
buildWhen: (previous, current) =>
|
||||||
|
previous.loadingState != current.loadingState,
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
return state.loadingState.map(
|
return state.loadingState.map(
|
||||||
loading: (_) =>
|
loading: (_) =>
|
||||||
const Center(child: CircularProgressIndicator.adaptive()),
|
const Center(child: CircularProgressIndicator.adaptive()),
|
||||||
finish: (result) {
|
finish: (result) {
|
||||||
return result.successOrFail.fold(
|
return result.successOrFail.fold(
|
||||||
(_) => BoardContent(),
|
(_) => const BoardContent(),
|
||||||
(err) => FlowyErrorPage(err.toString()),
|
(err) => FlowyErrorPage(err.toString()),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -49,23 +51,36 @@ class BoardPage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BoardContent extends StatelessWidget {
|
class BoardContent extends StatefulWidget {
|
||||||
|
const BoardContent({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<BoardContent> createState() => _BoardContentState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BoardContentState extends State<BoardContent> {
|
||||||
|
late ScrollController scrollController;
|
||||||
final config = AFBoardConfig(
|
final config = AFBoardConfig(
|
||||||
columnBackgroundColor: HexColor.fromHex('#F7F8FC'),
|
columnBackgroundColor: HexColor.fromHex('#F7F8FC'),
|
||||||
);
|
);
|
||||||
|
|
||||||
BoardContent({Key? key}) : super(key: key);
|
@override
|
||||||
|
void initState() {
|
||||||
|
scrollController = ScrollController();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocBuilder<BoardBloc, BoardState>(
|
return BlocBuilder<BoardBloc, BoardState>(
|
||||||
|
buildWhen: (previous, current) => previous.groupIds != current.groupIds,
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
return Container(
|
return Container(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
|
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
|
||||||
child: AFBoard(
|
child: AFBoard(
|
||||||
scrollController: ScrollController(),
|
scrollController: scrollController,
|
||||||
dataController: context.read<BoardBloc>().boardController,
|
dataController: context.read<BoardBloc>().boardController,
|
||||||
headerBuilder: _buildHeader,
|
headerBuilder: _buildHeader,
|
||||||
footBuilder: _buildFooter,
|
footBuilder: _buildFooter,
|
||||||
@ -85,6 +100,12 @@ class BoardContent extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
scrollController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildHeader(
|
Widget _buildHeader(
|
||||||
BuildContext context, AFBoardColumnHeaderData headerData) {
|
BuildContext context, AFBoardColumnHeaderData headerData) {
|
||||||
return AppFlowyColumnHeader(
|
return AppFlowyColumnHeader(
|
||||||
@ -159,7 +180,7 @@ class BoardContent extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return AppFlowyColumnItemCard(
|
return AppFlowyColumnItemCard(
|
||||||
key: ObjectKey(columnItem),
|
key: ValueKey(columnItem.id),
|
||||||
margin: config.cardPadding,
|
margin: config.cardPadding,
|
||||||
decoration: _makeBoxDecoration(context),
|
decoration: _makeBoxDecoration(context),
|
||||||
child: BoardCard(
|
child: BoardCard(
|
||||||
|
@ -114,7 +114,7 @@ class _MultiBoardListExampleState extends State<MultiBoardListExample> {
|
|||||||
return Align(
|
return Align(
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 60),
|
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30),
|
||||||
child: Text(item.s),
|
child: Text(item.s),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -124,7 +124,7 @@ class _MultiBoardListExampleState extends State<MultiBoardListExample> {
|
|||||||
return Align(
|
return Align(
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 60),
|
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
|
@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
|
|||||||
const DART_LOG = "Dart_LOG";
|
const DART_LOG = "Dart_LOG";
|
||||||
|
|
||||||
class Log {
|
class Log {
|
||||||
static const enableLog = false;
|
static const enableLog = true;
|
||||||
|
|
||||||
static void info(String? message) {
|
static void info(String? message) {
|
||||||
if (enableLog) {
|
if (enableLog) {
|
||||||
|
@ -75,7 +75,7 @@ class AFBoard extends StatelessWidget {
|
|||||||
value: dataController,
|
value: dataController,
|
||||||
child: Consumer<AFBoardDataController>(
|
child: Consumer<AFBoardDataController>(
|
||||||
builder: (context, notifier, child) {
|
builder: (context, notifier, child) {
|
||||||
return BoardContent(
|
return AFBoardContent(
|
||||||
config: config,
|
config: config,
|
||||||
dataController: dataController,
|
dataController: dataController,
|
||||||
scrollController: scrollController,
|
scrollController: scrollController,
|
||||||
@ -94,7 +94,7 @@ class AFBoard extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BoardContent extends StatefulWidget {
|
class AFBoardContent extends StatefulWidget {
|
||||||
final ScrollController? scrollController;
|
final ScrollController? scrollController;
|
||||||
final OnDragStarted? onDragStarted;
|
final OnDragStarted? onDragStarted;
|
||||||
final OnReorder onReorder;
|
final OnReorder onReorder;
|
||||||
@ -118,7 +118,7 @@ class BoardContent extends StatefulWidget {
|
|||||||
|
|
||||||
final BoardPhantomController phantomController;
|
final BoardPhantomController phantomController;
|
||||||
|
|
||||||
const BoardContent({
|
const AFBoardContent({
|
||||||
required this.config,
|
required this.config,
|
||||||
required this.onReorder,
|
required this.onReorder,
|
||||||
required this.delegate,
|
required this.delegate,
|
||||||
@ -137,12 +137,12 @@ class BoardContent extends StatefulWidget {
|
|||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<BoardContent> createState() => _BoardContentState();
|
State<AFBoardContent> createState() => _AFBoardContentState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _BoardContentState extends State<BoardContent> {
|
class _AFBoardContentState extends State<AFBoardContent> {
|
||||||
final GlobalKey _columnContainerOverlayKey =
|
final GlobalKey _columnContainerOverlayKey =
|
||||||
GlobalKey(debugLabel: '$BoardContent overlay key');
|
GlobalKey(debugLabel: '$AFBoardContent overlay key');
|
||||||
late BoardOverlayEntry _overlayEntry;
|
late BoardOverlayEntry _overlayEntry;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -215,6 +215,7 @@ class _BoardContentState extends State<BoardContent> {
|
|||||||
child: Consumer<AFBoardColumnDataController>(
|
child: Consumer<AFBoardColumnDataController>(
|
||||||
builder: (context, value, child) {
|
builder: (context, value, child) {
|
||||||
final boardColumn = AFBoardColumnWidget(
|
final boardColumn = AFBoardColumnWidget(
|
||||||
|
key: ValueKey(columnData.id),
|
||||||
margin: _marginFromIndex(columnIndex),
|
margin: _marginFromIndex(columnIndex),
|
||||||
itemMargin: widget.config.columnItemPadding,
|
itemMargin: widget.config.columnItemPadding,
|
||||||
headerBuilder: _buildHeader,
|
headerBuilder: _buildHeader,
|
||||||
|
@ -88,9 +88,7 @@ class AFBoardColumnWidget extends StatefulWidget {
|
|||||||
|
|
||||||
final Color backgroundColor;
|
final Color backgroundColor;
|
||||||
|
|
||||||
final GlobalKey columnGlobalKey = GlobalKey();
|
const AFBoardColumnWidget({
|
||||||
|
|
||||||
AFBoardColumnWidget({
|
|
||||||
Key? key,
|
Key? key,
|
||||||
this.headerBuilder,
|
this.headerBuilder,
|
||||||
this.footBuilder,
|
this.footBuilder,
|
||||||
@ -140,7 +138,7 @@ class _AFBoardColumnWidgetState extends State<AFBoardColumnWidget> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
Widget reorderFlex = ReorderFlex(
|
Widget reorderFlex = ReorderFlex(
|
||||||
key: widget.columnGlobalKey,
|
key: widget.key,
|
||||||
scrollController: widget.scrollController,
|
scrollController: widget.scrollController,
|
||||||
config: widget.config,
|
config: widget.config,
|
||||||
onDragStarted: (index) {
|
onDragStarted: (index) {
|
||||||
@ -163,9 +161,6 @@ class _AFBoardColumnWidgetState extends State<AFBoardColumnWidget> {
|
|||||||
children: children,
|
children: children,
|
||||||
);
|
);
|
||||||
|
|
||||||
// reorderFlex =
|
|
||||||
// KeyedSubtree(key: widget.columnGlobalKey, child: reorderFlex);
|
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
margin: widget.margin,
|
margin: widget.margin,
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
|
@ -196,7 +196,6 @@ class AFBoardDataController extends ChangeNotifier
|
|||||||
final index =
|
final index =
|
||||||
columnDataController.items.indexWhere((item) => item.isPhantom);
|
columnDataController.items.indexWhere((item) => item.isPhantom);
|
||||||
|
|
||||||
assert(index != -1);
|
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
if (index != newIndex) {
|
if (index != newIndex) {
|
||||||
Log.trace(
|
Log.trace(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user