feat: Handle the dropdown via a bottom sheet

This commit is contained in:
2026-05-10 22:46:26 +02:00
parent c422d5c27c
commit d71fa9b5f8
2 changed files with 37 additions and 44 deletions

View File

@@ -40,7 +40,7 @@
}, },
"details": { "details": {
"title": "Detalles", "title": "Detalles",
"removeTitle": "¿Eliminar el $título?", "removeTitle": "¿Eliminar el $title?",
"removeBody": "¿Estás seguro de querer eliminar \"$title\" de la lista?", "removeBody": "¿Estás seguro de querer eliminar \"$title\" de la lista?",
"removeButton": "Eliminar", "removeButton": "Eliminar",
"cancelButton": "Cancelar", "cancelButton": "Cancelar",

View File

@@ -1,3 +1,4 @@
import 'package:anitrack/src/ui/widgets/list_item.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class SelectorItem<T> { class SelectorItem<T> {
@@ -31,44 +32,6 @@ class DropdownSelector<T> extends StatefulWidget {
DropdownSelectorState<T> createState() => DropdownSelectorState<T>(); DropdownSelectorState<T> createState() => DropdownSelectorState<T>();
} }
class DropdownSelectorDialog<T> extends StatelessWidget {
const DropdownSelectorDialog({
required this.values,
super.key,
});
final List<SelectorItem<T>> values;
@override
Widget build(BuildContext context) {
return SafeArea(
child: Material(
color: Theme.of(context).scaffoldBackgroundColor,
child: ListView.builder(
itemCount: values.length,
itemBuilder: (context, index) => InkWell(
onTap: () {
Navigator.of(context).pop(values[index].value);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(16),
child: Text(
values[index].text,
style: Theme.of(context).textTheme.titleLarge,
),
),
],
),
),
),
),
);
}
}
class DropdownSelectorState<T> extends State<DropdownSelector<T>> { class DropdownSelectorState<T> extends State<DropdownSelector<T>> {
late int index; late int index;
@@ -89,11 +52,41 @@ class DropdownSelectorState<T> extends State<DropdownSelector<T>> {
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
final result = await showDialog<T>( final result = await showModalBottomSheet<T>(
context: context, context: context,
builder: (context) => DropdownSelectorDialog<T>( clipBehavior: Clip.antiAlias,
values: widget.values.cast<SelectorItem<T>>(), builder: (context) => DraggableScrollableSheet(
), initialChildSize: 1,
builder: (context, controller) => ListView.builder(
shrinkWrap: true,
controller: controller,
itemCount: widget.values.length,
itemBuilder: (context, index) => InkWell(
onTap: () {
Navigator.of(context).pop(widget.values[index].value);
},
child: Padding(
padding: const EdgeInsetsGeometry.symmetric(
horizontal: 16,
vertical: 12,
),
child: Row(
children: [
Text(
widget.values[index].text,
style: Theme.of(context).textTheme.titleLarge,
),
if (this.index == index)
const Padding(
padding: EdgeInsets.only(left: 12),
child: Icon(Icons.check),
),
],
),
),
),
),
),
); );
if (result == null) return; if (result == null) return;