97 lines
2.6 KiB
Dart
97 lines
2.6 KiB
Dart
import 'package:boxchecker/check_list.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'data_util.dart' as data;
|
|
import 'db_helper.dart';
|
|
|
|
typedef FutureCallback = Future<bool?> Function(DismissDirection);
|
|
|
|
class CheckListItem extends StatefulWidget {
|
|
const CheckListItem(
|
|
{Key? key,
|
|
required this.item,
|
|
required this.confirmDismiss,
|
|
this.locked = false})
|
|
: super(key: key);
|
|
final data.Check item;
|
|
final FutureCallback confirmDismiss;
|
|
final bool locked;
|
|
|
|
@override
|
|
State<StatefulWidget> createState() => _CheckListItem();
|
|
}
|
|
|
|
class _CheckListItem extends State<CheckListItem> {
|
|
Widget dismissIconPadding(Widget icon) {
|
|
return Padding(
|
|
padding: const EdgeInsets.all(10),
|
|
child: icon,
|
|
);
|
|
}
|
|
|
|
Widget dismissBackground() {
|
|
return Container(
|
|
color: Colors.blue,
|
|
child: Row(children: const [
|
|
Padding(
|
|
padding: EdgeInsets.all(10),
|
|
child: Icon(Icons.check),
|
|
),
|
|
Spacer(),
|
|
]));
|
|
}
|
|
|
|
Widget dismissSecondaryBackground() {
|
|
return Container(
|
|
color: Colors.red,
|
|
child: Row(children: [
|
|
const Spacer(),
|
|
dismissIconPadding(const Icon(Icons.delete_forever)),
|
|
]),
|
|
);
|
|
}
|
|
|
|
Widget dismissLockedBackground() {
|
|
return Container(
|
|
color: Colors.grey[900],
|
|
child: Row(
|
|
children: [
|
|
dismissIconPadding(const Icon(Icons.lock)),
|
|
const Spacer(),
|
|
dismissIconPadding(const Icon(Icons.lock)),
|
|
],
|
|
));
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Dismissible(
|
|
key: Key(widget.item.id.toString()),
|
|
background:
|
|
!widget.locked ? dismissBackground() : dismissLockedBackground(),
|
|
secondaryBackground: !widget.locked ? dismissSecondaryBackground() : null,
|
|
confirmDismiss: widget.confirmDismiss,
|
|
child: CheckboxListTile(
|
|
title: TextFormField(
|
|
enabled: !widget.locked,
|
|
decoration: const InputDecoration(border: InputBorder.none),
|
|
initialValue: widget.item.text,
|
|
onChanged: (value) {
|
|
widget.item.text = value;
|
|
DBHelper.dbHelper.updateItem(widget.item);
|
|
},
|
|
),
|
|
controlAffinity: ListTileControlAffinity.leading,
|
|
value: widget.item.value,
|
|
onChanged: !widget.locked
|
|
? ((value) {
|
|
DBHelper.dbHelper.updateItem(widget.item);
|
|
setState(() {
|
|
widget.item.value = value!;
|
|
});
|
|
})
|
|
: null,
|
|
),
|
|
);
|
|
}
|
|
}
|