showUserListsWithBarcodeDialog method Null safety

Future<bool> showUserListsWithBarcodeDialog(
  1. dynamic context,
  2. 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;
}