vyuh_extension_content
Register content and configuration types through ContentExtensionDescriptor and ContentExtensionBuilder. DefaultContentPlugin deserializes registered types, selects layouts, applies modifiers, and builds routes. Actions execute configurations; conditions produce string values for case matching.
How the pieces fit together
Choose a declaration
Action · ActionConfiguration · Condition · ConditionConfiguration · ContentBuilder · ContentDescriptor · ContentDescriptorFactory · ContentExtensionBuilder · ContentExtensionDescriptor · DIExtension · DefaultContentPlugin · DocumentBuilder · DocumentFutureBuilder · DocumentStreamBuilder · PreviewContext · RouteBuilder · RouteBuilderProxy · RouteContentWithRefresh · ScopedDIWidget · ServiceExtensions · UnknownActionConfiguration · UnknownConditionConfiguration · UnknownContentDetector · UnknownContentIndicator · UnknownContentModifierConfiguration · UnknownLayoutConfiguration · createUnknownPlaceholder · initializeUnknownPlaceholderFactory
Action
A composable action that can be executed in response to user interaction.
final class ActionDirectly declared public members:
final String? title;Optional title for the action.
final List<ActionConfiguration>? configurations;List of configurations to execute when the action is triggered.
static List<ActionConfiguration>? configurationList(dynamic json);Converts a JSON array to a list of ActionConfiguration instances.
FutureOr<void> execute(BuildContext context, {Map<String, dynamic>? arguments});Executes all configurations in sequence.
Action({this.title, this.configurations});Creates a new action with optional title and configurations.
factory Action.fromJson(Map<String, dynamic> json);Creates an action from a JSON object.
bool get isEmpty;Returns true if this action has no configurations.
bool get isNotEmpty;Returns true if this action has at least one configuration.
ActionConfiguration
Base class for all action configurations.
abstract class ActionConfiguration implements SchemaItemDirectly declared public members:
final String schemaType;The schema type of this configuration.
final String? title;Optional title for this configuration.
final bool? isAwaited;Whether to await this configuration's execution.
ActionConfiguration({required this.schemaType, this.title, this.isAwaited});Creates a new action configuration.
FutureOr<void> execute(BuildContext context, {Map<String, dynamic>? arguments});Executes this configuration.
Condition
A conditional expression that can be evaluated at runtime.
final class ConditionDirectly declared public members:
final ConditionConfiguration? configuration;The configuration that defines the condition's logic.
Condition({this.configuration});Creates a new condition with the given configuration.
Future<String?> execute(BuildContext context);Evaluates the condition in the current context.
factory Condition.fromJson(Map<String, dynamic> json);Creates a condition from a JSON object.
ConditionConfiguration
Base class for all condition configurations.
abstract class ConditionConfiguration implements SchemaItemDirectly declared public members:
final String schemaType;The schema type of this configuration.
final String? title;Optional title for this configuration.
ConditionConfiguration({required this.schemaType, this.title});Creates a new condition configuration.
Future<String?> execute(BuildContext context);Evaluates this condition configuration.
ContentBuilder
A builder for configuring and managing content types and their layouts.
class ContentBuilder<T extends ContentItem>Directly declared public members:
final TypeDescriptor<T> content;The type descriptor for the content type T.
LayoutConfiguration<T> get defaultLayout;TypeDescriptor<LayoutConfiguration<T>> get defaultLayoutDescriptor;List<TypeDescriptor<LayoutConfiguration>> get layouts;String? get sourceFeature;void setSourceFeature(String? featureName);Updates the source feature for this builder and its layouts.
ContentBuilder({required this.content, required this._defaultLayout, required this._defaultLayoutDescriptor});Creates a new content builder.
void init(List<ContentDescriptor> descriptors);Initializes this content builder with the given descriptors.
void addDescriptors(List<ContentDescriptor> descriptors);Additively registers new descriptors into this builder.
void registerDescriptors<U>(Iterable<TypeDescriptor<U>> descriptors, {bool checkUnique = false});Registers a list of type descriptors with the content system.
Widget build(BuildContext context, T content);Builds a widget for the given content item.
void setDefaultLayout(LayoutConfiguration<T> layout, {required FromJsonConverter<LayoutConfiguration<T>> fromJson, String? sourceFeatureName});Sets the default layout for this content builder.
ContentDescriptor
Public declaration in this package.
abstract class ContentDescriptorDirectly declared public members:
final String title;final String schemaType;final List<TypeDescriptor<LayoutConfiguration>>? layouts;String? get sourceFeature;The feature that this content descriptor was registered by.
ContentDescriptor({required this.schemaType, required this.title, required this.layouts});static ContentDescriptorFactory createDefault({required String schemaType, required String title});A simplified approach to creating a ContentDescriptor that follows the standard conventions. This eliminates the need to create a new <Item>ContentDescriptor.
void setSourceFeature(String? featureName);ContentDescriptorFactory
Public declaration in this package.
typedef ContentDescriptorFactory<T extends ContentItem> = ContentDescriptor Function(ContentExtensionBuilder
Public declaration in this package.
final class ContentExtensionBuilder extends ExtensionBuilderDirectly declared public members:
ContentExtensionBuilder();Map<Type, Map<String, TypeDescriptor>> typeRegistry();ContentBuilder<ContentItem>? contentBuilder(String schemaType);List<ContentBuilder> contentBuilders();Future<void> onInit(List<ExtensionDescriptor> extensions);Future<void> onDispose();T? fromJson<T>(String typeName, Map<String, dynamic> json);void register<T>(TypeDescriptor<T> descriptor);bool isRegistered<T>(String schemaType);void registerBuilder(ContentBuilder builder, {List<ContentDescriptor>? descriptors = const []});Register a ContentBuilder directly This allows other plugins to register content builders programmatically
void registerLazy(ExtensionDescriptor descriptor);Register extensions from a lazily-loaded feature incrementally.
ContentExtensionDescriptor
Public declaration in this package.
final class ContentExtensionDescriptor extends ExtensionDescriptorDirectly declared public members:
final List<ContentDescriptor>? contents;final List<TypeDescriptor<ContentModifierConfiguration>>? contentModifiers;final List<ContentBuilder>? contentBuilders;final List<TypeDescriptor<ActionConfiguration>>? actions;final List<TypeDescriptor<ConditionConfiguration>>? conditions;final List<TypeDescriptor<RouteTypeConfiguration>>? routeTypes;ContentExtensionDescriptor({this.contents, this.contentModifiers, this.contentBuilders, this.actions, this.conditions, this.routeTypes});dynamic onSourceFeatureUpdated();DIExtension
Public declaration in this package.
extension DIExtension on BuildContextDirectly declared public members:
DIPlugin get di;DefaultContentPlugin
The default ContentPlugin implementation for the Vyuh framework. This plugin is responsible for fetching content from a CMS and rendering content items. It uses a ContentExtensionBuilder to keep track of the various ContentItem types.
final class DefaultContentPlugin extends ContentPluginDirectly declared public members:
final bool useLiveRoute;Whether to use live route updates via streams. When true, uses RouteStreamBuilder for real-time updates. When false, uses RouteFutureBuilder for one-time loading.
final bool allowRouteRefresh;Whether to allow manual refreshing of the route.
DefaultContentPlugin({required super.provider, this.useLiveRoute = false, this.allowRouteRefresh = true});Map<Type, Map<String, TypeDescriptor>> get typeRegistry;Widget buildContent<T extends ContentItem>(BuildContext context, T content, {LayoutConfiguration<T>? layout});Widget buildRoute(BuildContext context, {Uri? url, String? routeId});T? fromJson<T>(Map<String, dynamic> json);dynamic register<T>(TypeDescriptor<T> descriptor);bool isRegistered<T>(String schemaType);Future<void> dispose();Future<void> init();void attach(ExtensionBuilder extBuilder);DocumentBuilder
A widget that builds UI based on document data fetched from a content provider.
final class DocumentBuilder<T> extends StatelessWidgetDirectly declared public members:
final Future<T?> Function() fetchDocument;A function that returns a future of the document.
final Stream<T?>? liveDocument;A stream of document data for live updates.
final bool allowRefresh;Whether to allow refreshing the document.
final bool isLive;Whether to use live document updates.
final Widget Function(BuildContext context, T document) buildContent;A function that builds the UI for the document.
final Future<T?> Function(BuildContext context, T document)? initDocument;Optional custom initialization function for the document. This allows for document-specific initialization logic.
const DocumentBuilder({super.key, required this.fetchDocument, this.liveDocument, required this.buildContent, this.allowRefresh = true, this.isLive = false, this.initDocument});Creates a DocumentBuilder with a custom document fetching function.
static DocumentBuilder<T> fromQuery<T>({Key? key, required String query, Map<String, String>? queryParams, required FromJsonConverter<T> fromJson, required Widget Function(BuildContext, T) buildContent, bool includeDrafts = false, bool allowRefresh = true, bool isLive = false, Future<T?> Function(BuildContext, T?)? initDocument});Creates a DocumentBuilder that fetches a document by query.
static DocumentBuilder<T> fromId<T>({Key? key, required String id, required FromJsonConverter<T> fromJson, required Widget Function(BuildContext, T) buildContent, bool includeDrafts = false, bool allowRefresh = true, bool isLive = false, Future<T?> Function(BuildContext, T?)? initDocument});Creates a DocumentBuilder that fetches a document by ID.
static DocumentBuilder<RouteBase> fromRoute({Key? key, Uri? url, String? routeId, required Widget Function(BuildContext, RouteBase) buildContent, bool includeDrafts = false, bool allowRefresh = true, bool isLive = false});Creates a DocumentBuilder that fetches a route by path or ID.
Widget build(BuildContext context);DocumentFutureBuilder
A widget that builds UI based on a future of document data.
class DocumentFutureBuilder<T> extends StatefulWidgetDirectly declared public members:
final Future<T?> Function() future;The future that resolves with the document data.
final Widget Function(BuildContext context, T document) buildContent;A function that builds the UI for the content.
final bool allowRefresh;Whether to allow refreshing the document, with the overlay Refresh button.
const DocumentFutureBuilder({super.key, required this.future, required this.buildContent, this.allowRefresh = true});Creates a DocumentFutureBuilder.
State<DocumentFutureBuilder<T>> createState();DocumentStreamBuilder
A widget that builds UI based on a stream of document data.
class DocumentStreamBuilder<T> extends StatefulWidgetDirectly declared public members:
final Stream<T?> stream;The stream of document data.
final Widget Function(BuildContext context, T document) buildContent;A function that builds the UI for the content.
final bool allowRefresh;Whether to allow refreshing the document, with the overlay Refresh button.
const DocumentStreamBuilder({super.key, required this.stream, required this.buildContent, this.allowRefresh = true});Creates a DocumentStreamBuilder.
State<DocumentStreamBuilder<T>> createState();PreviewContext
Public declaration in this package.
final class PreviewContext extends InheritedWidgetDirectly declared public members:
final ContentItem content;final LayoutConfiguration<ContentItem> layout;const PreviewContext({super.key, required this.content, required this.layout, required super.child});static PreviewContext? of(BuildContext context);bool updateShouldNotify(PreviewContext oldWidget);RouteBuilder
Public declaration in this package.
final class RouteBuilder extends StatelessWidgetDirectly declared public members:
final Uri? url;final String? routeId;final bool includeDrafts;final bool allowRefresh;final bool isLive;const RouteBuilder({super.key, this.url, this.routeId, this.includeDrafts = false, this.allowRefresh = true, this.isLive = false});Widget build(BuildContext context);RouteBuilderProxy
Public declaration in this package.
class RouteBuilderProxy extends InheritedWidgetDirectly declared public members:
const RouteBuilderProxy({super.key, required super.child, required this._onRefresh});Future<void> refresh();bool updateShouldNotify(covariant RouteBuilderProxy oldWidget);static RouteBuilderProxy? of(BuildContext context);RouteContentWithRefresh
Works in conjunction with the RouteBuilderProxy to trigger refresh on a Route
final class RouteContentWithRefresh extends StatelessWidgetDirectly declared public members:
final Widget child;const RouteContentWithRefresh({super.key, required this.child});Widget build(BuildContext context);ScopedDIWidget
A widget that wraps its child with a scoped instance of DIPlugin.
final class ScopedDIWidget extends StatefulWidgetDirectly declared public members:
const ScopedDIWidget({super.key, required this.child, required this.debugLabel});final Widget child;final String debugLabel;The debug label for the DIPlugin. It is useful to identify the scope.
static DIPlugin of(BuildContext context);Get the DIPlugin from the nearest DI scope. If no scope is found, it will fallback to the platform DIPlugin.
State<ScopedDIWidget> createState();ServiceExtensions
Public declaration in this package.
extension ServiceExtensions on ContentPluginDirectly declared public members:
bool setDefaultLayout({required String schemaType, required LayoutConfiguration layout, required FromJsonConverter<LayoutConfiguration> fromJson});Sets the default layout for the schemaType of the ContentItem. Returns true if the layout was set, false otherwise.
ContentBuilder? contentBuilder(String schemaType);Returns the ContentBuilder for the schemaType of the ContentItem. Returns null if it does not exist.
List<ContentBuilder<ContentItem>>? contentBuilders();Returns a map of all content builders, where the key is the schemaType and the value is the ContentBuilder.
UnknownActionConfiguration
Unknown placeholder types for handling missing type registrations gracefully. These placeholders allow the system to continue working while providing proper error feedback through the unknown content builder system. Unknown action configuration placeholder.
final class UnknownActionConfiguration extends ActionConfigurationDirectly declared public members:
static const dynamic schemaName;final String missingSchemaType;final Map<String, dynamic> jsonPayload;UnknownActionConfiguration({required this.missingSchemaType, required this.jsonPayload});Future<void> execute(BuildContext context, {Map<String, dynamic>? arguments});UnknownConditionConfiguration
Unknown condition configuration placeholder.
final class UnknownConditionConfiguration extends ConditionConfigurationDirectly declared public members:
static const dynamic schemaName;final String missingSchemaType;final Map<String, dynamic> jsonPayload;UnknownConditionConfiguration({required this.missingSchemaType, required this.jsonPayload});Future<String?> execute(BuildContext context);UnknownContentDetector
Utility functions for detecting unknown placeholders in content items.
class UnknownContentDetectorDirectly declared public members:
static bool hasUnknownActions(vyuh_action.Action? action);Checks if an Action contains any unknown action configurations.
static bool hasUnknownActionsInList(List<vyuh_action.Action?> actions);Checks if a list of actions contains any unknown action configurations.
static bool hasUnknownConditions(Condition? condition);Checks if a Condition contains any unknown condition configurations.
static bool hasUnknownModifiers(ContentItem contentItem);Checks if a content item has any unknown modifiers.
static bool hasUnknownLayout(LayoutConfiguration? layout);Checks if a content item has an unknown layout.
static bool hasAnyUnknownContent(ContentItem contentItem, {List<vyuh_action.Action?> additionalActions = const [], List<Condition?> additionalConditions = const [], LayoutConfiguration? layout});Comprehensive check for any unknown content in a content item. This can be extended by subclasses to check specific action/condition fields.
UnknownContentIndicator
A widget that wraps content items to provide visual feedback when they contain unknown actions, conditions, layouts, or modifiers.
class UnknownContentIndicator extends StatelessWidgetDirectly declared public members:
final ContentItem contentItem;The content item being checked for unknown content.
final List<vyuh_action.Action?> actions;Additional actions to check for unknown configurations.
final List<Condition?> conditions;Additional conditions to check for unknown configurations.
final LayoutConfiguration? layout;The layout to check (defaults to contentItem.layout).
final Widget child;The child widget to wrap with the indicator.
final bool showDetailOnTap;Whether to show a detailed overlay on tap (debug mode only).
const UnknownContentIndicator({super.key, required this.contentItem, required this.child, this.actions = const [], this.conditions = const [], this.layout, this.showDetailOnTap = true});Widget build(BuildContext context);UnknownContentModifierConfiguration
Unknown content modifier configuration placeholder.
final class UnknownContentModifierConfiguration extends ContentModifierConfigurationDirectly declared public members:
static const dynamic schemaName;final String missingSchemaType;final Map<String, dynamic> jsonPayload;UnknownContentModifierConfiguration({required this.missingSchemaType, required this.jsonPayload});Widget build(BuildContext context, Widget child, ContentItem content);UnknownLayoutConfiguration
Unknown layout configuration placeholder.
final class UnknownLayoutConfiguration<T extends ContentItem> extends LayoutConfiguration<T>Directly declared public members:
static const dynamic schemaName;final String missingSchemaType;final Map<String, dynamic> jsonPayload;UnknownLayoutConfiguration({required this.missingSchemaType, required this.jsonPayload});Widget build(BuildContext context, T content);createUnknownPlaceholder
Factory function that creates unknown placeholders for different schema item types. This is registered with the serialization system to provide placeholders when type registration fails.
SchemaItem? createUnknownPlaceholder(Type type, String missingSchemaType, Map<String, dynamic> jsonPayload)initializeUnknownPlaceholderFactory
Initializes the unknown placeholder factory for the serialization system. This should be called during app initialization.
void initializeUnknownPlaceholderFactory()