Skip to content

Formula Fields

FormulaField displays computed values based on expressions that reference other form fields. Formula fields are read-only -- their values are derived, not entered by users.

Basic Usage

dart
FormulaField(
  name: 'total_cost',
  title: 'Total Cost',
  formula: 'course_fee * quantity',
  resultType: FormulaResultType.number,
  numberFormat: '#,##0.00',
  prefix: '\$',
  errorPlaceholder: '---',
)

Properties

PropertyTypeDefaultDescription
formulaStringrequiredExpression to evaluate
resultTypeFormulaResultTypenumberExpected result type
dateTimeFormatStringyyyy-MM-ddFormat for date results
numberFormatString#,##0.00Format for number results
prefixString?nullText before the value (e.g., $)
suffixString?nullText after the value (e.g., %)
errorPlaceholderString---Shown when expression fails

Result Types

TypeDescription
FormulaResultType.numberNumeric calculation
FormulaResultType.dateTimeDate/time computation
FormulaResultType.stringString concatenation/manipulation

LMS Examples

Course Cost Calculator

dart
final form = FormBuilder(title: 'Course Pricing')
  .number('base_fee', title: 'Base Fee')
    .required()
  .number('discount_percent', title: 'Discount (%)')
    .range(min: 0, max: 100)
  .number('tax_rate', title: 'Tax Rate (%)')
    .range(min: 0, max: 30)
  .formula('discount_amount',
    title: 'Discount Amount',
    expression: 'base_fee * discount_percent / 100')
  .formula('subtotal',
    title: 'Subtotal',
    expression: 'base_fee - (base_fee * discount_percent / 100)')
  .formula('total',
    title: 'Total (incl. tax)',
    expression: '(base_fee - base_fee * discount_percent / 100) * (1 + tax_rate / 100)')
  .build();

Credit Hours Summary

dart
FormulaField(
  name: 'total_credits',
  title: 'Total Credit Hours',
  formula: 'lecture_hours + lab_hours + tutorial_hours',
  resultType: FormulaResultType.number,
  numberFormat: '#,##0.0',
  suffix: ' hrs',
)

DSL Usage

dart
.formula('computed_field',
  title: 'Computed Value',
  expression: 'field_a + field_b * field_c')

The DSL method creates a FormulaField with default formatting. For custom formatting, use the constructor directly.

Field Derivation (Alternative)

For simpler cases where you want a text or number field to auto-compute but still allow manual editing, use derivedFrom on any field builder:

dart
.text('full_name', title: 'Full Name')
  .derivedFrom(
    {'first_name', 'last_name'},
    transformer: (values) {
      final first = values['first_name'] as String? ?? '';
      final last = values['last_name'] as String? ?? '';
      return '$first $last'.trim();
    },
  )

Key differences from FormulaField:

FeatureFormulaFieldderivedFrom
Read-onlyYesNo (user can override)
ExpressionString formulaDart function
DisplayFormatted labelRegular field input
Auto-stopN/AStops when user edits

Next Steps