From 37704abfa139d2e77a6b08f1dfae74743ffacade Mon Sep 17 00:00:00 2001 From: marcoabat Date: Sun, 6 Aug 2023 20:38:55 +0200 Subject: [PATCH] multiple selection of listitems --- lib/pages/detail_checklist_page.dart | 37 +++++++++++++++----- lib/services/dbhelper.dart | 5 ++- lib/widgets/item_list_tile.dart | 50 ++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 lib/widgets/item_list_tile.dart diff --git a/lib/pages/detail_checklist_page.dart b/lib/pages/detail_checklist_page.dart index 955067c..5fff463 100644 --- a/lib/pages/detail_checklist_page.dart +++ b/lib/pages/detail_checklist_page.dart @@ -5,6 +5,8 @@ import 'package:briessenchecker/services/dbhelper.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../widgets/item_list_tile.dart'; + class DetailChecklistPage extends StatefulWidget { const DetailChecklistPage({super.key}); @@ -21,6 +23,7 @@ class _DetailChecklistPageState extends State { List _items = []; int? _selectedItemId; String? pageTitle; + List selectedItems = []; @override void dispose() { @@ -108,11 +111,6 @@ class _DetailChecklistPageState extends State { ], ), actions: [ - if (_selectedItemId != null) - TextButton( - onPressed: () => DbHelper.deleteItemById(_selectedItemId!), - child: const Text('delete'), - ), TextButton( onPressed: () { _itemSaved(titleCon.text, descCon.text); @@ -138,6 +136,12 @@ class _DetailChecklistPageState extends State { return Scaffold( appBar: AppBar( title: Text(pageTitle ?? ''), + actions: [ + if (selectedItems.isNotEmpty) + IconButton( + onPressed: _onDeleteItemsPressed, + icon: const Icon(Icons.delete)) + ], ), body: FutureBuilder( future: _checklistFutures, @@ -151,10 +155,13 @@ class _DetailChecklistPageState extends State { } Widget? _itemListBuilder(BuildContext context, int index) { - return ListTile( - title: Text(_items.elementAt(index).title), - subtitle: Text(_items.elementAt(index).description), + return ItemListTile( + title: _items.elementAt(index).title, + description: _items.elementAt(index).description, onTap: () => _itemTapped(index), + itemSelectionChanged: (isSelected) => + _itemSelectionChanged(isSelected, index), + selectionMode: selectedItems.isNotEmpty, ); } @@ -164,4 +171,18 @@ class _DetailChecklistPageState extends State { DbHelper.getItemsByChecklistId(checklistId), ]); } + + void _itemSelectionChanged(bool isSelected, int index) { + if (isSelected) { + setState(() { + selectedItems.add(index); + }); + } else { + setState(() { + selectedItems.remove(index); + }); + } + } + + void _onDeleteItemsPressed() {} } diff --git a/lib/services/dbhelper.dart b/lib/services/dbhelper.dart index e9c9427..3eb718a 100644 --- a/lib/services/dbhelper.dart +++ b/lib/services/dbhelper.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../models/checklist.dart'; @@ -93,7 +94,9 @@ class DbHelper { } await _client.from(itemsTableName).upsert(upsertMap); } catch (e) { - print(e); + if (kDebugMode) { + print(e); + } } } diff --git a/lib/widgets/item_list_tile.dart b/lib/widgets/item_list_tile.dart new file mode 100644 index 0000000..7a69ee7 --- /dev/null +++ b/lib/widgets/item_list_tile.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; + +typedef BoolCallback = void Function(bool isSelected); + +class ItemListTile extends StatefulWidget { + const ItemListTile({ + super.key, + required this.title, + required this.description, + required this.onTap, + required this.itemSelectionChanged, + required this.selectionMode, + }); + final String title; + final String description; + final bool selectionMode; + final VoidCallback onTap; + final BoolCallback itemSelectionChanged; + + @override + State createState() => _ItemListTileState(); +} + +class _ItemListTileState extends State { + bool isSelected = false; + @override + Widget build(BuildContext context) { + return ListTile( + title: Text(widget.title), + subtitle: Text(widget.description), + onTap: _onTap, + onLongPress: _onLongPress, + selected: isSelected, + ); + } + + void _onLongPress() { + setState(() => isSelected = true); + widget.itemSelectionChanged(isSelected); + } + + void _onTap() { + if (isSelected || widget.selectionMode) { + setState(() => isSelected = !isSelected); + widget.itemSelectionChanged(isSelected); + } else { + widget.onTap(); + } + } +}