Vaadin Flow 25.1 introduces production-ready reactive UI state management aka Signals API, along with the free browser-less testing framework (aka old commercial UI unit testing) and various other enhancements and bug-fixes.
Breaking Changes
Signal API Changes
-
Enforce signal reads in computed signals and effects
Commit · Pull requestSignals now enforce reactive context requirements when reading values in computed signals and effects.
-
Standardize signal callback interfaces
Commit · Pull request -
Move component-bound effect to Signal public API
Commit · Pull request -
Remove WritableSignal interface and simplify signal API
Commit · Pull requestSimplified the signal API by removing the WritableSignal interface and consolidating functionality.
-
Rename Signal value()/value(T) to get()/set(T)
Commit · Pull requestRenamed signal methods for clarity and consistency with Java conventions.
-
Restructure signals package for clarity between shared and local signals
Commit · Pull request -
Merge signals module into flow-server
Commit · Pull requestThe separate signals module has been merged into flow-server for better integration.
-
Rename Binder.Binding.value() to valueSignal() and return signal
Commit · Pull requestReworks Binding.value() to return a ValueSignal instead of the raw value.
-
Rename getValidationStatus() to validationStatusSignal()
Commit · Pull requestRenames the Binder method to better reflect that it returns a Signal.
Component and API Changes
-
Make wrapperElement field private
Commit · Pull requestThe wrapperElement field is now private and moved to UIInternals.
-
Prevent lumo utility classes from being imported automatically
Commit · Pull request · Issue -
Set proper value of isFromClient when using Focusable focus() and blur()
Commit · Pull requestThe isFromClient flag now properly reflects the origin of focus/blur events.
-
BeforeEvent target as extends Component
Commit · Pull request
Browser Compatibility
-
Update old browser check to verify compatibility with Vaadin 25+
Commit · Pull request · IssueUpdated browser compatibility check to ensure Popover API availability, required for Vaadin 25 web components.
New Features
Signal-Based Reactive Programming
-
Use type-parameter-level nullability for Signal APIs
Commit · Pull request -
Add custom equality checker support to ValueSignal
Commit · Pull request -
Throw IllegalStateException when Signal.get() is called outside a reactive context
Commit · Pull request -
Make shared signals use asynchronous signal trees
Commit · Pull request -
Detect accidental sharing of ValueSignal with background threads
Commit · Pull request -
Detect accidental sharing of local signals between sessions
Commit · Pull request -
Automatic repeatable reads for shared signals while session is locked
Commit · Pull request -
Make shared signals Serializable
Commit · Pull request -
Add local ListSignal for per-entry reactive lists
Commit · Pull request -
Add two-way computed signals via WritableSignal.map
Commit · Pull request -
Remove FLOW_FULLSTACK_SIGNALS feature flag and enable signals by default
Commit · Pull request -
Prevent serialization of shared signals
Commit · Pull request -
Add equality checker to ListSignal
Commit · Pull request -
Add moveTo method to ListSignal
Commit · Pull request
Component Signal Bindings
-
Add signal bind methods for NativeDetails, HtmlObject, and HasStyle
Commit · Pull request -
Add bindRequiredIndicatorVisible to HasValue / HasValueAndElement
Commit · Pull request -
Add windowSizeSignal() to Page for reactive window size tracking
Commit · Pull request -
Add localeSignal() to UI and VaadinSession
Commit -
Add signal binding constructors and methods for HTML components
Commit · Pull request -
Add bindChildren method to HasComponents mix-in
Commit · Pull request -
Add Anchor signal-based constructors
Commit · Pull request -
Add FieldSet::bindLegendText
Commit · Pull request -
Add Html(signal) and bindHtmlContent(signal)
Commit · Pull request -
Add bindWidth(Signal) and bindHeight(Signal)
Commit · Pull request -
Add bindReadOnly(Signal)
Commit · Pull request -
Add HasValidation::bindErrorMessage and bindInvalid
Commit · Pull request -
Add HasPlaceholder::bindPlaceholder(Signal)
Commit · Pull request -
Add HasHelper::bindHelperText
Commit · Pull request -
Add HasTheme::bindThemeName(String, Signal)
Commit · Pull request -
Add signal constructor to HTML components
Commit · Pull request · Issue -
Add HasValue::bindValue(WritableSignal)
Commit · Pull request · Issue -
Add HasText::bindText
Commit · Pull request · Issue -
Add Component::bindVisible
Commit · Pull request · Issue -
Add HasEnabled::bindEnabled
Commit · Pull request · Issue -
Add HasDataView::bindItems for reactive list binding
Commit · Pull request
Data Binding and Validation
-
Enhance Binder with cross-field validation
Commit · Pull request -
Make bindProperty support write callbacks
Commit · Pull request -
Make two-way signal bindings explicit with a write callback parameter
Commit · Pull request -
Add callback helper methods for bindValue
Commit · Pull request
Data Components
-
Add protected API to regenerate data in viewport
Commit · Pull requestAdded protected
refreshViewportmethod to DataCommunicator and HierarchicalDataCommunicator. -
Implement getItems(offset, limit) in DataView
Commit · Pull request · IssueAdded efficient query-based item retrieval with offset/limit support.
-
Add Element.flashClass() for CSS animation-based visual feedback
Commit · Pull requestAdd a flashClass(String) method to Element that temporarily applies a CSS class to trigger an animation, then auto-removes it when the animation ends.
Browserless Testing
- Add browserless mode flag to suppress dev server warnings in browerless tests
Commit · Pull request
File Uploads
- Add upload rejection API with optional messages
Commit · Pull request
Spring Integration
-
Improve SpringInstantiator
Commit · Pull request · IssueBetter handling of multiple beans using Spring's resolution logic (Primary, Fallback, etc.).
Development Experience
-
Add git pre-commit hook for automatic code formatting
Commit · Pull request -
Disable client statistics
Commit · Pull request -
Delegate no-routes handling to Copilot
Commit · Pull request -
Auto-load Aura theme CSS when no AppShellConfigurator exists
Commit · Pull request
Other Features
-
Add allowInert attribute to @DomEvent annotation
Commit · Pull request -
Add customizable sync error messages for session desync scenarios
Commit · Pull request -
Move to com.interaso.webpush
Commit · Pull request
Testing Improvements
This release includes extensive migration to JUnit 5 (Jupiter) across the codebase, improving test maintainability and leveraging modern testing features.
Dependency Updates
- Spring Boot updated to 4.0.3
- TestBench updated to 10.1
- Node.js updated to 24.13.1
- Jackson BOM updated to 3.0.4
- Byte Buddy updated to 1.18.5
- NullAway updated to 0.13.1
- JUnit Jupiter updated to 6.0.3
- Various other dependency updates for security and stability
For more details, see the full comparison on GitHub.
Changes since 25.1.0-alpha14