Skip to content

Instantly share code, notes, and snippets.

@k4zek4ge
Last active November 28, 2023 14:45
Show Gist options
  • Save k4zek4ge/84c73b764f7ba6c843e5f4a909435435 to your computer and use it in GitHub Desktop.
Save k4zek4ge/84c73b764f7ba6c843e5f4a909435435 to your computer and use it in GitHub Desktop.
[receiving plutogrid events] #flutter https://github.com/bosskmk/pluto_grid/issues/633
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:pluto_grid/pluto_grid.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<PlutoColumn> columns = [
PlutoColumn(title: 'Id', field: 'id', type: PlutoColumnType.text()),
PlutoColumn(title: 'Name', field: 'name', type: PlutoColumnType.text()),
PlutoColumn(title: 'Age', field: 'age', type: PlutoColumnType.number()),
];
final List<PlutoRow> rows = [
PlutoRow(cells: {
'id': PlutoCell(value: '1'),
'name': PlutoCell(value: 'Kim'),
'age': PlutoCell(value: 20),
}),
PlutoRow(cells: {
'id': PlutoCell(value: '2'),
'name': PlutoCell(value: 'Lee'),
'age': PlutoCell(value: 20),
}),
];
late PlutoGridStateManager stateManager;
late StreamSubscription<PlutoGridEvent> events;
@override
void dispose() {
events.cancel();
super.dispose();
}
void _listener(PlutoGridEvent event) {
if (event is PlutoGridChangeColumnFilterEvent) {
print('changed filter value event');
// Column on which filtering occurred.
print(event.column.title);
// The filtering type of the column where the filtering occurred.
print(event.filterType);
// Filtered values.
print(event.filterValue);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
padding: const EdgeInsets.all(15),
child: PlutoGrid(
columns: columns,
rows: rows,
onChanged: (PlutoGridOnChangedEvent event) {
print(event);
},
onLoaded: (PlutoGridOnLoadedEvent event) {
stateManager = event.stateManager;
stateManager.setShowColumnFilter(true);
events = stateManager.eventManager!.listener(_listener);
},
),
),
),
);
}
}
import 'package:flutter/material.dart';
import 'package:pluto_grid/pluto_grid.dart';
import '../../dummy_data/development.dart';
import '../../widget/pluto_example_button.dart';
import '../../widget/pluto_example_screen.dart';
class ColumnFilteringScreen extends StatefulWidget {
static const routeName = 'feature/column-filtering';
@override
_ColumnFilteringScreenState createState() => _ColumnFilteringScreenState();
}
class _ColumnFilteringScreenState extends State<ColumnFilteringScreen> {
List<PlutoColumn>? columns;
List<PlutoRow>? rows;
late PlutoGridStateManager stateManager;
@override
void initState() {
super.initState();
columns = [
PlutoColumn(
title: 'Text',
field: 'text',
type: PlutoColumnType.text(),
),
PlutoColumn(
title: 'Number',
field: 'number',
type: PlutoColumnType.number(),
),
PlutoColumn(
title: 'Date',
field: 'date',
type: PlutoColumnType.date(),
),
PlutoColumn(
title: 'Disable',
field: 'disable',
type: PlutoColumnType.text(),
enableFilterMenuItem: false,
),
PlutoColumn(
title: 'Select',
field: 'select',
type: PlutoColumnType.select(<String>['A', 'B', 'C', 'D', 'E', 'F']),
),
];
rows = DummyData.rowsByColumns(length: 30, columns: columns);
}
List<PlutoColumn> getFilteredColumns() {
return stateManager.refColumns!.where((e) {
return stateManager.isFilteredColumn(e);
}).toList();
}
@override
Widget build(BuildContext context) {
return PlutoExampleScreen(
title: 'Column filtering',
topTitle: 'Column filtering',
topContents: [
const Text('Filter rows by setting filters on columns.'),
const SizedBox(
height: 10,
),
const Text(
'Select the SetFilter menu from the menu that appears when you tap the icon on the right of the column'),
const Text(
'If the filter is set to all or complex conditions, TextField under the column is deactivated.'),
const Text(
'Also, like the Disable column, if enableFilterMenuItem is false, it is excluded from all column filtering conditions.'),
const Text(
'In the case of the Select column, it is a custom filter that can filter multiple filters with commas. (ex: a,b,c)'),
const SizedBox(
height: 10,
),
const Text('Check out the source to add custom filters.'),
],
topButtons: [
PlutoExampleButton(
url:
'https://github.com/bosskmk/pluto_grid/blob/master/example/lib/screen/feature/column_filtering_screen.dart',
),
],
body: PlutoGrid(
columns: columns,
rows: rows,
createHeader: (s) {
return Row(
children: [
ElevatedButton(
onPressed: () {
print(getFilteredColumns());
},
child: const Text('Get filtered columns'),
)
],
);
},
onLoaded: (PlutoGridOnLoadedEvent event) {
stateManager = event.stateManager!;
stateManager.setShowColumnFilter(true);
stateManager.eventManager!.listener((event) {
if (event is PlutoGridChangeColumnFilterEvent) {
print('Changed filter value');
print(event.column!.title);
print(event.filterType);
print(event.filterValue);
print('Previous filters');
print(getFilteredColumns());
}
});
},
onChanged: (PlutoGridOnChangedEvent event) {
print(event);
},
configuration: PlutoGridConfiguration(
/// If columnFilterConfig is not set, the default setting is applied.
///
/// Return the value returned by resolveDefaultColumnFilter through the resolver function.
/// Prevents errors returning filters that are not in the filters list.
columnFilterConfig: PlutoGridColumnFilterConfig(
filters: const [
...FilterHelper.defaultFilters,
// custom filter
ClassYouImplemented(),
],
resolveDefaultColumnFilter: (column, resolver) {
if (column.field == 'text') {
return resolver<PlutoFilterTypeContains>() as PlutoFilterType;
} else if (column.field == 'number') {
return resolver<PlutoFilterTypeGreaterThan>()
as PlutoFilterType;
} else if (column.field == 'date') {
return resolver<PlutoFilterTypeLessThan>() as PlutoFilterType;
} else if (column.field == 'select') {
return resolver<ClassYouImplemented>() as PlutoFilterType;
}
return resolver<PlutoFilterTypeContains>() as PlutoFilterType;
},
),
),
),
);
}
}
class ClassYouImplemented implements PlutoFilterType {
String get title => 'Custom contains';
get compare => ({
required String? base,
required String? search,
required PlutoColumn? column,
}) {
var keys = search!.split(',').map((e) => e.toUpperCase()).toList();
return keys.contains(base!.toUpperCase());
};
const ClassYouImplemented();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment