build static method

Widget build({
  1. required ComponentModel component,
  2. dynamic value,
  3. required OnComponentChanged onChanged,
  4. Map<String, dynamic>? formData,
})

Creates the appropriate widget for a given component.

formData should be the complete form data to support conditional logic evaluation.

Implementation

static Widget build({
  required ComponentModel component,
  dynamic value,
  required OnComponentChanged onChanged,
  Map<String, dynamic>? formData,
}) {
  // Check conditional logic using the new ConditionalEvaluator
  if (formData != null) {
    final conditional = component.raw['conditional'] as Map<String, dynamic>?;
    if (!ConditionalEvaluator.shouldShow(conditional, formData)) {
      return const SizedBox.shrink();
    }
  }

  switch (component.type) {
    // Basic
    case 'textfield':
      return TextFieldComponent(component: component, value: value, onChanged: onChanged);
    case 'textarea':
      return TextAreaComponent(component: component, value: value, onChanged: onChanged);
    case 'number':
      return NumberComponent(component: component, value: value, onChanged: onChanged);
    case 'password':
      return PasswordComponent(component: component, value: value, onChanged: onChanged);
    case 'email':
      return EmailComponent(component: component, value: value, onChanged: onChanged);
    case 'url':
      return UrlComponent(component: component, value: value, onChanged: onChanged);
    case 'phoneNumber':
      return PhoneNumberComponent(component: component, value: value, onChanged: onChanged);
    case 'checkbox':
      return CheckboxComponent(component: component, value: value == true, onChanged: onChanged);
    case 'radio':
      return RadioComponent(component: component, value: value, onChanged: onChanged);
    case 'select':
      return SelectComponent(component: component, value: value, onChanged: onChanged);
    case 'selectboxes':
      return SelectBoxesComponent(component: component, value: value is Map<String, bool> ? value : <String, bool>{}, onChanged: onChanged);
    case 'button':
      return ButtonComponent(component: component, onPressed: () {}, isDisabled: false);

    // Advanced
    case 'date':
    case 'datetime':
      return DateTimeComponent(component: component, value: value, onChanged: onChanged);
    case 'day':
      return DayComponent(component: component, value: value, onChanged: onChanged);
    case 'time':
      return TimeComponent(component: component, value: value, onChanged: onChanged);
    case 'currency':
      return CurrencyComponent(component: component, value: value, onChanged: onChanged);
    case 'address':
      return AddressComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'tags':
      return TagsComponent(component: component, value: value, onChanged: onChanged);
    case 'survey':
      return SurveyComponent(component: component, value: value is Map<String, String> ? value : <String, String>{}, onChanged: onChanged);
    case 'signature':
      return SignatureComponent(component: component, value: value, onChanged: onChanged);

    // Data
    case 'hidden':
      return HiddenComponent(component: component, value: value, onChanged: onChanged);
    case 'container':
      return ContainerComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'datamap':
      return DataMapComponent(component: component, value: value is Map<String, String> ? value : {}, onChanged: onChanged);
    case 'datagrid':
      return DataGridComponent(component: component, value: value is List<Map<String, dynamic>> ? value : [], onChanged: onChanged);
    case 'editgrid':
      return EditGridComponent(component: component, value: value is List<Map<String, dynamic>> ? value : [], onChanged: onChanged);

    // Layout
    case 'panel':
      return PanelComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'columns':
      return ColumnsComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'htmlelement':
      return HtmlElementComponent(component: component);
    case 'content':
      return ContentComponent(component: component);
    case 'alert':
      return AlertComponent(component: component);
    case 'fieldset':
      return FieldSetComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'table':
      return TableComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'tabs':
      return TabsComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'well':
      return WellComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);

    // Premium
    case 'file':
      return FileComponent(component: component, value: value is List<String> ? value : [], onChanged: onChanged);
    case 'nestedform':
      return NestedFormComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'form':
      return FormComponent(component: component, value: value is Map<String, dynamic> ? value : {}, onChanged: onChanged);
    case 'captcha':
      return CaptchaComponent(component: component, value: value, onChanged: onChanged);

    // Custom
    case 'custom':
      return CustomComponent(component: component, value: value, onChanged: onChanged);

    // Fallback
    default:
      return UnknownComponent(component: component);
  }
}