Skip to content

Commit 41131ce

Browse files
committed
ready to publish
0 parents  commit 41131ce

19 files changed

+3124
-0
lines changed

.gitignore

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Miscellaneous
2+
*.class
3+
*.log
4+
*.pyc
5+
*.swp
6+
.DS_Store
7+
.atom/
8+
.buildlog/
9+
.history
10+
.svn/
11+
migrate_working_dir/
12+
13+
# IntelliJ related
14+
*.iml
15+
*.ipr
16+
*.iws
17+
.idea/
18+
19+
# The .vscode folder contains launch configuration and tasks you configure in
20+
# VS Code which you may wish to be included in version control, so this line
21+
# is commented out by default.
22+
#.vscode/
23+
24+
# Flutter/Dart/Pub related
25+
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
26+
/pubspec.lock
27+
**/doc/api/
28+
.dart_tool/
29+
.packages
30+
build/

.metadata

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# This file tracks properties of this Flutter project.
2+
# Used by Flutter tool to assess capabilities and perform upgrades etc.
3+
#
4+
# This file should be version controlled and should not be manually edited.
5+
6+
version:
7+
revision: "5b12b7467fcbbdc7351d76690ce8a8693e804179"
8+
channel: "master"
9+
10+
project_type: package

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## 0.0.1
2+
3+
* TODO: Describe initial release.

LICENSE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
TODO: Add your license here.

README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<!--
2+
This README describes the package. If you publish this package to pub.dev,
3+
this README's contents appear on the landing page for your package.
4+
5+
For information about how to write a good package README, see the guide for
6+
[writing package pages](https://dart.dev/guides/libraries/writing-package-pages).
7+
8+
For general information about developing packages, see the Dart guide for
9+
[creating packages](https://dart.dev/guides/libraries/create-library-packages)
10+
and the Flutter guide for
11+
[developing packages and plugins](https://flutter.dev/developing-packages).
12+
-->
13+
14+
TODO: Put a short description of the package here that helps potential users
15+
know whether this package might be useful for them.
16+
17+
## Features
18+
19+
TODO: List what your package can do. Maybe include images, gifs, or videos.
20+
21+
## Getting started
22+
23+
TODO: List prerequisites and provide or point to information on how to
24+
start using the package.
25+
26+
## Usage
27+
28+
TODO: Include short and useful examples for package users. Add longer examples
29+
to `/example` folder.
30+
31+
```dart
32+
const like = 'sample';
33+
```
34+
35+
## Additional information
36+
37+
TODO: Tell users more about the package: where to find more information, how to
38+
contribute to the package, how to file issues, what response they can expect
39+
from the package authors, and more.

analysis_options.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
include: package:flutter_lints/flutter.yaml
2+
3+
# Additional information about this file can be found at
4+
# https://dart.dev/guides/language/analysis-options

lib/dx_table.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export 'src/dx_table.dart';

lib/src/dx_table.dart

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
// ignore_for_file: public_member_api_docs, sort_constructors_first
2+
library dx_table;
3+
4+
import 'package:dx_table/src/renderer/flutter_table.dart';
5+
import 'package:dx_table/src/renderer/rendering.dart';
6+
import 'package:flutter/material.dart'
7+
hide
8+
Table,
9+
TableRow,
10+
TableCellVerticalAlignment,
11+
TableColumnWidth,
12+
IntrinsicColumnWidth;
13+
14+
part 'dx_table_controller.dart';
15+
part 'dx_table_header.dart';
16+
part 'dx_table_row.dart';
17+
part 'dx_table_row_element.dart';
18+
part 'sorting_logic.ext.dart';
19+
part 'filtering_logic.ext.dart';
20+
21+
typedef DxTableState = _DxTableState;
22+
typedef DxRowClickCallback = void Function(int index);
23+
24+
class DxTable extends StatefulWidget {
25+
final double tableWidth;
26+
final Duration animationDuration;
27+
final EdgeInsets? margin;
28+
final DxTableHeader header;
29+
final List<DxTableRow> rows;
30+
final DxTableController dxTableController;
31+
final DxRowClickCallback? onClick;
32+
final bool enableFilter;
33+
final bool enableSort;
34+
final double? height;
35+
final TableColumnWidth tableColumnWidth;
36+
final Map<int, TableColumnWidth>? columnWidthMap;
37+
38+
const DxTable({
39+
super.key,
40+
required this.tableWidth,
41+
required this.animationDuration,
42+
required this.header,
43+
required this.rows,
44+
required this.dxTableController,
45+
this.margin,
46+
this.onClick,
47+
this.enableFilter = false,
48+
this.enableSort = false,
49+
this.height,
50+
this.tableColumnWidth = const IntrinsicColumnWidth(flex: null),
51+
this.columnWidthMap,
52+
});
53+
54+
@override
55+
State<DxTable> createState() => _DxTableState();
56+
}
57+
58+
class _DxTableState extends State<DxTable> with SingleTickerProviderStateMixin {
59+
late AnimationController animationController;
60+
61+
@override
62+
void initState() {
63+
animationController = AnimationController(
64+
vsync: this,
65+
duration: widget.animationDuration,
66+
);
67+
68+
widget.dxTableController._enableHover();
69+
70+
widget.dxTableController
71+
._init(animationController, widget.onClick, _refresh);
72+
73+
widget.dxTableController._buildHeader(
74+
dxTableHeader: widget.header,
75+
context: context,
76+
);
77+
78+
widget.dxTableController._buildRowMap(
79+
rows: widget.rows,
80+
context: context,
81+
shouldFilter: widget.enableFilter,
82+
);
83+
84+
super.initState();
85+
}
86+
87+
void _refresh() {
88+
setState(() {});
89+
}
90+
91+
// void _renderStickyHeader() {
92+
// OverlayEntry overlayEntry = OverlayEntry(
93+
// builder: (context) {
94+
// return Positioned(
95+
// top: 0,
96+
// child: Row(
97+
// children: widget.dxTableController._columnWidths
98+
// .map((e) => Container(
99+
// height: widget.dxTableController._rowHeight,
100+
// width: e,
101+
// color: Colors.primaries[
102+
// Random().nextInt(Colors.primaries.length - 1)],
103+
// ))
104+
// .toList(),
105+
// ),
106+
// );
107+
// },
108+
// );
109+
110+
// Overlay.of(context).insert(overlayEntry);
111+
// }
112+
113+
@override
114+
void dispose() {
115+
widget.dxTableController.dispose();
116+
super.dispose();
117+
}
118+
119+
final ValueNotifier<List<double>?> _columnWidths =
120+
ValueNotifier<List<double>?>(null);
121+
122+
void _buildStickyHeader() {
123+
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
124+
_columnWidths.value = widget.dxTableController._columnWidths;
125+
});
126+
}
127+
128+
@override
129+
Widget build(BuildContext context) {
130+
_buildStickyHeader();
131+
return Container(
132+
margin: widget.margin,
133+
height: widget.height,
134+
child: SingleChildScrollView(
135+
scrollDirection: Axis.horizontal,
136+
child: Stack(
137+
children: [
138+
Container(
139+
width: widget.tableWidth,
140+
margin: EdgeInsets.only(top: widget.header.headerHeight),
141+
child: AnimatedBuilder(
142+
animation: animationController,
143+
builder: (context, _) {
144+
return SingleChildScrollView(
145+
child: Table(
146+
defaultVerticalAlignment:
147+
TableCellVerticalAlignment.middle,
148+
defaultColumnWidth: widget.tableColumnWidth,
149+
columnWidths: widget.columnWidthMap,
150+
children: [
151+
...widget.dxTableController._filteredRows.map(
152+
(e) => e._build,
153+
),
154+
],
155+
dxTableController: widget.dxTableController,
156+
),
157+
);
158+
}),
159+
),
160+
ValueListenableBuilder<List<double>?>(
161+
valueListenable: _columnWidths,
162+
builder: (context, arr, _) {
163+
if (arr == null) return const SizedBox();
164+
return widget.dxTableController._dxTableHeader._buildRow(arr);
165+
},
166+
),
167+
],
168+
),
169+
),
170+
);
171+
}
172+
}

0 commit comments

Comments
 (0)