formstack 2.5.0
formstack: ^2.5.0 copied to clipboard
A cross-platform ResearchKit and ODK alternative for Flutter. Build dynamic forms and surveys with 35 input types, 35+ validators, repeat groups, offline save, and multi-language.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.5.0 - 2026-04-02 #
Added #
- 2 new example demo screens: "Data Collection (ODK)" and "Multi-Language & Offline" (total: 12 demos)
- Data Collection demo covers: RepeatStep, calculate fields, hidden fields, cascading selects, barcode, audio, geotrace, geoshape
- Multi-Language demo covers: FormStackLocale with EN/ES/FR, DisplayStep with listTile data, runtime language switching
geotraceandgeoshapeadded to README input type tables- Form-level
defaultStyleparameter for applying UIStyle to all steps at once - JSON
themekey at form level for form-wide styling from JSON
Changed #
- Example app now demonstrates all 35 input types and all 9 step types
- README examples table expanded to 12 demo screens
- Architecture file listing updated with all new files
- Input type count corrected to 36 throughout all docs
2.4.0 - 2026-04-02 #
Added #
FormStackTheme- centralized theme system with responsive sizing, dark/light mode colors, and accessibility helpers- Responsive layout: all widgets adapt to mobile (< 600px), tablet (600-1200px), and desktop (> 1200px) screens
- Dark mode support: all colors resolve from
Theme.of(context).colorSchemeinstead of hardcoded values - Semantics wrappers for accessibility on interactive elements
FormStackTheme.responsiveMaxWidth(),responsiveInputWidth(),responsivePadding(),responsiveIconSize(),responsiveButtonHeight()- Theme-aware NPS colors (
npsDetractorColor,npsPassiveColor,npsPromoterColor) - Canvas colors adapt to dark mode (
canvasStrokeColor,canvasBackgroundColor)
Changed #
- Replaced 47 hardcoded color values with theme-aware alternatives across all view files
- Replaced 45+ hardcoded BoxConstraints with responsive sizing
- Error text uses
Theme.of(context).colorScheme.errorinstead ofColors.red - Input backgrounds use
colorScheme.surfaceContainerHighestinstead of hardcoded grey - Borders use
colorScheme.outlineinstead ofColors.grey - Buttons use responsive heights based on screen size
UIStyleexpanded with 7 new properties:inputBackground,inputTextColor,titleColor,subtitleColor,iconColor,cardBackground,fontSize- all settable from JSON- Form-level
defaultStyleparameter applies to all steps without individual styling - JSON
themekey at form level applies default styling to all steps in that form
2.3.0 - 2026-04-02 #
Added #
- 2 new input types:
geotrace(trace path on map),geoshape(draw polygon on map) - Offline save & resume via
FormPersistenceinterface (enablePersistence,saveDraft,resumeDraft,deleteDraft,listDrafts) InMemoryFormPersistencebuilt-in implementation for testingFormDraftserializable model for draft stateExternalDataProviderinterface for loading options from CSV/API/databaseStaticDataProviderbuilt-in implementation withfromCsvfactoryQuestionStep.optionsProviderandoptionsSourceIdfor external data-backed choices- All new types supported in JSON parser
2.2.0 - 2026-04-02 #
Added #
- 4 new input types:
hidden(data-only, no UI),calculate(auto-computed from other results),barcode(QR/barcode scanner),audio(recording with timer) RepeatStep- dynamic repeating sections where users add/remove entries (modeled after ODKrepeat)- Cascading selects via
QuestionStep.choiceFiltercallback - filter options based on other step results (Country -> State -> City) FormStackLocaleclass for multi-language support with runtime language switching,t()andtf()translation methods, and JSON loadingQuestionStep.calculateCallbackfor auto-computing values from collected resultsQuestionStep.calculateExpressionfor declarative calculate formulas- Step view widget caching to preserve state during navigation
- All new types fully supported in JSON schema parser
Fixed #
2.1.1 - 2026-04-02 #
Fixed #
- Step view widget caching to prevent state loss during navigation (TextEditingController text, slider values, selected choices now preserved when navigating back)
- Controller and FocusNode memory leaks caused by widget recreation on every step change
- Cache cleared on form reset via
clearResult()for clean restarts - Step timestamps (
startTime,endTime) reset properly on form clear
2.1.0 - 2026-04-02 #
Added #
booleaninput type - Yes/No toggle buttonsimageChoiceinput type - select from a grid of images with labelsReviewStep- displays all collected answers for review before submissionConsentStepwithConsentSectionmodel and 8 predefined section types (overview, dataGathering, privacy, dataUse, timeCommitment, studyTasks, withdrawing, custom)- Built-in progress bar UI with step counter ("Step 3 of 10") and percentage
- Result timestamps (
startTime,endTime) recorded per step for analytics - Static image support via
titleIconImagePath(asset or network URL) - Video URL support in
InstructionStepviavideoUrl dateRangevalidator withminDate/maxDateboundsResultFormatpublic constructor for custom validator subclassingBaseStepViewandFormStepViewexported for custom input widget creationStepResultandTaskResultclasses for structured result hierarchy (modeled after ResearchKit's ORKTaskResult)- Step lifecycle callbacks:
onStepWillPresent,onStepDidComplete - API methods:
getStep(),getStepResult(),getTaskResult(),exportAsJson() - ResearchKit migration guide in README with side-by-side Swift/Dart examples
- New exports:
ReviewStep,ConsentStep,ConsentSection,ConsentSectionType,BaseStepView,FormStepView,StepResult,TaskResult
2.0.0 - 2026-04-02 #
Added #
- 8 new input types:
slider,rating,nps,consent,signature,ranking,phone,currency - 12 new validators:
min,max,range,minLength,maxLength,pattern,minSelections,maxSelections,fileSize,iban,consent,compose FormStepproperties:helperText,defaultValue,semanticLabelQuestionStepproperties:minValue,maxValue,stepValue,minSelections,maxSelections,consentText,currencySymbol,phoneCountryCode,ratingCount- New exports:
RelevantCondition,ExpressionRelevant,DynamicConditionalRelevant,NestedStep,DisplayStep,UIStyle - Full JSON schema support for all new input types and properties
- Comprehensive example app with 10 demo screens
- Dartdoc comments on all public API classes and members
Changed #
- Renamed
formKitFormtoformStackFormacross codebase - Renamed
TextFeildWidgetViewtoTextFieldWidgetView - Renamed
inputBoder()toinputBorder()across all input fields - Renamed
intputtoinputin expression evaluators - Renamed
htm_field.darttohtml_input_field.dart - Renamed
mapview_field.darttomap_input_field.dart - Replaced
GlobalKeyanti-pattern withValueNotifierinBaseStepViewandCompletionStepView - Updated
index.htmlto modernFlutterLoader.loadinitialization - Updated README with complete documentation, screenshots, and JSON schema reference
Fixed #
- Memory leak: OTP field controllers recreated on every build
- Memory leak: verification code list growing indefinitely on rebuilds
- Memory leak:
addPostFrameCallbackfiring on every rebuild in text, nested, and completion views - Performance: image memory bloat from full-resolution decoding (added
cacheWidth/cacheHeight) - Performance: dynamic key-value controller text resetting on every build
- Fixed typos in class names (
_TextesultType,_MultipleChoiceesultType) - Fixed
nextFormSatcktypo informstack_form.dart - Cleaned up dead commented-out code in
htm_field.dartandweb_view.dart - Removed unnecessary imports across all internal files
- Added
cacheExtentto allListViewwidgets for smoother scrolling
Updated #
google_maps_flutter: ^2.14.0 -> ^2.17.0google_maps_flutter_web: ^0.5.14+3 -> ^0.6.2dio: ^5.9.0 -> ^5.9.2uuid: ^4.5.2 -> ^4.5.3file_picker: ^10.3.7 -> ^10.3.10webview_flutter: ^4.13.0 -> ^4.13.1google_maps: ^8.1.1 -> ^8.2.0flutter_lints: ^2.0.0 -> ^6.0.0 (example)
1.1.1 - 2024-11-15 #
Fixed #
- Memory leak in Google Places autocomplete stream subscription
- Component disposal in nested step views
- Undefined
mountedproperty in completion step view - Auto-trigger callback firing multiple times
Changed #
- Added cache size limit (50 items) to prevent unbounded memory growth
- Optimized image memory usage by clearing file results after encoding
- Optimized controller recreation to only occur when form step result changes
- Reduced unnecessary setState calls in base step view
- Added proper GoogleMapController disposal
- Added lazy loading for background animations
Updated #
webview_flutter: ^4.9.0 -> ^4.13.0dio: ^5.8.0+1 -> ^5.9.0uuid: ^4.5.1 -> ^4.5.2lottie: ^3.3.1 -> ^3.3.2file_picker: ^8.3.7 -> ^10.3.7google_maps_flutter_web: ^0.5.12+2 -> ^0.5.14+3google_maps_flutter: ^2.12.3 -> ^2.14.0http: ^1.4.0 -> ^1.6.0
0.7.4 - 2023-10-15 #
Added #
- Dropdown button with component styles (minimal and basic)
- Dynamic key-value widget
