chore: optimize rebuild column

This commit is contained in:
appflowy 2022-08-26 11:51:42 +08:00
parent 9ce7fcb704
commit 6e0a191be1
7 changed files with 48 additions and 27 deletions

View File

@ -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(),

View File

@ -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(

View File

@ -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: [

View File

@ -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) {

View File

@ -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,

View File

@ -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,

View File

@ -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(