|
@@ -9,6 +9,7 @@ import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart';
|
|
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show Field;
|
|
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart' show Field;
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
+import 'package:linked_scroll_controller/linked_scroll_controller.dart';
|
|
import 'controller/grid_scroll.dart';
|
|
import 'controller/grid_scroll.dart';
|
|
import 'layout/layout.dart';
|
|
import 'layout/layout.dart';
|
|
import 'layout/sizes.dart';
|
|
import 'layout/sizes.dart';
|
|
@@ -73,17 +74,23 @@ class FlowyGrid extends StatefulWidget {
|
|
}
|
|
}
|
|
|
|
|
|
class _FlowyGridState extends State<FlowyGrid> {
|
|
class _FlowyGridState extends State<FlowyGrid> {
|
|
- final _scrollController = GridScrollController();
|
|
|
|
|
|
+ final _scrollController = GridScrollController(scrollGroupContorller: LinkedScrollControllerGroup());
|
|
|
|
+
|
|
|
|
+ @override
|
|
|
|
+ void dispose() {
|
|
|
|
+ _scrollController.dispose();
|
|
|
|
+ super.dispose();
|
|
|
|
+ }
|
|
|
|
|
|
@override
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
Widget build(BuildContext context) {
|
|
return BlocBuilder<GridBloc, GridState>(
|
|
return BlocBuilder<GridBloc, GridState>(
|
|
buildWhen: (previous, current) => previous.fields.length != current.fields.length,
|
|
buildWhen: (previous, current) => previous.fields.length != current.fields.length,
|
|
builder: (context, state) {
|
|
builder: (context, state) {
|
|
|
|
+ final contentWidth = GridLayout.headerWidth(state.fields);
|
|
final child = _wrapScrollView(
|
|
final child = _wrapScrollView(
|
|
- state.fields,
|
|
|
|
|
|
+ contentWidth,
|
|
[
|
|
[
|
|
- _GridHeader(gridId: state.gridId, fields: state.fields),
|
|
|
|
const _GridRows(),
|
|
const _GridRows(),
|
|
const _GridFooter(),
|
|
const _GridFooter(),
|
|
],
|
|
],
|
|
@@ -91,6 +98,7 @@ class _FlowyGridState extends State<FlowyGrid> {
|
|
|
|
|
|
return Column(children: [
|
|
return Column(children: [
|
|
const _GridToolbarAdaptor(),
|
|
const _GridToolbarAdaptor(),
|
|
|
|
+ _gridHeader(context, state.gridId, contentWidth),
|
|
Flexible(child: child),
|
|
Flexible(child: child),
|
|
]);
|
|
]);
|
|
},
|
|
},
|
|
@@ -98,7 +106,7 @@ class _FlowyGridState extends State<FlowyGrid> {
|
|
}
|
|
}
|
|
|
|
|
|
Widget _wrapScrollView(
|
|
Widget _wrapScrollView(
|
|
- List<Field> fields,
|
|
|
|
|
|
+ double contentWidth,
|
|
List<Widget> slivers,
|
|
List<Widget> slivers,
|
|
) {
|
|
) {
|
|
final verticalScrollView = ScrollConfiguration(
|
|
final verticalScrollView = ScrollConfiguration(
|
|
@@ -111,7 +119,7 @@ class _FlowyGridState extends State<FlowyGrid> {
|
|
);
|
|
);
|
|
|
|
|
|
final sizedVerticalScrollView = SizedBox(
|
|
final sizedVerticalScrollView = SizedBox(
|
|
- width: GridLayout.headerWidth(fields),
|
|
|
|
|
|
+ width: contentWidth,
|
|
child: verticalScrollView,
|
|
child: verticalScrollView,
|
|
);
|
|
);
|
|
|
|
|
|
@@ -128,6 +136,19 @@ class _FlowyGridState extends State<FlowyGrid> {
|
|
child: horizontalScrollView,
|
|
child: horizontalScrollView,
|
|
);
|
|
);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ Widget _gridHeader(BuildContext context, String gridId, double contentWidth) {
|
|
|
|
+ final fieldCache = context.read<GridBloc>().fieldCache;
|
|
|
|
+
|
|
|
|
+ return SizedBox(
|
|
|
|
+ width: contentWidth,
|
|
|
|
+ child: GridHeaderSliverAdaptor(
|
|
|
|
+ gridId: gridId,
|
|
|
|
+ fieldCache: fieldCache,
|
|
|
|
+ anchorScrollController: _scrollController.linkHorizontalController(),
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
class _GridToolbarAdaptor extends StatelessWidget {
|
|
class _GridToolbarAdaptor extends StatelessWidget {
|
|
@@ -149,18 +170,6 @@ class _GridToolbarAdaptor extends StatelessWidget {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-class _GridHeader extends StatelessWidget {
|
|
|
|
- final String gridId;
|
|
|
|
- final List<Field> fields;
|
|
|
|
- const _GridHeader({Key? key, required this.gridId, required this.fields}) : super(key: key);
|
|
|
|
-
|
|
|
|
- @override
|
|
|
|
- Widget build(BuildContext context) {
|
|
|
|
- final fieldCache = context.read<GridBloc>().fieldCache;
|
|
|
|
- return GridHeaderSliverAdaptor(gridId: gridId, fieldCache: fieldCache);
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
class _GridRows extends StatefulWidget {
|
|
class _GridRows extends StatefulWidget {
|
|
const _GridRows({Key? key}) : super(key: key);
|
|
const _GridRows({Key? key}) : super(key: key);
|
|
|
|
|