showUserListsWithBarcodeDialog method Null safety
- dynamic context,
- dynamic product
Shows all user lists with "contains barcode
?" checkboxes.
Implementation
Future<bool> showUserListsWithBarcodeDialog(
final BuildContext context,
final Product product,
) async {
final String barcode = product.barcode!;
final AppLocalizations appLocalizations = AppLocalizations.of(context);
final List<String> all = daoProductList.getUserLists();
final List<String> withBarcode =
daoProductList.getUserLists(withBarcode: barcode);
final Set<String> newWithBarcode = <String>{};
newWithBarcode.addAll(withBarcode);
bool addedLists = false;
final bool? result = await showDialog<bool>(
context: context,
builder: (final BuildContext context) => StatefulBuilder(
builder:
(BuildContext context, void Function(VoidCallback fn) setState) =>
AlertDialog(
title: Text(getProductName(product, appLocalizations)),
content: StatefulBuilder(
builder: (BuildContext context,
void Function(VoidCallback fn) setState) {
final List<Widget> children = <Widget>[];
for (final String name in all) {
children.add(
ListTile(
leading: Icon(
newWithBarcode.contains(name)
? Icons.check_box
: Icons.check_box_outline_blank,
),
title: Text(name),
onTap: () => setState(
() => newWithBarcode.contains(name)
? newWithBarcode.remove(name)
: newWithBarcode.add(name),
),
),
);
}
return ListView(
shrinkWrap: true,
children: children,
);
},
),
actions: <Widget>[
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(appLocalizations.cancel),
),
ElevatedButton(
onPressed: () async {
final ProductList? productList =
await showCreateUserListDialog(context);
if (productList != null) {
all.clear();
all.addAll(daoProductList.getUserLists());
setState(() => addedLists = true);
}
},
child: Text(appLocalizations.user_list_button_new),
),
ElevatedButton(
onPressed: () => Navigator.pop(context, true),
child: Text(appLocalizations.okay),
),
],
),
),
);
if (addedLists == false && result != true) {
return false;
}
final Set<String> possibleChanges = <String>{};
possibleChanges.addAll(withBarcode);
possibleChanges.addAll(newWithBarcode);
for (final String name in possibleChanges) {
if (withBarcode.contains(name) && newWithBarcode.contains(name)) {
continue;
}
if ((!withBarcode.contains(name)) && (!newWithBarcode.contains(name))) {
continue;
}
final ProductList productList = ProductList.user(name);
daoProductList.set(productList, barcode, newWithBarcode.contains(name));
}
return true;
}