support long press gesture

This commit is contained in:
Fabian Freund
2025-10-02 11:46:59 +02:00
parent a3681ad3c6
commit 20f077d254
2 changed files with 46 additions and 20 deletions
@@ -19,6 +19,7 @@
*/
import 'package:fading_scroll/fading_scroll.dart';
import 'package:flutter/material.dart';
import 'package:nullability/nullability.dart';
class _BadgeWrapper extends StatelessWidget {
final Widget child;
@@ -39,6 +40,20 @@ class _BadgeWrapper extends StatelessWidget {
}
}
class _GestureWrapper extends StatelessWidget {
final Widget child;
final GestureLongPressCallback? onLongPress;
const _GestureWrapper({required this.child, this.onLongPress});
@override
Widget build(BuildContext context) {
return onLongPress != null
? InkWell(onLongPress: onLongPress, child: child)
: child;
}
}
class SelectableChips<T extends S, S, K> extends StatelessWidget {
final List<T> availableItems;
final List<Widget> prefixListItems;
@@ -56,6 +71,7 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
final void Function(T item)? onSelected;
final void Function(T item)? onDeleted;
final void Function(T item)? onLongPress;
const SelectableChips({
required this.itemId,
@@ -71,6 +87,7 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
this.deleteIcon = true,
this.onSelected,
this.onDeleted,
this.onLongPress,
super.key,
});
@@ -110,26 +127,32 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
padding: const EdgeInsets.only(right: 8.0, top: 4.0),
child: _BadgeWrapper(
count: itemBadgeCount?.call(item),
child: FilterChip(
selected:
selectedItem != null &&
itemId(item) == itemId(selectedItem as S),
showCheckmark: false,
onSelected: (value) {
if (value) {
onSelected?.call(item);
} else {
onDeleted?.call(item);
}
},
onDeleted: deleteIcon
? () {
onDeleted?.call(item);
}
: null,
label: itemLabel.call(item),
avatar: itemAvatar?.call(item),
tooltip: itemTooltip?.call(item),
child: _GestureWrapper(
onLongPress: onLongPress.mapNotNull(
(callback) =>
() => callback(item),
),
child: FilterChip(
selected:
selectedItem != null &&
itemId(item) == itemId(selectedItem as S),
showCheckmark: false,
onSelected: (value) {
if (value) {
onSelected?.call(item);
} else {
onDeleted?.call(item);
}
},
onDeleted: deleteIcon
? () {
onDeleted?.call(item);
}
: null,
label: itemLabel.call(item),
avatar: itemAvatar?.call(item),
tooltip: itemTooltip?.call(item),
),
),
),
);