diff --git a/examples/mirai_gallery/assets/json/home_screen.json b/examples/mirai_gallery/assets/json/home_screen.json index d5ae51c4..45cd5df3 100644 --- a/examples/mirai_gallery/assets/json/home_screen.json +++ b/examples/mirai_gallery/assets/json/home_screen.json @@ -836,6 +836,37 @@ } } }, + { + "type": "listTile", + "leading": { + "type": "icon", + "iconType": "material", + "icon": "space_dashboard" + }, + "title": { + "type": "text", + "data": "Mirai Spacer", + "style": { + "fontSize": 21 + } + }, + "subtitle": { + "type": "text", + "data": "Creates an adjustable, empty spacer that can be used to tune the spacing between widgets in a Flex container.", + "style": { + "fontSize": 12 + } + }, + "isThreeLine": true, + "onTap": { + "actionType": "navigate", + "navigationStyle": "push", + "widgetJson": { + "type": "exampleScreen", + "assetPath": "assets/json/spacer_example.json" + } + } + }, { "type": "listTile", "leading": { diff --git a/examples/mirai_gallery/assets/json/spacer_example.json b/examples/mirai_gallery/assets/json/spacer_example.json new file mode 100644 index 00000000..bb5fa28d --- /dev/null +++ b/examples/mirai_gallery/assets/json/spacer_example.json @@ -0,0 +1,84 @@ +{ + "type": "scaffold", + "appBar": { + "type": "appBar", + "title": { + "type": "text", + "data": "Spacer" + } + }, + "body": { + "type": "padding", + "padding": { + "left": 20, + "right": 20, + "top": 20, + "bottom": 20 + }, + "child": { + "type": "column", + "children": [ + { + "type": "textField", + "keyboardType": "text", + "maxLines": 1, + "decoration": { + "hintText": "Enter your pin" + } + }, + { + "type": "spacer" + }, + { + "type": "row", + "children": [ + { + "type": "row", + "children": [ + { + "type": "text", + "data": "Forgot Pin", + "style": { + "fontSize": 17 + } + }, + { + "type": "icon", + "iconType": "material", + "icon": "keyboard_arrow_right", + "size": 24 + } + ] + }, + { + "type": "spacer" + }, + { + "type": "text", + "data": "Need help?", + "style": { + "fontSize": 17 + } + } + ] + }, + { + "type": "spacer", + "flex": 2 + }, + { + "type": "elevatedButton", + "child": { + "type": "text", + "data": "Submit" + }, + "style": { + "backgroundColor": "primary", + "foregroundColor": "#ffffff" + }, + "onPressed": {} + } + ] + } + } + } \ No newline at end of file diff --git a/packages/mirai/lib/src/framework/mirai.dart b/packages/mirai/lib/src/framework/mirai.dart index dfc4485e..d4892d7a 100644 --- a/packages/mirai/lib/src/framework/mirai.dart +++ b/packages/mirai/lib/src/framework/mirai.dart @@ -56,6 +56,7 @@ class Mirai { const MiraiCheckBoxWidgetParser(), const MiraiExpandedParser(), const MiraiFlexibleParser(), + const MiraiSpacerParser(), const MiraiSafeAreaParser(), const MiraiSwitchParser(), const MiraiAlignParser(), diff --git a/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.dart b/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.dart new file mode 100644 index 00000000..03bff161 --- /dev/null +++ b/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.dart @@ -0,0 +1,16 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +export 'package:mirai/src/parsers/mirai_spacer/mirai_spacer_parser.dart'; + +part 'mirai_spacer.freezed.dart'; +part 'mirai_spacer.g.dart'; + +@freezed +class MiraiSpacer with _$MiraiSpacer { + const factory MiraiSpacer({ + @Default(1) int flex, + }) = _MiraiSpacer; + + factory MiraiSpacer.fromJson(Map json) => + _$MiraiSpacerFromJson(json); +} diff --git a/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.freezed.dart b/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.freezed.dart new file mode 100644 index 00000000..931b1e44 --- /dev/null +++ b/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.freezed.dart @@ -0,0 +1,152 @@ +// 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 'mirai_spacer.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +MiraiSpacer _$MiraiSpacerFromJson(Map json) { + return _MiraiSpacer.fromJson(json); +} + +/// @nodoc +mixin _$MiraiSpacer { + int get flex => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $MiraiSpacerCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $MiraiSpacerCopyWith<$Res> { + factory $MiraiSpacerCopyWith( + MiraiSpacer value, $Res Function(MiraiSpacer) then) = + _$MiraiSpacerCopyWithImpl<$Res, MiraiSpacer>; + @useResult + $Res call({int flex}); +} + +/// @nodoc +class _$MiraiSpacerCopyWithImpl<$Res, $Val extends MiraiSpacer> + implements $MiraiSpacerCopyWith<$Res> { + _$MiraiSpacerCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? flex = null, + }) { + return _then(_value.copyWith( + flex: null == flex + ? _value.flex + : flex // ignore: cast_nullable_to_non_nullable + as int, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$MiraiSpacerImplCopyWith<$Res> + implements $MiraiSpacerCopyWith<$Res> { + factory _$$MiraiSpacerImplCopyWith( + _$MiraiSpacerImpl value, $Res Function(_$MiraiSpacerImpl) then) = + __$$MiraiSpacerImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int flex}); +} + +/// @nodoc +class __$$MiraiSpacerImplCopyWithImpl<$Res> + extends _$MiraiSpacerCopyWithImpl<$Res, _$MiraiSpacerImpl> + implements _$$MiraiSpacerImplCopyWith<$Res> { + __$$MiraiSpacerImplCopyWithImpl( + _$MiraiSpacerImpl _value, $Res Function(_$MiraiSpacerImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? flex = null, + }) { + return _then(_$MiraiSpacerImpl( + flex: null == flex + ? _value.flex + : flex // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$MiraiSpacerImpl implements _MiraiSpacer { + const _$MiraiSpacerImpl({this.flex = 1}); + + factory _$MiraiSpacerImpl.fromJson(Map json) => + _$$MiraiSpacerImplFromJson(json); + + @override + @JsonKey() + final int flex; + + @override + String toString() { + return 'MiraiSpacer(flex: $flex)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$MiraiSpacerImpl && + (identical(other.flex, flex) || other.flex == flex)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, flex); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$MiraiSpacerImplCopyWith<_$MiraiSpacerImpl> get copyWith => + __$$MiraiSpacerImplCopyWithImpl<_$MiraiSpacerImpl>(this, _$identity); + + @override + Map toJson() { + return _$$MiraiSpacerImplToJson( + this, + ); + } +} + +abstract class _MiraiSpacer implements MiraiSpacer { + const factory _MiraiSpacer({final int flex}) = _$MiraiSpacerImpl; + + factory _MiraiSpacer.fromJson(Map json) = + _$MiraiSpacerImpl.fromJson; + + @override + int get flex; + @override + @JsonKey(ignore: true) + _$$MiraiSpacerImplCopyWith<_$MiraiSpacerImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.g.dart b/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.g.dart new file mode 100644 index 00000000..07dca6e5 --- /dev/null +++ b/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer.g.dart @@ -0,0 +1,17 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'mirai_spacer.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$MiraiSpacerImpl _$$MiraiSpacerImplFromJson(Map json) => + _$MiraiSpacerImpl( + flex: (json['flex'] as num?)?.toInt() ?? 1, + ); + +Map _$$MiraiSpacerImplToJson(_$MiraiSpacerImpl instance) => + { + 'flex': instance.flex, + }; diff --git a/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer_parser.dart b/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer_parser.dart new file mode 100644 index 00000000..e7acd19f --- /dev/null +++ b/packages/mirai/lib/src/parsers/mirai_spacer/mirai_spacer_parser.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:mirai/src/parsers/mirai_spacer/mirai_spacer.dart'; +import 'package:mirai/src/utils/widget_type.dart'; +import 'package:mirai_framework/mirai_framework.dart'; + +class MiraiSpacerParser extends MiraiParser { + const MiraiSpacerParser(); + + @override + MiraiSpacer getModel(Map json) => MiraiSpacer.fromJson(json); + + @override + String get type => WidgetType.spacer.name; + + @override + Widget parse(BuildContext context, MiraiSpacer model) { + return Spacer(flex: model.flex); + } +} diff --git a/packages/mirai/lib/src/parsers/parsers.dart b/packages/mirai/lib/src/parsers/parsers.dart index 66f2a8f0..97fd4402 100644 --- a/packages/mirai/lib/src/parsers/parsers.dart +++ b/packages/mirai/lib/src/parsers/parsers.dart @@ -61,6 +61,7 @@ export 'package:mirai/src/parsers/mirai_scaffold/mirai_scaffold.dart'; export 'package:mirai/src/parsers/mirai_single_child_scroll_view/mirai_single_child_scroll_view.dart'; export 'package:mirai/src/parsers/mirai_size/mirai_size.dart'; export 'package:mirai/src/parsers/mirai_sized_box/mirai_sized_box.dart'; +export 'package:mirai/src/parsers/mirai_spacer/mirai_spacer.dart'; export 'package:mirai/src/parsers/mirai_stack/mirai_stack.dart'; export 'package:mirai/src/parsers/mirai_switch/mirai_switch.dart'; export 'package:mirai/src/parsers/mirai_tab/mirai_tab.dart'; diff --git a/packages/mirai/lib/src/utils/widget_type.dart b/packages/mirai/lib/src/utils/widget_type.dart index d27c5716..0f9a4785 100644 --- a/packages/mirai/lib/src/utils/widget_type.dart +++ b/packages/mirai/lib/src/utils/widget_type.dart @@ -35,6 +35,7 @@ enum WidgetType { checkBox, expanded, flexible, + spacer, safeArea, align, pageView,