NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1732 most downloaded on pub.dev
Generates and displays generative user interfaces (GenUI) in Flutter using AI.
Last release 9 days ago
29 Sep 2026
Ships on a steady schedule
a new release about every 4 weeks
Nearly every release is documented
notes for 13 of 13 stable releases
Nothing withdrawn
no release was ever pulled
11 months old
13 releases · first in 2025
One column per month.
Image here declares only url , fit and variant , so the description the published basic catalog defines for it ("Accessibility text for the image") is
Image here declares only url, fit and variant, so the description the published basic catalog defines for it ("Accessibility text for the image") is validated, accepted and then dropped. The image ends up with no accessible name, while the same value becomes the img alt in web_core, React and Angular, and accessibilityLabel in Swift.
This adds description to the schema as a string reference and wraps the built image in Semantics(label: ..., image: true). The label goes through BoundString, so it can come from the data model like any other string on this component, and an empty or absent value leaves the widget exactly as it was.
The wrapper sits at the single return point rather than on Image.network / Image.asset, so the two construction paths and the broken_image fallback all get the same name without repeating it three times.
Tests: three new cases in test/image_test.dart, for the label being announced, the label coming from the data model, and nothing being announced when the field is absent. Package suite is green and flutter analyze lib test is clean.
Fixes a2ui-project/a2ui#2740
Image now takes the catalog's description property and announces it. The property is what the basic
catalog defines for accessibility text, and web_core declares it, but genui's schema did not have it, so the text
an agent sent was accepted and dropped. An image has nothing inside it to infer a name from, so the result was an
unnamed node that assistive technology did not even report as an image. The value is a DynamicString, so a path
or a function call resolves like any other property.Updated basicCatalogId to point to the canonical URL: https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json.
basicCatalogId to point to the canonical URL: https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json.catalogIdAliases in Catalog model to support alternate URLs (like the legacy/non-canonical one) for graceful backwards compatibility.SurfaceController so that the protocol processor successfully processes both canonical and secondary aliases transparently.PluralizeFunction to use Intl.pluralLogic instead of Intl.plural to
avoid message extraction errors when arguments are dynamic runtime
expressions.Fixed A2uiTransportAdapter.incomingText trimming every streamed chunk, which made words run together when chunks were concatenated.
Fixed A2uiTransportAdapter.incomingText trimming every streamed chunk, which
made words run together when chunks were concatenated.
Added examples of how to use TextField.
Fixed TextField variants: longText now grows to fit multiple lines,
number now rejects non-numeric input, and the obscured
example now sets variant so that it is actually obscured.
TextField.validationRegexp is now enforced: the value has to match the
pattern in full, an empty field is exempt, and a value that does not match
shows an error and blocks onSubmittedAction. It was previously accepted and
ignored.
Depend on a2ui_core 0.1.0, its first non-pre-release version.
a2ui_core 0.1.0, its first non-pre-release version.BREAKING: Changed SurfaceDefinition.validate to be asynchronous to support resolving $ref schemas via SchemaRegistry.
SurfaceDefinition.validate to be asynchronous to support resolving $ref schemas via SchemaRegistry.package:a2ui_core. See
the migration guide.package:a2ui_core types. The GenUI
message classes (A2uiMessage, CreateSurface, UpdateComponents,
UpdateDataModel, DeleteSurface) are removed; SurfaceController.handleMessage
and Transport.incomingMessages take a2ui_core messages, and
UpdateComponentsMessage carries raw component JSON maps rather than Component
objects. Depend on a2ui_core directly.SurfaceController.store and DataModelStore are removed. Read a
surface's data model via SurfaceController.contextFor(id).dataModel.SurfaceRegistry.updateSurface(...) is removed; drive surfaces
through SurfaceController.handleMessage.PromptBuilder.chat and PromptBuilder.custom from synchronous factory constructors to asynchronous static methods (createChat and createCustom) to support asynchronous asset loading._loadSchemas return type to a named record structure.primitives exports. Only CancellationException, CancellationSignal, JsonMap, basicCatalogId, configureLogging, genUiLogger, and generateId are now exported from package:genui/genui.dart.DataModel writes are stricter; some writes that previously did
nothing now throw, and sparse list writes fill skipped entries with null.createSurface for an already-active surface id is now
an error.SurfaceDefinition and
Component remain genui types._errorToMap in SurfaceController.ArgumentError in Button press handlers.google_generative_ai from the README.md.Feature : Updated example/README.md.
BREAKING: Reorganized library exports (#866).
genui package (#800).FlutterListenable adapter (#860).A2uiMessage.a2uiMessageSchema to A2UI v0.9 specification (#833).Update packages/genui/lib/src/engine/surface_controller.dart
Fix tests
Update packages/genui/lib/src/engine/surface_controller.dart
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
^3.10.0 to leverage modern Dart 3+ syntax and features (#772).DataModel is now an abstract interface class. InMemoryDataModel provides the concrete implementation.DataPath in DataModel.update, subscribe, and getValue operations (#743).DataContext.evaluate renamed to resolve, returning Stream<Object?>.SimpleClientFunction renamed to SynchronousClientFunction and its call method to executeSync.FunctionRegistry. Functions are now registered to the catalog. Renamed registerStandardFunctions to registerBasicFunctions.SurfaceCleanupStrategy from SurfaceController.SurfaceContext and SurfaceDefinition now require a non-nullable catalogId.CoreCatalog to BasicCatalog and relocated catalog widgets.examples app with a gallery of pre-designed surfaces allowing editing/previewing A2UI JSON (#761).A2UiClientCapabilities.fromCatalogs (#773).PromptBuilder and the Conversation facade (#777).CatalogItem constructor (#757).DataModel double-dispose crashing issue (#741).RefCountedValueNotifier and refactored catalog widgets to use lifecycle-safe BoundValue / BoundString widgets.ClientFunction from DataContext and resolved package cycles (#742).Modal component to self-contain showing logic.ToolStartEvent, ToolEndEvent, TokenUsageEvent, and ThinkingEvent from the core genui package.Update changelogs and pubspecs.
Update changelogs and pubspecs. (#699)
ChatMessageWidget to ChatMessageView and InternalMessageWidget to InternalMessageView (#661).catalogId in DebugCatalogView widget (#676).GenUi prefix to remove the prefix or use Surface.
GenUiConversation -> ConversationGenUiController -> SurfaceControllerGenUiSurface -> SurfaceGenUiHost -> SurfaceHostGenUiContext -> SurfaceContextGenUiTransport -> TransportGenUiPromptFragments -> PromptFragmentsGenUiFunctionDeclaration -> ClientFunctionGenUiFallback -> FallbackWidgetconfigureGenUiLogging -> configureLoggingexample directory to improve package:genui pub score.ContentGeneratorError be an Exception (#660).genai_primitives (#675).Fix: Corrected DateTimeInput catalog item JSON key mapping (#622).
DateTimeInput catalog item JSON key mapping (#622).weight property to Component constructor (#603).TextField width to 1 when nested in a Row (#603).BREAKING: Renamed GenUiManager to A2uiMessageProcessor to better reflect its role.
GenUiManager to A2uiMessageProcessor to better reflect its role.A2uiMessageProcessor now accepts an Iterable<Catalog> via catalogs instead of a single catalog.GenUiConfiguration and ActionsConfig.GenUiHost.catalog in favor of GenUiHost.catalogs.FirebaseAiContentGenerator API (added catalog parameter and replaced tools with additionalTools).GenUiManager now supports multiple catalogs by accepting an Iterable<Catalog> in its constructor.A2uiMessageProcessor now supports multiple catalogs by accepting an Iterable<Catalog> in its constructor.catalogId property added to UiDefinition to specify which catalog a UI surface should use.standardCatalogId constant from basic_catalog.dart to primitives/constants.dart for better organization and accessibility.MultipleChoice widget now correctly handles maxAllowedSelections when provided as a double in JSON, preventing type cast errors.Text catalog item now respects the ambient DefaultTextStyle, resolving contrast issues where, for example, text inside a dark purple primary Button would be black instead of white.Deprecated flutter_markdown package was replaced with flutter_markdown_plus.
flutter_markdown package was replaced with flutter_markdown_plus.- Initial published release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →