showOptionBottomSheet method

void showOptionBottomSheet({
  1. required BuildContext context,
  2. required List<Map<String, String>>? options,
  3. required dynamic onTap({
    1. required String key,
    2. required String value,
    }),
  4. required String heading,
  5. String? value,
  6. ValueChanged<String>? onSearchChanged,
})

Implementation

void showOptionBottomSheet({
  required BuildContext context,
  required List<Map<String, String>>? options,
  required Function({required String key, required String value}) onTap,
  required String heading,
  String? value,
  ValueChanged<String>? onSearchChanged,
}) async {
  debugPrint("Options : $options");
  showModalBottomSheet<String>(
    context: context,
    isScrollControlled: true,
    builder: (_) => Padding(
      padding: EdgeInsets.only(
        bottom: MediaQuery.of(context).viewInsets.bottom,
      ),
      child: Padding(
        padding: const EdgeInsets.symmetric(vertical: 14.0),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Padding(
              padding: const EdgeInsets.only(left: 16.0, right: 8.0),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Text(heading, style: Styles.tsBlack3BSemiBold16()),
                  IconButton(
                    onPressed: () => context.pop(),
                    icon:
                        Icon(Icons.clear, size: 30, color: AppColors.greyB5),
                  ),
                ],
              ),
            ),
            if (onSearchChanged != null)
              Padding(
                padding: const EdgeInsets.symmetric(
                  horizontal: 16.0,
                  vertical: 8.0,
                ),
                child: TextField(
                  onChanged: onSearchChanged,
                  decoration: InputDecoration(
                    hintText: Strings.search,
                    prefixIcon: const Icon(Icons.search, color: Colors.grey),
                    contentPadding: const EdgeInsets.symmetric(
                      horizontal: 16,
                      vertical: 12,
                    ),
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(30),
                      borderSide: BorderSide(color: AppColors.greyB5),
                    ),
                    enabledBorder: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(30),
                      borderSide: BorderSide(color: AppColors.greyB5),
                    ),
                  ),
                ),
              ),
            10.h,
            ListView(
              shrinkWrap: true,
              children: options?.map((option) {
                    return Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 10.0),
                      child: ListTile(
                        dense: true,
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(8),
                        ),
                        tileColor: value == option["value"]
                            ? AppColors.primaryColor().withOpacity(0.2)
                            : null,
                        title: Text(option["key"] ?? ""),
                        onTap: () => onTap(
                          key: option["key"] ?? "",
                          value: option["value"] ?? "",
                        ),
                      ),
                    );
                  }).toList() ??
                  [],
            ),
          ],
        ),
      ),
    ),
  );
}