User Interface low complexity mobile
1
Dependencies
1
Dependents
0
Entities
0
Integrations

Description

Wizard step 4 providing a free-text notes field that is fully optional and clearly labelled as such. Supports both keyboard input and OS-level speech-to-text dictation to satisfy HLF and Blindeforbundet accessibility requirements, while not blocking users who skip it.

Feature: Quick Activity Registration

notes-step

Summaries

The Optional Notes Input Step expands the programme's reach to users with motor or visual impairments by supporting OS-level speech-to-text dictation, directly addressing requirements from HLF and Blindeforbundet partner organisations. Making the field genuinely optional — with clear labelling and an explicit skip path — removes a common barrier to form completion that would otherwise suppress activity logging rates. By accommodating diverse input methods and not penalising brevity, this step signals an inclusive product philosophy that strengthens partnerships with disability organisations and improves overall data capture volume without mandating additional user effort.

This is a low-complexity step with a single cubit dependency, but it carries a disproportionate accessibility testing obligation. QA must verify speech-to-text activation via the system keyboard dictation button on both iOS and Android, screen-reader traversal of the optional label and skip affordance, and correct Cubit emission on both blur and explicit continue. Coordinate with accessibility stakeholders (HLF, Blindeforbundet representatives if available) for acceptance sign-off. The skip path must be tested end-to-end to confirm no null-safety regressions in downstream steps.

Delivery risk is low technically but moderate from an acceptance-testing perspective if accessibility audit cycles are constrained.

Implemented as a Flutter widget wrapping a multi-line TextField with maxLines set to null for auto-expansion and a focusTextField() method exposing a FocusNode for programmatic focus. The build() constructor accepts an optional existingNote String to pre-populate the field during edit flows. onNoteChanged(String) emits on every text change to keep the Cubit in sync; onSkipped() emits a null or empty-string event allowing the cubit to treat both equivalently. Speech-to-text is provided by the OS keyboard's built-in dictation key — no third-party plugin is required, but the TextField must not suppress the system keyboard toolbar.

InputDecoration should include a clearly worded optional hint. Ensure the continue button remains enabled when the field is empty to satisfy the skip requirement.

Responsibilities

  • Render an optional multi-line text field with placeholder copy
  • Allow the user to advance without entering any text
  • Expose OS speech-to-text via the system keyboard dictation button
  • Emit note content to Cubit on field blur or explicit continue

Interfaces

build(String? existingNote)
onNoteChanged(String note)
onSkipped()
focusTextField()

Relationships

Dependencies (1)

Components this component depends on

Dependents (1)

Components that depend on this component