From d7e534b4342fb3affd4041b20627370388592320 Mon Sep 17 00:00:00 2001 From: Mithul Nayagam Date: Thu, 7 Aug 2025 19:40:43 +0530 Subject: [PATCH 1/4] added StacDivider to DSL --- .../widgets/stac_divider/stac_divider.dart | 19 -- .../stac_divider/stac_divider.freezed.dart | 189 ------------------ .../widgets/stac_divider/stac_divider.g.dart | 23 --- .../stac_divider/stac_divider_parser.dart | 25 +-- .../stac/lib/src/parsers/widgets/widgets.dart | 2 +- .../lib/widgets/divider/stac_divider.dart | 83 ++++++++ .../lib/widgets/divider/stac_divider.g.dart | 25 +++ packages/stac_models/lib/widgets/widgets.dart | 1 + 8 files changed, 123 insertions(+), 244 deletions(-) delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.dart delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.freezed.dart delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.g.dart create mode 100644 packages/stac_models/lib/widgets/divider/stac_divider.dart create mode 100644 packages/stac_models/lib/widgets/divider/stac_divider.g.dart diff --git a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.dart b/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.dart deleted file mode 100644 index 4d6c0776..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart'; - -export 'stac_divider_parser.dart'; - -part 'stac_divider.freezed.dart'; -part 'stac_divider.g.dart'; - -@freezed -abstract class StacDivider with _$StacDivider { - const factory StacDivider({ - StacDouble? thickness, - StacDouble? height, - String? color, - }) = _StacDivider; - - factory StacDivider.fromJson(Map json) => - _$StacDividerFromJson(json); -} diff --git a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.freezed.dart b/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.freezed.dart deleted file mode 100644 index ba7ee37d..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.freezed.dart +++ /dev/null @@ -1,189 +0,0 @@ -// dart format width=80 -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'stac_divider.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -// dart format off -T _$identity(T value) => value; - -/// @nodoc -mixin _$StacDivider { - StacDouble? get thickness; - StacDouble? get height; - String? get color; - - /// Create a copy of StacDivider - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - $StacDividerCopyWith get copyWith => - _$StacDividerCopyWithImpl(this as StacDivider, _$identity); - - /// Serializes this StacDivider to a JSON map. - Map toJson(); - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is StacDivider && - (identical(other.thickness, thickness) || - other.thickness == thickness) && - (identical(other.height, height) || other.height == height) && - (identical(other.color, color) || other.color == color)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, thickness, height, color); - - @override - String toString() { - return 'StacDivider(thickness: $thickness, height: $height, color: $color)'; - } -} - -/// @nodoc -abstract mixin class $StacDividerCopyWith<$Res> { - factory $StacDividerCopyWith( - StacDivider value, $Res Function(StacDivider) _then) = - _$StacDividerCopyWithImpl; - @useResult - $Res call({StacDouble? thickness, StacDouble? height, String? color}); -} - -/// @nodoc -class _$StacDividerCopyWithImpl<$Res> implements $StacDividerCopyWith<$Res> { - _$StacDividerCopyWithImpl(this._self, this._then); - - final StacDivider _self; - final $Res Function(StacDivider) _then; - - /// Create a copy of StacDivider - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? thickness = freezed, - Object? height = freezed, - Object? color = freezed, - }) { - return _then(_self.copyWith( - thickness: freezed == thickness - ? _self.thickness - : thickness // ignore: cast_nullable_to_non_nullable - as StacDouble?, - height: freezed == height - ? _self.height - : height // ignore: cast_nullable_to_non_nullable - as StacDouble?, - color: freezed == color - ? _self.color - : color // ignore: cast_nullable_to_non_nullable - as String?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _StacDivider implements StacDivider { - const _StacDivider({this.thickness, this.height, this.color}); - factory _StacDivider.fromJson(Map json) => - _$StacDividerFromJson(json); - - @override - final StacDouble? thickness; - @override - final StacDouble? height; - @override - final String? color; - - /// Create a copy of StacDivider - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - _$StacDividerCopyWith<_StacDivider> get copyWith => - __$StacDividerCopyWithImpl<_StacDivider>(this, _$identity); - - @override - Map toJson() { - return _$StacDividerToJson( - this, - ); - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _StacDivider && - (identical(other.thickness, thickness) || - other.thickness == thickness) && - (identical(other.height, height) || other.height == height) && - (identical(other.color, color) || other.color == color)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, thickness, height, color); - - @override - String toString() { - return 'StacDivider(thickness: $thickness, height: $height, color: $color)'; - } -} - -/// @nodoc -abstract mixin class _$StacDividerCopyWith<$Res> - implements $StacDividerCopyWith<$Res> { - factory _$StacDividerCopyWith( - _StacDivider value, $Res Function(_StacDivider) _then) = - __$StacDividerCopyWithImpl; - @override - @useResult - $Res call({StacDouble? thickness, StacDouble? height, String? color}); -} - -/// @nodoc -class __$StacDividerCopyWithImpl<$Res> implements _$StacDividerCopyWith<$Res> { - __$StacDividerCopyWithImpl(this._self, this._then); - - final _StacDivider _self; - final $Res Function(_StacDivider) _then; - - /// Create a copy of StacDivider - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $Res call({ - Object? thickness = freezed, - Object? height = freezed, - Object? color = freezed, - }) { - return _then(_StacDivider( - thickness: freezed == thickness - ? _self.thickness - : thickness // ignore: cast_nullable_to_non_nullable - as StacDouble?, - height: freezed == height - ? _self.height - : height // ignore: cast_nullable_to_non_nullable - as StacDouble?, - color: freezed == color - ? _self.color - : color // ignore: cast_nullable_to_non_nullable - as String?, - )); - } -} - -// dart format on diff --git a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.g.dart b/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.g.dart deleted file mode 100644 index ff7d018b..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider.g.dart +++ /dev/null @@ -1,23 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'stac_divider.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_StacDivider _$StacDividerFromJson(Map json) => _StacDivider( - thickness: json['thickness'] == null - ? null - : StacDouble.fromJson(json['thickness']), - height: - json['height'] == null ? null : StacDouble.fromJson(json['height']), - color: json['color'] as String?, - ); - -Map _$StacDividerToJson(_StacDivider instance) => - { - 'thickness': instance.thickness, - 'height': instance.height, - 'color': instance.color, - }; diff --git a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider_parser.dart index db6696b6..e7974928 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider_parser.dart @@ -1,25 +1,26 @@ import 'package:flutter/material.dart'; -import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart'; +import 'package:stac/src/utils/color_utils.dart'; import 'package:stac/src/utils/widget_type.dart'; -import 'package:stac/stac.dart'; - +import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_models/widgets/divider/stac_divider.dart'; class StacDividerParser extends StacParser { const StacDividerParser(); @override - StacDivider getModel(Map json) { - return StacDivider.fromJson(json); - } + String get type => WidgetType.divider.name; + + @override + StacDivider getModel(Map json) => + StacDivider.fromJson(json); @override Widget parse(BuildContext context, StacDivider model) { return Divider( - thickness: model.thickness?.parse, - color: model.color.toColor(context), - height: model.height?.parse, + height: model.height, + thickness: model.thickness, + indent: model.indent, + endIndent: model.endIndent, + color: model.color?.toColor(context), ); } - - @override - String get type => WidgetType.divider.name; } diff --git a/packages/stac/lib/src/parsers/widgets/widgets.dart b/packages/stac/lib/src/parsers/widgets/widgets.dart index 8414f56b..79b6870f 100644 --- a/packages/stac/lib/src/parsers/widgets/widgets.dart +++ b/packages/stac/lib/src/parsers/widgets/widgets.dart @@ -26,7 +26,7 @@ export 'package:stac/src/parsers/widgets/stac_container/stac_container_parser.da export 'package:stac/src/parsers/widgets/stac_custom_scroll_view/stac_custom_scroll_view.dart'; export 'package:stac/src/parsers/widgets/stac_default_bottom_navigation_controller/stac_default_bottom_navigation_controller.dart'; export 'package:stac/src/parsers/widgets/stac_default_tab_controller/stac_default_tab_controller.dart'; -export 'package:stac/src/parsers/widgets/stac_divider/stac_divider.dart'; +export 'package:stac/src/parsers/widgets/stac_divider/stac_divider_parser.dart'; // Updated export export 'package:stac/src/parsers/widgets/stac_drawer/stac_drawer.dart'; export 'package:stac/src/parsers/widgets/stac_dropdown_menu/stac_dropdown_menu.dart'; export 'package:stac/src/parsers/widgets/stac_dropdown_menu_entry/stac_dropdown_menu_entry.dart'; diff --git a/packages/stac_models/lib/widgets/divider/stac_divider.dart b/packages/stac_models/lib/widgets/divider/stac_divider.dart new file mode 100644 index 00000000..21d6cb69 --- /dev/null +++ b/packages/stac_models/lib/widgets/divider/stac_divider.dart @@ -0,0 +1,83 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_widget.dart'; +import 'package:stac_models/core/converters/double_converter.dart'; +import 'package:stac_models/painting/stac_color/stac_colors.dart'; + +part 'stac_divider.g.dart'; + +/// A Stac model representing Flutter's [Divider] widget. +/// +/// A thin horizontal line, with padding on either side. +/// +/// In the material library, this represents a divider. +/// +/// ```dart +/// StacDivider( +/// thickness: 2.0, +/// color: StacColor('#FF0000'), // Red color +/// indent: 16.0, +/// endIndent: 16.0, +/// ) +/// ``` +/// +/// ```json +/// { +/// "widget": "Divider", +/// "thickness": 2.0, +/// "color": "#FF0000", +/// "indent": 16.0, +/// "endIndent": 16.0 +/// } +/// ``` +/// +/// See also: +/// * Flutter's [Divider documentation](https://api.flutter.dev/flutter/material/Divider-class.html) +@JsonSerializable() +class StacDivider extends StacWidget { + /// Creates a [StacDivider]. + /// + /// All properties are optional. The parser will provide appropriate defaults + /// from Flutter's [Divider] if they are not specified. + const StacDivider({ + this.height, + this.thickness, + this.indent, + this.endIndent, + this.color, + }); + + /// The divider's height extent. + /// + /// The spaceClaimed parameter is the space occupied by the widget. + @DoubleConverter() + final double? height; + + /// The thickness of the line drawn within the divider. + /// + /// A divider with a [thickness] of 0.0 is always drawn as a line with a + /// height of exactly one device pixel. + @DoubleConverter() + final double? thickness; + + /// The amount of empty space to the leading edge of the divider. + @DoubleConverter() + final double? indent; + + /// The amount of empty space to the trailing edge of the divider. + @DoubleConverter() + final double? endIndent; + + /// The color to use when painting the line. + final StacColor? color; + + @override + String get type => 'divider'; + + /// Creates a [StacDivider] from a JSON map. + factory StacDivider.fromJson(Map json) => + _$StacDividerFromJson(json); + + /// Converts this [StacDivider] instance to a JSON map. + @override + Map toJson() => _$StacDividerToJson(this); +} diff --git a/packages/stac_models/lib/widgets/divider/stac_divider.g.dart b/packages/stac_models/lib/widgets/divider/stac_divider.g.dart new file mode 100644 index 00000000..c2f7f95c --- /dev/null +++ b/packages/stac_models/lib/widgets/divider/stac_divider.g.dart @@ -0,0 +1,25 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'stac_divider.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StacDivider _$StacDividerFromJson(Map json) => StacDivider( + height: const DoubleConverter().fromJson(json['height']), + thickness: const DoubleConverter().fromJson(json['thickness']), + indent: const DoubleConverter().fromJson(json['indent']), + endIndent: const DoubleConverter().fromJson(json['endIndent']), + color: json['color'] as String?, +); + +Map _$StacDividerToJson(StacDivider instance) => + { + 'height': const DoubleConverter().toJson(instance.height), + 'thickness': const DoubleConverter().toJson(instance.thickness), + 'indent': const DoubleConverter().toJson(instance.indent), + 'endIndent': const DoubleConverter().toJson(instance.endIndent), + 'color': instance.color, + 'type': instance.type, + }; diff --git a/packages/stac_models/lib/widgets/widgets.dart b/packages/stac_models/lib/widgets/widgets.dart index 466cd830..b3e46c08 100644 --- a/packages/stac_models/lib/widgets/widgets.dart +++ b/packages/stac_models/lib/widgets/widgets.dart @@ -4,6 +4,7 @@ export 'app_bar/stac_app_bar.dart'; export 'center/stac_center.dart'; export 'column/stac_column.dart'; export 'container/stac_container.dart'; +export 'divider/stac_divider.dart'; export 'elevated_button/stac_elevated_button.dart'; export 'expanded/stac_expanded.dart'; export 'filled_button/stac_filled_button.dart'; From 950d3fe9e4c0b60fb9d34d0b3e9aaddedd7acbc0 Mon Sep 17 00:00:00 2001 From: Mithul Nayagam Date: Thu, 7 Aug 2025 21:39:07 +0530 Subject: [PATCH 2/4] added StacVerticalDivider to DSL --- .../stac_vertical_divider.dart | 21 -- .../stac_vertical_divider.freezed.dart | 238 ------------------ .../stac_vertical_divider.g.dart | 31 --- .../stac_vertical_divider_parser.dart | 17 +- .../stac/lib/src/parsers/widgets/widgets.dart | 4 +- .../stac_vertical_divider.dart | 114 +++++++++ .../stac_vertical_divider.g.dart | 27 ++ packages/stac_models/lib/widgets/widgets.dart | 1 + 8 files changed, 152 insertions(+), 301 deletions(-) delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.dart delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.freezed.dart delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.g.dart create mode 100644 packages/stac_models/lib/widgets/vertical_divider/stac_vertical_divider.dart create mode 100644 packages/stac_models/lib/widgets/vertical_divider/stac_vertical_divider.g.dart diff --git a/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.dart b/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.dart deleted file mode 100644 index 98cc4e7d..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart'; - -export 'stac_vertical_divider_parser.dart'; - -part 'stac_vertical_divider.freezed.dart'; -part 'stac_vertical_divider.g.dart'; - -@freezed -abstract class StacVerticalDivider with _$StacVerticalDivider { - const factory StacVerticalDivider({ - StacDouble? width, - StacDouble? thickness, - StacDouble? indent, - StacDouble? endIndent, - String? color, - }) = _StacVerticalDivider; - - factory StacVerticalDivider.fromJson(Map json) => - _$StacVerticalDividerFromJson(json); -} diff --git a/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.freezed.dart b/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.freezed.dart deleted file mode 100644 index 46591890..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.freezed.dart +++ /dev/null @@ -1,238 +0,0 @@ -// dart format width=80 -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'stac_vertical_divider.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -// dart format off -T _$identity(T value) => value; - -/// @nodoc -mixin _$StacVerticalDivider { - StacDouble? get width; - StacDouble? get thickness; - StacDouble? get indent; - StacDouble? get endIndent; - String? get color; - - /// Create a copy of StacVerticalDivider - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - $StacVerticalDividerCopyWith get copyWith => - _$StacVerticalDividerCopyWithImpl( - this as StacVerticalDivider, _$identity); - - /// Serializes this StacVerticalDivider to a JSON map. - Map toJson(); - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is StacVerticalDivider && - (identical(other.width, width) || other.width == width) && - (identical(other.thickness, thickness) || - other.thickness == thickness) && - (identical(other.indent, indent) || other.indent == indent) && - (identical(other.endIndent, endIndent) || - other.endIndent == endIndent) && - (identical(other.color, color) || other.color == color)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => - Object.hash(runtimeType, width, thickness, indent, endIndent, color); - - @override - String toString() { - return 'StacVerticalDivider(width: $width, thickness: $thickness, indent: $indent, endIndent: $endIndent, color: $color)'; - } -} - -/// @nodoc -abstract mixin class $StacVerticalDividerCopyWith<$Res> { - factory $StacVerticalDividerCopyWith( - StacVerticalDivider value, $Res Function(StacVerticalDivider) _then) = - _$StacVerticalDividerCopyWithImpl; - @useResult - $Res call( - {StacDouble? width, - StacDouble? thickness, - StacDouble? indent, - StacDouble? endIndent, - String? color}); -} - -/// @nodoc -class _$StacVerticalDividerCopyWithImpl<$Res> - implements $StacVerticalDividerCopyWith<$Res> { - _$StacVerticalDividerCopyWithImpl(this._self, this._then); - - final StacVerticalDivider _self; - final $Res Function(StacVerticalDivider) _then; - - /// Create a copy of StacVerticalDivider - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? width = freezed, - Object? thickness = freezed, - Object? indent = freezed, - Object? endIndent = freezed, - Object? color = freezed, - }) { - return _then(_self.copyWith( - width: freezed == width - ? _self.width - : width // ignore: cast_nullable_to_non_nullable - as StacDouble?, - thickness: freezed == thickness - ? _self.thickness - : thickness // ignore: cast_nullable_to_non_nullable - as StacDouble?, - indent: freezed == indent - ? _self.indent - : indent // ignore: cast_nullable_to_non_nullable - as StacDouble?, - endIndent: freezed == endIndent - ? _self.endIndent - : endIndent // ignore: cast_nullable_to_non_nullable - as StacDouble?, - color: freezed == color - ? _self.color - : color // ignore: cast_nullable_to_non_nullable - as String?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _StacVerticalDivider implements StacVerticalDivider { - const _StacVerticalDivider( - {this.width, this.thickness, this.indent, this.endIndent, this.color}); - factory _StacVerticalDivider.fromJson(Map json) => - _$StacVerticalDividerFromJson(json); - - @override - final StacDouble? width; - @override - final StacDouble? thickness; - @override - final StacDouble? indent; - @override - final StacDouble? endIndent; - @override - final String? color; - - /// Create a copy of StacVerticalDivider - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - _$StacVerticalDividerCopyWith<_StacVerticalDivider> get copyWith => - __$StacVerticalDividerCopyWithImpl<_StacVerticalDivider>( - this, _$identity); - - @override - Map toJson() { - return _$StacVerticalDividerToJson( - this, - ); - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _StacVerticalDivider && - (identical(other.width, width) || other.width == width) && - (identical(other.thickness, thickness) || - other.thickness == thickness) && - (identical(other.indent, indent) || other.indent == indent) && - (identical(other.endIndent, endIndent) || - other.endIndent == endIndent) && - (identical(other.color, color) || other.color == color)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => - Object.hash(runtimeType, width, thickness, indent, endIndent, color); - - @override - String toString() { - return 'StacVerticalDivider(width: $width, thickness: $thickness, indent: $indent, endIndent: $endIndent, color: $color)'; - } -} - -/// @nodoc -abstract mixin class _$StacVerticalDividerCopyWith<$Res> - implements $StacVerticalDividerCopyWith<$Res> { - factory _$StacVerticalDividerCopyWith(_StacVerticalDivider value, - $Res Function(_StacVerticalDivider) _then) = - __$StacVerticalDividerCopyWithImpl; - @override - @useResult - $Res call( - {StacDouble? width, - StacDouble? thickness, - StacDouble? indent, - StacDouble? endIndent, - String? color}); -} - -/// @nodoc -class __$StacVerticalDividerCopyWithImpl<$Res> - implements _$StacVerticalDividerCopyWith<$Res> { - __$StacVerticalDividerCopyWithImpl(this._self, this._then); - - final _StacVerticalDivider _self; - final $Res Function(_StacVerticalDivider) _then; - - /// Create a copy of StacVerticalDivider - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $Res call({ - Object? width = freezed, - Object? thickness = freezed, - Object? indent = freezed, - Object? endIndent = freezed, - Object? color = freezed, - }) { - return _then(_StacVerticalDivider( - width: freezed == width - ? _self.width - : width // ignore: cast_nullable_to_non_nullable - as StacDouble?, - thickness: freezed == thickness - ? _self.thickness - : thickness // ignore: cast_nullable_to_non_nullable - as StacDouble?, - indent: freezed == indent - ? _self.indent - : indent // ignore: cast_nullable_to_non_nullable - as StacDouble?, - endIndent: freezed == endIndent - ? _self.endIndent - : endIndent // ignore: cast_nullable_to_non_nullable - as StacDouble?, - color: freezed == color - ? _self.color - : color // ignore: cast_nullable_to_non_nullable - as String?, - )); - } -} - -// dart format on diff --git a/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.g.dart b/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.g.dart deleted file mode 100644 index 02968f1e..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.g.dart +++ /dev/null @@ -1,31 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'stac_vertical_divider.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_StacVerticalDivider _$StacVerticalDividerFromJson(Map json) => - _StacVerticalDivider( - width: json['width'] == null ? null : StacDouble.fromJson(json['width']), - thickness: json['thickness'] == null - ? null - : StacDouble.fromJson(json['thickness']), - indent: - json['indent'] == null ? null : StacDouble.fromJson(json['indent']), - endIndent: json['endIndent'] == null - ? null - : StacDouble.fromJson(json['endIndent']), - color: json['color'] as String?, - ); - -Map _$StacVerticalDividerToJson( - _StacVerticalDivider instance) => - { - 'width': instance.width, - 'thickness': instance.thickness, - 'indent': instance.indent, - 'endIndent': instance.endIndent, - 'color': instance.color, - }; diff --git a/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider_parser.dart index 965539bf..acf74f30 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider_parser.dart @@ -1,27 +1,26 @@ import 'package:flutter/material.dart'; -import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart'; -import 'package:stac/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.dart'; import 'package:stac/src/utils/color_utils.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_models/widgets/vertical_divider/stac_vertical_divider.dart'; class StacVerticalDividerParser extends StacParser { const StacVerticalDividerParser(); @override - StacVerticalDivider getModel(Map json) => - StacVerticalDivider.fromJson(json); + String get type => WidgetType.verticalDivider.name; @override - String get type => WidgetType.verticalDivider.name; + StacVerticalDivider getModel(Map json) => + StacVerticalDivider.fromJson(json); @override Widget parse(BuildContext context, StacVerticalDivider model) { return VerticalDivider( - width: model.width?.parse, - thickness: model.thickness?.parse, - indent: model.indent?.parse, - endIndent: model.endIndent?.parse, + width: model.width, + thickness: model.thickness, + indent: model.indent, + endIndent: model.endIndent, color: model.color?.toColor(context), ); } diff --git a/packages/stac/lib/src/parsers/widgets/widgets.dart b/packages/stac/lib/src/parsers/widgets/widgets.dart index 79b6870f..bd186937 100644 --- a/packages/stac/lib/src/parsers/widgets/widgets.dart +++ b/packages/stac/lib/src/parsers/widgets/widgets.dart @@ -26,7 +26,7 @@ export 'package:stac/src/parsers/widgets/stac_container/stac_container_parser.da export 'package:stac/src/parsers/widgets/stac_custom_scroll_view/stac_custom_scroll_view.dart'; export 'package:stac/src/parsers/widgets/stac_default_bottom_navigation_controller/stac_default_bottom_navigation_controller.dart'; export 'package:stac/src/parsers/widgets/stac_default_tab_controller/stac_default_tab_controller.dart'; -export 'package:stac/src/parsers/widgets/stac_divider/stac_divider_parser.dart'; // Updated export +export 'package:stac/src/parsers/widgets/stac_divider/stac_divider_parser.dart'; export 'package:stac/src/parsers/widgets/stac_drawer/stac_drawer.dart'; export 'package:stac/src/parsers/widgets/stac_dropdown_menu/stac_dropdown_menu.dart'; export 'package:stac/src/parsers/widgets/stac_dropdown_menu_entry/stac_dropdown_menu_entry.dart'; @@ -86,6 +86,6 @@ export 'package:stac/src/parsers/widgets/stac_text_button/stac_text_button_parse export 'package:stac/src/parsers/widgets/stac_text_field/stac_text_field.dart'; export 'package:stac/src/parsers/widgets/stac_text_form_field/stac_text_form_field.dart'; export 'package:stac/src/parsers/widgets/stac_text_style/stac_text_style.dart'; -export 'package:stac/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider.dart'; +export 'package:stac/src/parsers/widgets/stac_vertical_divider/stac_vertical_divider_parser.dart'; export 'package:stac/src/parsers/widgets/stac_wrap/stac_wrap_parser.dart'; export 'package:stac/src/parsers/widgets/stac_visibility/stac_visibility_parser.dart'; diff --git a/packages/stac_models/lib/widgets/vertical_divider/stac_vertical_divider.dart b/packages/stac_models/lib/widgets/vertical_divider/stac_vertical_divider.dart new file mode 100644 index 00000000..fecf9d87 --- /dev/null +++ b/packages/stac_models/lib/widgets/vertical_divider/stac_vertical_divider.dart @@ -0,0 +1,114 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/core/stac_widget.dart'; +import 'package:stac_models/core/converters/double_converter.dart'; +import 'package:stac_models/painting/stac_color/stac_colors.dart'; + +part 'stac_vertical_divider.g.dart'; + +/// A Stac model representing Flutter's [VerticalDivider] widget. +/// +/// A thin vertical line, with padding on either side. +/// +/// In the material design language, this represents a divider. Vertical +/// dividers are typically used to divide parts of a layout. +/// +/// The box's width is controlled by the [width] property, and its height is +/// the height of the constraints imposed by its parent. +/// +/// {@tool snippet} +/// Dart Example: +/// ```dart +/// StacVerticalDivider( +/// width: 20.0, +/// thickness: 2.0, +/// indent: 10.0, +/// endIndent: 10.0, +/// color: StacColor(value: 0xFF000000), +/// ) +/// ``` +/// {@end-tool} +/// +/// {@tool snippet} +/// JSON Example: +/// ```json +/// { +/// "type": "verticalDivider", +/// "width": 20.0, +/// "thickness": 2.0, +/// "indent": 10.0, +/// "endIndent": 10.0, +/// "color": {"value": 4278190080} +/// } +/// ``` +/// {@end-tool} +@JsonSerializable() +class StacVerticalDivider extends StacWidget { + /// Creates a [StacVerticalDivider]. + /// + /// The [width], [thickness], [indent], [endIndent], and [color] arguments + /// must not be null if they are not defaulted. + const StacVerticalDivider({ + this.width, + this.thickness, + this.indent, + this.endIndent, + this.color, + }); + + /// The divider's width. + /// + /// The divider itself is always drawn as a vertical line that is centered + /// within the width specified by this value. + /// + /// If this is null, then the [DividerThemeData.space] is used. If that is + /// also null, then this defaults to 16.0. + @DoubleConverter() + final double? width; + + /// The thickness of the line drawn within the divider. + /// + /// A divider with a [thickness] of 0.0 is always drawn as a line with a + /// height of exactly one device pixel. + /// + /// If this is null, then the [DividerThemeData.thickness] is used. If that is + /// also null, then this defaults to 0.0. + @DoubleConverter() + final double? thickness; + + /// The amount of empty space to the leading edge of the divider. + /// + /// If this is null, then the [DividerThemeData.indent] is used. If that is + /// also null, then this defaults to 0.0. + @DoubleConverter() + final double? indent; + + /// The amount of empty space to the trailing edge of the divider. + /// + /// If this is null, then the [DividerThemeData.endIndent] is used. If that is + /// also null, then this defaults to 0.0. + @DoubleConverter() + final double? endIndent; + + /// The color to use when painting the line. + /// + /// If this is null, then the [DividerThemeData.color] is used. If that is + /// also null, then [ThemeData.dividerColor] is used. + final StacColor? color; + + /// The type of this Stac widget. + /// + /// This is used to identify the widget type in JSON serialization. + @override + String get type => 'verticalDivider'; + + /// Creates a [StacVerticalDivider] instance from a JSON map. + /// + /// The [json] argument must be a valid JSON representation of a + /// [StacVerticalDivider]. + factory StacVerticalDivider.fromJson(Map json) => + _$StacVerticalDividerFromJson(json); + + /// Converts this [StacVerticalDivider] instance to a JSON map. + @override + Map toJson() => _$StacVerticalDividerToJson(this); +} diff --git a/packages/stac_models/lib/widgets/vertical_divider/stac_vertical_divider.g.dart b/packages/stac_models/lib/widgets/vertical_divider/stac_vertical_divider.g.dart new file mode 100644 index 00000000..0ac9f011 --- /dev/null +++ b/packages/stac_models/lib/widgets/vertical_divider/stac_vertical_divider.g.dart @@ -0,0 +1,27 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'stac_vertical_divider.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StacVerticalDivider _$StacVerticalDividerFromJson(Map json) => + StacVerticalDivider( + width: const DoubleConverter().fromJson(json['width']), + thickness: const DoubleConverter().fromJson(json['thickness']), + indent: const DoubleConverter().fromJson(json['indent']), + endIndent: const DoubleConverter().fromJson(json['endIndent']), + color: json['color'] as String?, + ); + +Map _$StacVerticalDividerToJson( + StacVerticalDivider instance, +) => { + 'width': const DoubleConverter().toJson(instance.width), + 'thickness': const DoubleConverter().toJson(instance.thickness), + 'indent': const DoubleConverter().toJson(instance.indent), + 'endIndent': const DoubleConverter().toJson(instance.endIndent), + 'color': instance.color, + 'type': instance.type, +}; diff --git a/packages/stac_models/lib/widgets/widgets.dart b/packages/stac_models/lib/widgets/widgets.dart index b3e46c08..b98d2b4c 100644 --- a/packages/stac_models/lib/widgets/widgets.dart +++ b/packages/stac_models/lib/widgets/widgets.dart @@ -32,3 +32,4 @@ export 'visibility/stac_visibility.dart'; export 'safe_area/stac_safe_area.dart'; export 'wrap/stac_wrap.dart'; export 'single_child_scroll_view/stac_single_child_scroll_view.dart'; +export 'vertical_divider/stac_vertical_divider.dart'; From 3d1643b347857a2e2d4ccac305babc570d177055 Mon Sep 17 00:00:00 2001 From: Mithul Nayagam Date: Thu, 7 Aug 2025 21:39:26 +0530 Subject: [PATCH 3/4] added StacDynamicView to DSL --- .../stac_dynamic_view/stac_dynamic_view.dart | 25 -- .../stac_dynamic_view.freezed.dart | 332 ------------------ .../stac_dynamic_view.g.dart | 30 -- .../stac_dynamic_view_parser.dart | 55 +-- .../stac/lib/src/parsers/widgets/widgets.dart | 2 +- .../dynamic_view/stac_dynamic_view.dart | 94 +++++ .../dynamic_view/stac_dynamic_view.g.dart | 40 +++ packages/stac_models/lib/widgets/widgets.dart | 1 + 8 files changed, 164 insertions(+), 415 deletions(-) delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.freezed.dart delete mode 100644 packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.g.dart create mode 100644 packages/stac_models/lib/widgets/dynamic_view/stac_dynamic_view.dart create mode 100644 packages/stac_models/lib/widgets/dynamic_view/stac_dynamic_view.g.dart diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart deleted file mode 100644 index 93b5f656..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:stac_models/actions/network_request/stac_network_request.dart'; - -export 'stac_dynamic_view_parser.dart'; - -part 'stac_dynamic_view.freezed.dart'; -part 'stac_dynamic_view.g.dart'; - -/// A model class for the StacDynamicView parser. -/// This parser fetches data dynamically and renders it using a template. -@freezed -abstract class StacDynamicView with _$StacDynamicView { - const factory StacDynamicView({ - required StacNetworkRequest request, - @Default('') String targetPath, - required Map template, - @Default('') String resultTarget, - Map? emptyTemplate, - Map? loaderWidget, - Map? errorWidget, - }) = _StacDynamicView; - - factory StacDynamicView.fromJson(Map json) => - _$StacDynamicViewFromJson(json); -} diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.freezed.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.freezed.dart deleted file mode 100644 index 66607222..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.freezed.dart +++ /dev/null @@ -1,332 +0,0 @@ -// dart format width=80 -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'stac_dynamic_view.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -// dart format off -T _$identity(T value) => value; - -/// @nodoc -mixin _$StacDynamicView { - StacNetworkRequest get request; - String get targetPath; - Map get template; - String get resultTarget; - Map? get emptyTemplate; - Map? get loaderWidget; - Map? get errorWidget; - - /// Create a copy of StacDynamicView - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - $StacDynamicViewCopyWith get copyWith => - _$StacDynamicViewCopyWithImpl( - this as StacDynamicView, _$identity); - - /// Serializes this StacDynamicView to a JSON map. - Map toJson(); - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is StacDynamicView && - (identical(other.request, request) || other.request == request) && - (identical(other.targetPath, targetPath) || - other.targetPath == targetPath) && - const DeepCollectionEquality().equals(other.template, template) && - (identical(other.resultTarget, resultTarget) || - other.resultTarget == resultTarget) && - const DeepCollectionEquality() - .equals(other.emptyTemplate, emptyTemplate) && - const DeepCollectionEquality() - .equals(other.loaderWidget, loaderWidget) && - const DeepCollectionEquality() - .equals(other.errorWidget, errorWidget)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - request, - targetPath, - const DeepCollectionEquality().hash(template), - resultTarget, - const DeepCollectionEquality().hash(emptyTemplate), - const DeepCollectionEquality().hash(loaderWidget), - const DeepCollectionEquality().hash(errorWidget)); - - @override - String toString() { - return 'StacDynamicView(request: $request, targetPath: $targetPath, template: $template, resultTarget: $resultTarget, emptyTemplate: $emptyTemplate, loaderWidget: $loaderWidget, errorWidget: $errorWidget)'; - } -} - -/// @nodoc -abstract mixin class $StacDynamicViewCopyWith<$Res> { - factory $StacDynamicViewCopyWith( - StacDynamicView value, $Res Function(StacDynamicView) _then) = - _$StacDynamicViewCopyWithImpl; - @useResult - $Res call( - {StacNetworkRequest request, - String targetPath, - Map template, - String resultTarget, - Map? emptyTemplate, - Map? loaderWidget, - Map? errorWidget}); -} - -/// @nodoc -class _$StacDynamicViewCopyWithImpl<$Res> - implements $StacDynamicViewCopyWith<$Res> { - _$StacDynamicViewCopyWithImpl(this._self, this._then); - - final StacDynamicView _self; - final $Res Function(StacDynamicView) _then; - - /// Create a copy of StacDynamicView - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? request = null, - Object? targetPath = null, - Object? template = null, - Object? resultTarget = null, - Object? emptyTemplate = freezed, - Object? loaderWidget = freezed, - Object? errorWidget = freezed, - }) { - return _then(_self.copyWith( - request: null == request - ? _self.request - : request // ignore: cast_nullable_to_non_nullable - as StacNetworkRequest, - targetPath: null == targetPath - ? _self.targetPath - : targetPath // ignore: cast_nullable_to_non_nullable - as String, - template: null == template - ? _self.template - : template // ignore: cast_nullable_to_non_nullable - as Map, - resultTarget: null == resultTarget - ? _self.resultTarget - : resultTarget // ignore: cast_nullable_to_non_nullable - as String, - emptyTemplate: freezed == emptyTemplate - ? _self.emptyTemplate - : emptyTemplate // ignore: cast_nullable_to_non_nullable - as Map?, - loaderWidget: freezed == loaderWidget - ? _self.loaderWidget - : loaderWidget // ignore: cast_nullable_to_non_nullable - as Map?, - errorWidget: freezed == errorWidget - ? _self.errorWidget - : errorWidget // ignore: cast_nullable_to_non_nullable - as Map?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _StacDynamicView implements StacDynamicView { - const _StacDynamicView( - {required this.request, - this.targetPath = '', - required final Map template, - this.resultTarget = '', - final Map? emptyTemplate, - final Map? loaderWidget, - final Map? errorWidget}) - : _template = template, - _emptyTemplate = emptyTemplate, - _loaderWidget = loaderWidget, - _errorWidget = errorWidget; - factory _StacDynamicView.fromJson(Map json) => - _$StacDynamicViewFromJson(json); - - @override - final StacNetworkRequest request; - @override - @JsonKey() - final String targetPath; - final Map _template; - @override - Map get template { - if (_template is EqualUnmodifiableMapView) return _template; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(_template); - } - - @override - @JsonKey() - final String resultTarget; - final Map? _emptyTemplate; - @override - Map? get emptyTemplate { - final value = _emptyTemplate; - if (value == null) return null; - if (_emptyTemplate is EqualUnmodifiableMapView) return _emptyTemplate; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(value); - } - - final Map? _loaderWidget; - @override - Map? get loaderWidget { - final value = _loaderWidget; - if (value == null) return null; - if (_loaderWidget is EqualUnmodifiableMapView) return _loaderWidget; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(value); - } - - final Map? _errorWidget; - @override - Map? get errorWidget { - final value = _errorWidget; - if (value == null) return null; - if (_errorWidget is EqualUnmodifiableMapView) return _errorWidget; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(value); - } - - /// Create a copy of StacDynamicView - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - @pragma('vm:prefer-inline') - _$StacDynamicViewCopyWith<_StacDynamicView> get copyWith => - __$StacDynamicViewCopyWithImpl<_StacDynamicView>(this, _$identity); - - @override - Map toJson() { - return _$StacDynamicViewToJson( - this, - ); - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _StacDynamicView && - (identical(other.request, request) || other.request == request) && - (identical(other.targetPath, targetPath) || - other.targetPath == targetPath) && - const DeepCollectionEquality().equals(other._template, _template) && - (identical(other.resultTarget, resultTarget) || - other.resultTarget == resultTarget) && - const DeepCollectionEquality() - .equals(other._emptyTemplate, _emptyTemplate) && - const DeepCollectionEquality() - .equals(other._loaderWidget, _loaderWidget) && - const DeepCollectionEquality() - .equals(other._errorWidget, _errorWidget)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash( - runtimeType, - request, - targetPath, - const DeepCollectionEquality().hash(_template), - resultTarget, - const DeepCollectionEquality().hash(_emptyTemplate), - const DeepCollectionEquality().hash(_loaderWidget), - const DeepCollectionEquality().hash(_errorWidget)); - - @override - String toString() { - return 'StacDynamicView(request: $request, targetPath: $targetPath, template: $template, resultTarget: $resultTarget, emptyTemplate: $emptyTemplate, loaderWidget: $loaderWidget, errorWidget: $errorWidget)'; - } -} - -/// @nodoc -abstract mixin class _$StacDynamicViewCopyWith<$Res> - implements $StacDynamicViewCopyWith<$Res> { - factory _$StacDynamicViewCopyWith( - _StacDynamicView value, $Res Function(_StacDynamicView) _then) = - __$StacDynamicViewCopyWithImpl; - @override - @useResult - $Res call( - {StacNetworkRequest request, - String targetPath, - Map template, - String resultTarget, - Map? emptyTemplate, - Map? loaderWidget, - Map? errorWidget}); -} - -/// @nodoc -class __$StacDynamicViewCopyWithImpl<$Res> - implements _$StacDynamicViewCopyWith<$Res> { - __$StacDynamicViewCopyWithImpl(this._self, this._then); - - final _StacDynamicView _self; - final $Res Function(_StacDynamicView) _then; - - /// Create a copy of StacDynamicView - /// with the given fields replaced by the non-null parameter values. - @override - @pragma('vm:prefer-inline') - $Res call({ - Object? request = null, - Object? targetPath = null, - Object? template = null, - Object? resultTarget = null, - Object? emptyTemplate = freezed, - Object? loaderWidget = freezed, - Object? errorWidget = freezed, - }) { - return _then(_StacDynamicView( - request: null == request - ? _self.request - : request // ignore: cast_nullable_to_non_nullable - as StacNetworkRequest, - targetPath: null == targetPath - ? _self.targetPath - : targetPath // ignore: cast_nullable_to_non_nullable - as String, - template: null == template - ? _self._template - : template // ignore: cast_nullable_to_non_nullable - as Map, - resultTarget: null == resultTarget - ? _self.resultTarget - : resultTarget // ignore: cast_nullable_to_non_nullable - as String, - emptyTemplate: freezed == emptyTemplate - ? _self._emptyTemplate - : emptyTemplate // ignore: cast_nullable_to_non_nullable - as Map?, - loaderWidget: freezed == loaderWidget - ? _self._loaderWidget - : loaderWidget // ignore: cast_nullable_to_non_nullable - as Map?, - errorWidget: freezed == errorWidget - ? _self._errorWidget - : errorWidget // ignore: cast_nullable_to_non_nullable - as Map?, - )); - } -} - -// dart format on diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.g.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.g.dart deleted file mode 100644 index 5839bb99..00000000 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.g.dart +++ /dev/null @@ -1,30 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'stac_dynamic_view.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_StacDynamicView _$StacDynamicViewFromJson(Map json) => - _StacDynamicView( - request: - StacNetworkRequest.fromJson(json['request'] as Map), - targetPath: json['targetPath'] as String? ?? '', - template: json['template'] as Map, - resultTarget: json['resultTarget'] as String? ?? '', - emptyTemplate: json['emptyTemplate'] as Map?, - loaderWidget: json['loaderWidget'] as Map?, - errorWidget: json['errorWidget'] as Map?, - ); - -Map _$StacDynamicViewToJson(_StacDynamicView instance) => - { - 'request': instance.request, - 'targetPath': instance.targetPath, - 'template': instance.template, - 'resultTarget': instance.resultTarget, - 'emptyTemplate': instance.emptyTemplate, - 'loaderWidget': instance.loaderWidget, - 'errorWidget': instance.errorWidget, - }; diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart index aefec9ce..c54a38a1 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart @@ -3,11 +3,14 @@ import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:stac/src/framework/framework.dart'; -import 'package:stac/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart'; +import 'package:stac/src/parsers/core/stac_widget_parser.dart'; import 'package:stac/src/services/stac_network_service.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; import 'package:stac_logger/stac_logger.dart'; +import 'package:stac_models/core/core.dart'; +import 'package:stac_models/stac_models.dart'; +import 'package:stac_models/widgets/dynamic_view/stac_dynamic_view.dart'; class StacDynamicViewParser extends StacParser { const StacDynamicViewParser(); @@ -26,11 +29,11 @@ class StacDynamicViewParser extends StacParser { future: _fetchData(context, model), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { - return Stac.fromJson(model.loaderWidget, context) ?? + return model.loaderWidget.parse(context) ?? const Center(child: CircularProgressIndicator()); } else if (snapshot.hasError) { Log.e(snapshot.error); - return Stac.fromJson(model.errorWidget, context) ?? const SizedBox(); + return model.errorWidget.parse(context) ?? const SizedBox(); } else if (snapshot.hasData) { final response = snapshot.data; if (response != null) { @@ -45,11 +48,11 @@ class StacDynamicViewParser extends StacParser { responseData = response.data; } - final data = model.targetPath.isEmpty + final data = model.targetPath?.isEmpty ?? true ? responseData : _extractNestedData( responseData, - model.targetPath.split('.'), + model.targetPath?.split('.') ?? [], ); Log.d("data: $data"); @@ -58,27 +61,27 @@ class StacDynamicViewParser extends StacParser { // Check if data is an empty list and we have an empty template if (_isEmptyList(data) && model.emptyTemplate != null) { Log.d("Data is empty list, using empty template"); - return Stac.fromJson(model.emptyTemplate!, context) ?? + return model.emptyTemplate.parse(context) ?? const SizedBox(); } // Prepare data for template based on resultTarget - final dataForTemplate = model.resultTarget.isNotEmpty + final dataForTemplate = (model.resultTarget?.isNotEmpty ?? false) ? {model.resultTarget: data} : data; // Apply the data to the template final renderedTemplate = _applyDataToTemplate( - model.template, + model.template ?? StacSizedBox(), dataForTemplate, - model.resultTarget, + model.resultTarget ?? "", ); return Stac.fromJson(renderedTemplate, context) ?? const SizedBox(); } } catch (e) { Log.e('Error parsing API response: $e'); - return Stac.fromJson(model.errorWidget, context) ?? + return model.errorWidget.parse(context) ?? const SizedBox(); } } @@ -154,21 +157,20 @@ class StacDynamicViewParser extends StacParser { } Map _applyDataToTemplate( - Map currentTemplate, + StacWidget currentTemplate, dynamic data, String resultTarget, ) { // Deep copy template to avoid modifying the original - Map resolvedTemplate = - jsonDecode(jsonEncode(currentTemplate)); + Map resolvedTemplateJson = currentTemplate.toJson(); // Check for list processing with itemTemplate - if (resolvedTemplate.containsKey('itemTemplate')) { + if (resolvedTemplateJson.containsKey('itemTemplate')) { dynamic listForIteration; final String itemTemplateKey = 'itemTemplate'; // Ensure itemTemplateActual is correctly typed. final itemTemplateActual = - resolvedTemplate[itemTemplateKey] as Map; + resolvedTemplateJson[itemTemplateKey] as Map; if (resultTarget.isNotEmpty && data is Map && @@ -184,14 +186,13 @@ class StacDynamicViewParser extends StacParser { if (listForIteration is List && listForIteration.isEmpty) { Log.d( "List for iteration is empty, removing itemTemplate and children"); - resolvedTemplate.remove(itemTemplateKey); + resolvedTemplateJson.remove(itemTemplateKey); // Clear children or set to empty list - resolvedTemplate['children'] = []; - return resolvedTemplate; + resolvedTemplateJson['children'] = []; + return resolvedTemplateJson; } - resolvedTemplate - .remove(itemTemplateKey); // Remove from outer template structure + resolvedTemplateJson.remove(itemTemplateKey); // Remove from outer template structure final processedChildItems = >[]; for (final singleRawItem in listForIteration) { @@ -209,15 +210,15 @@ class StacDynamicViewParser extends StacParser { } } - if (!resolvedTemplate.containsKey('children')) { - resolvedTemplate['children'] = []; + if (!resolvedTemplateJson.containsKey('children')) { + resolvedTemplateJson['children'] = []; } - if (resolvedTemplate['children'] is List) { - (resolvedTemplate['children'] as List).addAll(processedChildItems); + if (resolvedTemplateJson['children'] is List) { + (resolvedTemplateJson['children'] as List).addAll(processedChildItems); } else { Log.w( "Template has 'children' but it's not a List. Overwriting with processed items."); - resolvedTemplate['children'] = processedChildItems; + resolvedTemplateJson['children'] = processedChildItems; } } else { Log.d( @@ -231,13 +232,13 @@ class StacDynamicViewParser extends StacParser { // Ensure it's Map for _processTemplateRecursively final Map mapDataContext = Map.from(data); - _processTemplateRecursively(resolvedTemplate, mapDataContext); + _processTemplateRecursively(resolvedTemplateJson, mapDataContext); } else { Log.d( "Overall dataContext is not a Map, skipping final placeholder processing for the main template structure. DataContext: $data"); } - return resolvedTemplate; + return resolvedTemplateJson; } Map _applyDataToItem( diff --git a/packages/stac/lib/src/parsers/widgets/widgets.dart b/packages/stac/lib/src/parsers/widgets/widgets.dart index bd186937..be666613 100644 --- a/packages/stac/lib/src/parsers/widgets/widgets.dart +++ b/packages/stac/lib/src/parsers/widgets/widgets.dart @@ -31,7 +31,7 @@ export 'package:stac/src/parsers/widgets/stac_drawer/stac_drawer.dart'; export 'package:stac/src/parsers/widgets/stac_dropdown_menu/stac_dropdown_menu.dart'; export 'package:stac/src/parsers/widgets/stac_dropdown_menu_entry/stac_dropdown_menu_entry.dart'; export 'package:stac/src/parsers/widgets/stac_duration/stac_duration.dart'; -export 'package:stac/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart'; +export 'package:stac/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart'; export 'package:stac/src/parsers/widgets/stac_edge_insets/stac_edge_insets.dart'; export 'package:stac/src/parsers/widgets/stac_elevated_button/stac_elevated_button_parser.dart'; export 'package:stac/src/parsers/widgets/stac_expanded/stac_expanded_parser.dart'; diff --git a/packages/stac_models/lib/widgets/dynamic_view/stac_dynamic_view.dart b/packages/stac_models/lib/widgets/dynamic_view/stac_dynamic_view.dart new file mode 100644 index 00000000..387e2793 --- /dev/null +++ b/packages/stac_models/lib/widgets/dynamic_view/stac_dynamic_view.dart @@ -0,0 +1,94 @@ +import 'package:json_annotation/json_annotation.dart'; +import 'package:stac_models/actions/network_request/stac_network_request.dart'; +import 'package:stac_models/core/stac_widget.dart'; + +part 'stac_dynamic_view.g.dart'; + +/// A Stac model for dynamically fetching data and rendering it using a template. +/// +/// This widget makes a network request based on the [request] configuration. +/// The fetched data, potentially targeted by [targetPath], is then used to +/// render the [template]. +/// The full response can be stored in the Stac context using [resultTarget]. +/// It also supports custom widgets for [loaderWidget], [emptyTemplate] (if data is empty), +/// and [errorWidget] states. +/// +/// ```dart +/// StacDynamicView( +/// request: StacNetworkRequest(url: 'https://api.example.com/data'), +/// template: StacText(data: 'Name: \${data.name}'), // Example: template uses data binding +/// targetPath: 'items', // Path to the list within the response +/// resultTarget: 'apiData', // Where to store the full response in context +/// loaderWidget: StacCircularProgressIndicator(), +/// emptyTemplate: StacText(data: 'No items found.'), +/// ) +/// ``` +/// +/// ```json +/// { +/// "type": "dynamicView", +/// "request": { +/// "url": "https://api.example.com/data", +/// "method": "GET" +/// }, +/// "template": { +/// "type": "text", +/// "data": "Name: \${data.name}" +/// }, +/// "targetPath": "items", +/// "resultTarget": "apiData", +/// "loaderWidget": { +/// "type": "circularProgressIndicator" +/// }, +/// "emptyTemplate": { +/// "type": "text", +/// "data": "No items found." +/// } +/// } +/// ``` +@JsonSerializable() +class StacDynamicView extends StacWidget { + /// Creates a [StacDynamicView] with the given properties. + const StacDynamicView({ + required this.request, + this.template, + this.targetPath, + this.resultTarget, + this.emptyTemplate, + this.loaderWidget, + this.errorWidget, + }); + + /// Configuration for the network request to fetch data. + final StacNetworkRequest request; + + /// Path within the fetched JSON data to find the actual content to be rendered. + final String? targetPath; + + /// The StacWidget template used to render the fetched data. + final StacWidget? template; + + /// Path in the Stac context where the full JSON response will be stored. + final String? resultTarget; + + /// Optional StacWidget to display if the fetched data is empty or null. + final StacWidget? emptyTemplate; + + /// Optional StacWidget to display while the network request is in progress. + final StacWidget? loaderWidget; + + /// Optional StacWidget to display if the network request fails. + final StacWidget? errorWidget; + + /// Widget type identifier. + @override + String get type => 'dynamicView'; + + /// Creates a [StacDynamicView] from a JSON map. + factory StacDynamicView.fromJson(Map json) => + _$StacDynamicViewFromJson(json); + + /// Converts this [StacDynamicView] instance to a JSON map. + @override + Map toJson() => _$StacDynamicViewToJson(this); +} diff --git a/packages/stac_models/lib/widgets/dynamic_view/stac_dynamic_view.g.dart b/packages/stac_models/lib/widgets/dynamic_view/stac_dynamic_view.g.dart new file mode 100644 index 00000000..3712ab82 --- /dev/null +++ b/packages/stac_models/lib/widgets/dynamic_view/stac_dynamic_view.g.dart @@ -0,0 +1,40 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'stac_dynamic_view.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +StacDynamicView _$StacDynamicViewFromJson(Map json) => + StacDynamicView( + request: StacNetworkRequest.fromJson( + json['request'] as Map, + ), + template: json['template'] == null + ? null + : StacWidget.fromJson(json['template'] as Map), + targetPath: json['targetPath'] as String?, + resultTarget: json['resultTarget'] as String?, + emptyTemplate: json['emptyTemplate'] == null + ? null + : StacWidget.fromJson(json['emptyTemplate'] as Map), + loaderWidget: json['loaderWidget'] == null + ? null + : StacWidget.fromJson(json['loaderWidget'] as Map), + errorWidget: json['errorWidget'] == null + ? null + : StacWidget.fromJson(json['errorWidget'] as Map), + ); + +Map _$StacDynamicViewToJson(StacDynamicView instance) => + { + 'request': instance.request.toJson(), + 'targetPath': instance.targetPath, + 'template': instance.template?.toJson(), + 'resultTarget': instance.resultTarget, + 'emptyTemplate': instance.emptyTemplate?.toJson(), + 'loaderWidget': instance.loaderWidget?.toJson(), + 'errorWidget': instance.errorWidget?.toJson(), + 'type': instance.type, + }; diff --git a/packages/stac_models/lib/widgets/widgets.dart b/packages/stac_models/lib/widgets/widgets.dart index b98d2b4c..799748eb 100644 --- a/packages/stac_models/lib/widgets/widgets.dart +++ b/packages/stac_models/lib/widgets/widgets.dart @@ -5,6 +5,7 @@ export 'center/stac_center.dart'; export 'column/stac_column.dart'; export 'container/stac_container.dart'; export 'divider/stac_divider.dart'; +export 'dynamic_view/stac_dynamic_view.dart'; export 'elevated_button/stac_elevated_button.dart'; export 'expanded/stac_expanded.dart'; export 'filled_button/stac_filled_button.dart'; From 348dbe92bb5a5a40d6cd6d38daee498efb970695 Mon Sep 17 00:00:00 2001 From: Mithul Nayagam Date: Fri, 8 Aug 2025 13:47:41 +0530 Subject: [PATCH 4/4] formatting --- .../stac_divider/stac_divider_parser.dart | 4 ++-- .../stac_dynamic_view_parser.dart | 23 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider_parser.dart index e7974928..eaa6eb98 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_divider/stac_divider_parser.dart @@ -3,6 +3,7 @@ import 'package:stac/src/utils/color_utils.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; import 'package:stac_models/widgets/divider/stac_divider.dart'; + class StacDividerParser extends StacParser { const StacDividerParser(); @@ -10,8 +11,7 @@ class StacDividerParser extends StacParser { String get type => WidgetType.divider.name; @override - StacDivider getModel(Map json) => - StacDivider.fromJson(json); + StacDivider getModel(Map json) => StacDivider.fromJson(json); @override Widget parse(BuildContext context, StacDivider model) { diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart index c54a38a1..d4188ea5 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart @@ -61,14 +61,14 @@ class StacDynamicViewParser extends StacParser { // Check if data is an empty list and we have an empty template if (_isEmptyList(data) && model.emptyTemplate != null) { Log.d("Data is empty list, using empty template"); - return model.emptyTemplate.parse(context) ?? - const SizedBox(); + return model.emptyTemplate.parse(context) ?? const SizedBox(); } // Prepare data for template based on resultTarget - final dataForTemplate = (model.resultTarget?.isNotEmpty ?? false) - ? {model.resultTarget: data} - : data; + final dataForTemplate = + (model.resultTarget?.isNotEmpty ?? false) + ? {model.resultTarget: data} + : data; // Apply the data to the template final renderedTemplate = _applyDataToTemplate( @@ -81,8 +81,7 @@ class StacDynamicViewParser extends StacParser { } } catch (e) { Log.e('Error parsing API response: $e'); - return model.errorWidget.parse(context) ?? - const SizedBox(); + return model.errorWidget.parse(context) ?? const SizedBox(); } } return const SizedBox(); @@ -162,7 +161,7 @@ class StacDynamicViewParser extends StacParser { String resultTarget, ) { // Deep copy template to avoid modifying the original - Map resolvedTemplateJson = currentTemplate.toJson(); + Map resolvedTemplateJson = currentTemplate.toJson(); // Check for list processing with itemTemplate if (resolvedTemplateJson.containsKey('itemTemplate')) { @@ -170,7 +169,7 @@ class StacDynamicViewParser extends StacParser { final String itemTemplateKey = 'itemTemplate'; // Ensure itemTemplateActual is correctly typed. final itemTemplateActual = - resolvedTemplateJson[itemTemplateKey] as Map; + resolvedTemplateJson[itemTemplateKey] as Map; if (resultTarget.isNotEmpty && data is Map && @@ -192,7 +191,8 @@ class StacDynamicViewParser extends StacParser { return resolvedTemplateJson; } - resolvedTemplateJson.remove(itemTemplateKey); // Remove from outer template structure + resolvedTemplateJson + .remove(itemTemplateKey); // Remove from outer template structure final processedChildItems = >[]; for (final singleRawItem in listForIteration) { @@ -214,7 +214,8 @@ class StacDynamicViewParser extends StacParser { resolvedTemplateJson['children'] = []; } if (resolvedTemplateJson['children'] is List) { - (resolvedTemplateJson['children'] as List).addAll(processedChildItems); + (resolvedTemplateJson['children'] as List) + .addAll(processedChildItems); } else { Log.w( "Template has 'children' but it's not a List. Overwriting with processed items.");