import 'package:baseproject/core/components/form/form_builder_field.dart'; import 'package:baseproject/core/theme/text_style.dart'; import 'package:flutter/material.dart'; // ignore: must_be_immutable class CustomCheckbox extends FormBuilderField { final String? title; final TextStyle? titleTextStyle; final EdgeInsets? margin; final double scale; final bool isAlone; /// The primary content of the CheckboxListTile. /// /// Typically a [Text] widget. final Widget? titleWidget; /// Additional content displayed below the title. /// /// Typically a [Text] widget. //final Widget? subtitle; /// A widget to display on the opposite side of the tile from the checkbox. /// /// Typically an [Icon] widget. final Widget? secondary; /// The color to use when this checkbox is checked. /// /// Defaults to accent color of the current [Theme]. final Color? activeColor; /// The color to use for the check icon when this checkbox is checked. /// /// Defaults to Color(0xFFFFFFFF). final Color? checkColor; /// Where to place the control relative to its label. final ListTileControlAffinity controlAffinity; /// Defines insets surrounding the tile's contents. /// /// This value will surround the [Checkbox], [titleWidget], [subtitle], and [secondary] /// widgets in [CheckboxListTile]. /// /// When the value is null, the `contentPadding` is `EdgeInsets.symmetric(horizontal: 16.0)`. //final EdgeInsets contentPadding; /// {@macro flutter.widgets.Focus.autofocus} final bool autofocus; /// If true the checkbox's [value] can be true, false, or null. /// /// Checkbox displays a dash when its value is null. /// /// When a tri-state checkbox ([tristate] is true) is tapped, its [onChanged] /// callback will be applied to true if the current value is false, to null if /// value is true, and to false if value is null (i.e. it cycles through false /// => true => null => false when tapped). /// /// If tristate is false (the default), [value] must not be null. final bool tristate; /// Whether to render icons and text in the [activeColor]. /// /// No effort is made to automatically coordinate the [selected] state and the /// [value] state. To have the list tile appear selected when the checkbox is /// checked, pass the same value to both. /// /// Normally, this property is left to its default value, false. //final bool selected; final MainAxisAlignment mainAxisAlignment; final bool isCheckboxOnly; BorderSide? side; /// Creates a single Checkbox field CustomCheckbox({ //From Super Key? key, String name = "Checkbox", FormFieldValidator? validator, bool? initialValue, InputDecoration decoration = const InputDecoration( border: InputBorder.none, focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, errorBorder: InputBorder.none, disabledBorder: InputBorder.none, contentPadding: EdgeInsets.symmetric(horizontal: 0, vertical: 0), isDense: true, ), ValueChanged? onChanged, ValueTransformer? valueTransformer, bool enabled = true, FormFieldSetter? onSaved, AutovalidateMode autovalidateMode = AutovalidateMode.disabled, VoidCallback? onReset, FocusNode? focusNode, this.titleWidget, this.activeColor, this.checkColor, //this.subtitle, this.secondary, this.controlAffinity = ListTileControlAffinity.leading, //this.contentPadding = EdgeInsets.zero, this.autofocus = false, this.tristate = false, // this.selected = false, this.title, this.titleTextStyle, this.margin, this.scale = 1.2, this.isAlone = true, this.side, this.mainAxisAlignment = MainAxisAlignment.start, this.isCheckboxOnly = false, }) : super( key: key, initialValue: initialValue, name: !isAlone ? name : "", validator: validator, valueTransformer: valueTransformer, onChanged: onChanged, autovalidateMode: autovalidateMode, onSaved: onSaved, enabled: enabled, onReset: onReset, decoration: decoration, focusNode: focusNode, builder: (FormFieldState field) { final _BNDCheckBoxState state = field as _BNDCheckBoxState; return !isCheckboxOnly ? (!isAlone ? InputDecorator( decoration: state.decoration(), child: state.buildCheckbox(), ) : Container(child: state.buildCheckbox())) : state.buildCheckboxOnly(); }, ); @override _BNDCheckBoxState createState() => _BNDCheckBoxState(); } class _BNDCheckBoxState extends FormBuilderFieldState { Widget? get titleWidget => widget.titleWidget; String? get title => widget.title; @override void didUpdateWidget(covariant CustomCheckbox oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.initialValue != widget.initialValue) { try { didChange(widget.initialValue, runOnChange: false); } catch (e) {} } } Widget? getTitleWidget() { if (widget.titleWidget != null) { return titleWidget; } else if (title != null && title!.isNotEmpty) { return Text( title!, style: widget.titleTextStyle ?? textStyleBodyDefault, ); } return null; } Widget buildCheckbox() { return Row(mainAxisAlignment: widget.mainAxisAlignment, children: [ buildCheckboxOnly(), Expanded( child: GestureDetector( onTap: () { if (widget.enabled) didChange(!(value ?? false)); }, child: getTitleWidget() ?? const SizedBox()), ), ]); } Widget buildCheckboxOnly() { return Transform.scale( scale: widget.scale, child: Container( width: 23, height: 23, margin: widget.margin ?? const EdgeInsets.only(right: 8), child: Checkbox( value: value, onChanged: widget.enabled ? (bool? val) { //state.requestFocus(); didChange(val); } : null, checkColor: widget.checkColor, activeColor: widget.activeColor, autofocus: widget.autofocus, tristate: widget.tristate, side: widget.side, ), ), ); } } // class BndCheckboxWidget extends StatefulWidget { // final List listData; // const BndCheckboxWidget({Key? key, required this.listData}) : super(key: key); // @override // State createState() => _BndCheckboxWidgetState(); // } // class _BndCheckboxWidgetState extends State { // @override // Widget build(BuildContext context) { // return Column( // mainAxisSize: MainAxisSize.min, // children: [ // for (CheckBoxSelectedModel dataModel in widget.listData) // _CustomCheckBox( // context, // data: dataModel, // onChange: () { // setState(() { // dataModel.isSelected = !dataModel.isSelected; // }); // }, // ) // ], // ); // } // Widget _CustomCheckBox(BuildContext context, // {required CheckBoxSelectedModel data, VoidCallback? onChange}) { // return GestureDetector( // onTap: onChange, // child: Container( // margin: const EdgeInsets.only(bottom: 20), // color: Colors.transparent, // child: Row( // mainAxisSize: MainAxisSize.max, // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Container( // width: 22, // height: 22, // child: Images.svgAssets(data.isSelected // ? Images.icCheckboxSelected // : Images.icCheckbox), // ), // const SizedBox( // width: 12, // ), // Expanded( // child: Text(data.title, // style: textStyleBodyMedium.copyWith( // fontWeight: FontWeight.w400, color: CustomColor.textDark)), // ) // ], // ), // ), // ); // } // }