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.
-
Make localeSignal() read-only on VaadinSession and UI
Pull requestThe locale signal is now read-only to prevent accidental modifications. Use
setLocale()to change the locale. -
Split computed into separate cached and direct versions
Pull requestSignal.computed()now creates a cached computed signal by default. For non-cached behavior, useSignal.computedDirect().
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 -
Add SignalBinding with rich BindingContext for bind methods
Pull requestProvides more context and control over signal bindings.
-
Allow setProperty if signal write callback is present
Pull requestEnables two-way bindings with custom write logic.
-
Add helpers to get all items from a list signal
Pull requestConvenience methods for working with list signal contents.
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 -
Add bindItems to HasDataProvider components
Pull requestReactive data binding for data provider components.
-
Throw binding exception if setItems is called while an active signal binding
Pull requestPrevents conflicting data sources by throwing an exception.
-
Add setTestId/getTestId convenience methods to Component
Pull requestSimplifies setting and retrieving test identifiers for components.
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.).
Build and Development
-
BuildFrontend incremental build
Pull requestFrontend builds now support incremental compilation for faster development cycles.
-
Retain local signal values during hotswap
Pull requestSignal state is preserved during hot reload, improving development experience.
-
Content-hash cache busting for Stylesheet URLs
Pull requestStylesheet URLs now include content hashes to ensure cache invalidation when files change.
-
Preserve scroll position of all scrollable elements after hot-swap
Pull requestScroll positions are maintained across hot reloads for better developer 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 -
Add local web components plugin to vite.generated.ts
Pull requestBetter support for local web component development.
-
Apply ElementEffect once when created
Pull requestOptimizes effect execution during initialization.
-
Skip ElementEffect callback on reattach when no signals changed
Pull requestImproves performance by avoiding unnecessary effect re-execution.
Component API Improvements
-
Move HasOrderedComponents methods to HasComponents
Pull requestHasOrderedComponentsis now deprecated; useHasComponentsinstead.
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. Multiple test modules have been migrated including flow-data, flow-dnd, flow-lit-template, flow-polymer-template, flow-polymer2lit, flow-build-tools, flow-plugins, and vaadin-dev-server.
Dependency Updates
- ⚠️ Spring Boot updated to 4.0.4, this patch version is important to use because of Jackson compatibility.
- Node.js updated to 24.14.1
- Jackson updated to 3.1.0
- TestBench updated to 10.1.0
- JAXB updated to 4.0.7
- Byte Buddy updated to 1.18.5
- NullAway updated to 0.13.1
- JUnit Jupiter updated to 6.0.3
- Spotless Maven Plugin updated to latest version
- Frontend dependencies updated to latest versions
Thanks For Contributions!
@knoobie @patrick-audit @AB-xdev @OriginalFelix @sgpublic @lycoris106
For more details, see the full comparison on GitHub.
Changes since 25.1.0-beta1