multiple selection of listitems
This commit is contained in:
@@ -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<DetailChecklistPage> {
|
||||
List<Item> _items = [];
|
||||
int? _selectedItemId;
|
||||
String? pageTitle;
|
||||
List<int> selectedItems = [];
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
@@ -108,11 +111,6 @@ class _DetailChecklistPageState extends State<DetailChecklistPage> {
|
||||
],
|
||||
),
|
||||
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<DetailChecklistPage> {
|
||||
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<DetailChecklistPage> {
|
||||
}
|
||||
|
||||
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<DetailChecklistPage> {
|
||||
DbHelper.getItemsByChecklistId(checklistId),
|
||||
]);
|
||||
}
|
||||
|
||||
void _itemSelectionChanged(bool isSelected, int index) {
|
||||
if (isSelected) {
|
||||
setState(() {
|
||||
selectedItems.add(index);
|
||||
});
|
||||
} else {
|
||||
setState(() {
|
||||
selectedItems.remove(index);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _onDeleteItemsPressed() {}
|
||||
}
|
||||
|
||||
@@ -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,9 +94,11 @@ class DbHelper {
|
||||
}
|
||||
await _client.from(itemsTableName).upsert(upsertMap);
|
||||
} catch (e) {
|
||||
if (kDebugMode) {
|
||||
print(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Future<List<Item>> getItemsByChecklistId(int checklistId) async {
|
||||
final List<Item> items = [];
|
||||
|
||||
50
lib/widgets/item_list_tile.dart
Normal file
50
lib/widgets/item_list_tile.dart
Normal file
@@ -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<ItemListTile> createState() => _ItemListTileState();
|
||||
}
|
||||
|
||||
class _ItemListTileState extends State<ItemListTile> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user