CkSelectableButton constructor

CkSelectableButton({
  1. required List<String> titles,
  2. Key? key,
  3. double width = 100,
  4. String? initialValue,
  5. bool useWrap = false,
  6. ValueChanged<String>? onSelected,
  7. FormFieldSetter<String>? onSaved,
  8. FormFieldValidator<String>? validator,
  9. AutovalidateMode autovalidateMode = AutovalidateMode.disabled,
})

Implementation

CkSelectableButton({
  required List<String> titles,
  super.key,
  double width = 100,
  String? initialValue,
  bool useWrap = false,
  ValueChanged<String>? onSelected,
  super.onSaved,
  super.validator,
  AutovalidateMode super.autovalidateMode = AutovalidateMode.disabled,
}) : assert(titles.isNotEmpty, 'Titles list must not be empty'),
     super(
       initialValue: initialValue ?? titles.first,
       builder: (FormFieldState<String> field) {
         final state = field as _SelectableButtonsState;

         final onPrimary = Theme.of(state.context).colorScheme.onPrimary;
         final primary = Theme.of(state.context).colorScheme.primary;

         final buttons = titles.map((title) {
           final isSelected = title == field.value;

           return Padding(
             padding: const EdgeInsets.symmetric(horizontal: 4.0),
             child: SizedBox(
               width: width,
               child: ElevatedButton(
                 clipBehavior: Clip.antiAliasWithSaveLayer,
                 style: ElevatedButton.styleFrom(
                   side: BorderSide(color: primary),
                   foregroundColor: isSelected ? onPrimary : primary,
                   backgroundColor: isSelected ? primary : onPrimary,
                   textStyle: Theme.of(state.context).textTheme.labelLarge,
                 ),
                 onPressed: () {
                   field.didChange(title);
                   onSelected?.call(title);
                 },
                 child: Text(title, textAlign: TextAlign.center),
               ),
             ),
           );
         }).toList();

         return Column(
           crossAxisAlignment: CrossAxisAlignment.start,
           children: [
             useWrap
                 ? Wrap(spacing: 8, runSpacing: 8, children: buttons)
                 : SingleChildScrollView(
                     scrollDirection: Axis.horizontal,
                     child: Row(children: buttons),
                   ),
             if (field.hasError)
               Padding(
                 padding: const EdgeInsets.only(top: 8.0, left: 8.0),
                 child: Text(
                   field.errorText ?? '',
                   style: TextStyle(color: Theme.of(state.context).colorScheme.error),
                 ),
               ),
           ],
         );
       },
     );