Commit cfebf8e3 by Rizal Hermawan

feat (init): create flutter widget parser package for flutter app development. Story #3

parents
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
# .packages
.pub-cache/
.pub/
build/
# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: b1395592de68cc8ac4522094ae59956dd21a91db
channel: stable
project_type: package
# This file is deprecated. Tools should instead consume
# `.dart_tools/package_config.json`.
#
# For more info see: https://dart.dev/go/dot-packages-deprecation
#
# Generated by pub on 2021-06-02 13:49:54.018368.
async:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/async-2.5.0/lib/
boolean_selector:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/
characters:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/characters-1.1.0/lib/
charcode:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/
clock:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/
collection:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/
cupertino_icons:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.2/lib/
fake_async:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/
flutter:file:///D:/flutter/2.0.4-stable/packages/flutter/lib/
flutter_test:file:///D:/flutter/2.0.4-stable/packages/flutter_test/lib/
font_awesome_flutter:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/font_awesome_flutter-9.0.0/lib/
llswidget:../llswidget/lib/
matcher:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/
meta:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/
path:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/
sky_engine:file:///D:/flutter/2.0.4-stable/bin/cache/pkg/sky_engine/lib/
source_span:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.0/lib/
stack_trace:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/
stream_channel:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/
string_scanner:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/
term_glyph:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/
test_api:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.19/lib/
typed_data:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/
vector_math:file:///D:/flutter/2.0.4-stable/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.0/lib/
widgetparser:lib/
{
"dart.flutterSdkPath": "D:\\flutter\\2.0.4-stable\\bin"
}
\ No newline at end of file
## 0.0.1 - 2021-06-02
### feat (init): create flutter widget parser package for flutter app development.
* add some flutter and lls widgets parser
\ No newline at end of file
TODO: Add your license here.
# widgetparser
A new Flutter package project.
## Getting Started
This project is a starting point for a Dart
[package](https://flutter.dev/developing-packages/),
a library module containing code that can be shared easily across
multiple Flutter or Dart projects.
For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
import 'dart:math';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
enum DropCapMode {
/// default
inside,
upwards,
aside,
/// Does not support dropCapPadding, indentation, dropCapPosition and custom dropCap.
/// Try using DropCapMode.upwards in combination with dropCapPadding and forceNoDescent=true
baseline
}
enum DropCapPosition {
start,
end,
}
class DropCap extends StatelessWidget {
final Widget? child;
final double width, height;
DropCap({
Key? key,
this.child,
required this.width,
required this.height,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return SizedBox(child: child, width: width, height: height);
}
}
class DropCapText extends StatelessWidget {
final String data;
final bool? selectable;
final DropCapMode? mode;
final TextStyle? style, dropCapStyle;
final TextAlign textAlign;
final DropCap? dropCap;
final EdgeInsets? dropCapPadding;
final Offset indentation;
final bool? forceNoDescent, parseInlineMarkdown;
final TextDirection textDirection;
final DropCapPosition? dropCapPosition;
final int? dropCapChars;
final int? maxLines;
final TextOverflow? overflow;
DropCapText(
{Key? key,
required this.data,
this.selectable,
this.mode,
this.style,
this.dropCapStyle,
this.textAlign = TextAlign.start,
this.dropCap,
this.dropCapPadding = EdgeInsets.zero,
this.indentation = Offset.zero,
this.dropCapChars = 1,
this.forceNoDescent = false,
this.parseInlineMarkdown = false,
this.textDirection = TextDirection.ltr,
this.overflow,
this.maxLines,
this.dropCapPosition})
: super(key: key);
@override
Widget build(BuildContext context) {
TextStyle textStyle = TextStyle(
color: Theme.of(context).textTheme.bodyText2!.color,
fontSize: Theme.of(context).textTheme.bodyText2!.fontSize,
height: Theme.of(context).textTheme.bodyText2!.height,
fontFamily: Theme.of(context).textTheme.bodyText2!.fontFamily,
).merge(style);
if (data == '')
return selectable!
? SelectableText(data, style: textStyle)
: Text(data, style: textStyle);
TextStyle capStyle = TextStyle(
color: textStyle.color,
fontSize: textStyle.fontSize! * 5.5,
fontFamily: textStyle.fontFamily,
fontWeight: textStyle.fontWeight,
fontStyle: textStyle.fontStyle,
height: 1,
).merge(dropCapStyle);
double capWidth, capHeight;
int? dropCapChars = dropCap != null ? 0 : this.dropCapChars;
CrossAxisAlignment sideCrossAxisAlignment = CrossAxisAlignment.start;
MarkdownParser? mdData = parseInlineMarkdown! ? MarkdownParser(data) : null;
final String dropCapStr =
(mdData?.plainText ?? data).substring(0, dropCapChars);
if (mode == DropCapMode.baseline && dropCap == null)
return _buildBaseline(context, textStyle, capStyle);
// custom DropCap
if (dropCap != null) {
capWidth = dropCap!.width;
capHeight = dropCap!.height;
} else {
TextPainter capPainter = TextPainter(
text: TextSpan(
text: dropCapStr,
style: capStyle,
),
textDirection: textDirection,
);
capPainter.layout();
capWidth = capPainter.width;
capHeight = capPainter.height;
if (forceNoDescent!) {
List<LineMetrics> ls = capPainter.computeLineMetrics();
capHeight -=
ls.isNotEmpty ? ls[0].descent * 0.95 : capPainter.height * 0.2;
}
}
// compute drop cap padding
capWidth += dropCapPadding!.left + dropCapPadding!.right;
capHeight += dropCapPadding!.top + dropCapPadding!.bottom;
MarkdownParser? mdRest =
parseInlineMarkdown! ? mdData!.subchars(dropCapChars) : null;
String restData = data.substring(dropCapChars!);
TextSpan textSpan = TextSpan(
text: parseInlineMarkdown! ? null : restData,
children: parseInlineMarkdown! ? mdRest!.toTextSpanList() : null,
style: textStyle.apply(
fontSizeFactor: MediaQuery.of(context).textScaleFactor),
);
TextPainter textPainter = TextPainter(
textDirection: textDirection, text: textSpan, textAlign: textAlign);
double lineHeight = textPainter.preferredLineHeight;
int rows = ((capHeight - indentation.dy) / lineHeight).ceil();
// DROP CAP MODE - UPWARDS
if (mode == DropCapMode.upwards) {
rows = 1;
sideCrossAxisAlignment = CrossAxisAlignment.end;
}
// BUILDER
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
double boundsWidth = constraints.maxWidth - capWidth;
if (boundsWidth < 1) boundsWidth = 1;
int? charIndexEnd = data.length;
//int startMillis = new DateTime.now().millisecondsSinceEpoch;
if (rows > 0) {
textPainter.layout(maxWidth: boundsWidth);
double yPos = rows * lineHeight;
int charIndex =
textPainter.getPositionForOffset(Offset(0, yPos)).offset;
textPainter.maxLines = rows;
textPainter.layout(maxWidth: boundsWidth);
if (textPainter.didExceedMaxLines) charIndexEnd = charIndex;
} else {
charIndexEnd = dropCapChars;
}
//int totMillis = new DateTime.now().millisecondsSinceEpoch - startMillis;
// DROP CAP MODE - LEFT
if (mode == DropCapMode.aside) charIndexEnd = data.length;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
// Text(totMillis.toString() + ' ms'),
Row(
textDirection: dropCapPosition == null ||
dropCapPosition == DropCapPosition.start
? textDirection
: (textDirection == TextDirection.ltr
? TextDirection.rtl
: TextDirection.ltr),
crossAxisAlignment: sideCrossAxisAlignment,
children: <Widget>[
dropCap != null
? Padding(padding: dropCapPadding!, child: dropCap)
: Container(
width: capWidth,
height: capHeight,
padding: dropCapPadding,
child: selectable!
? SelectableText.rich(
TextSpan(
text: dropCapStr,
style: capStyle,
),
textAlign: textAlign,
textDirection: textDirection,
)
: Text.rich(
TextSpan(
text: dropCapStr,
style: capStyle,
),
textAlign: textAlign,
textDirection: textDirection,
),
),
Flexible(
child: Container(
padding: EdgeInsets.only(top: indentation.dy),
height: (lineHeight * min(maxLines ?? rows, rows)) +
indentation.dy,
child: selectable!
? SelectableText.rich(
textSpan,
maxLines: maxLines,
textAlign: textAlign,
textDirection: textDirection,
scrollPhysics: NeverScrollableScrollPhysics(),
)
: Text.rich(
textSpan,
maxLines: maxLines,
textAlign: textAlign,
textDirection: textDirection,
overflow: (maxLines == null ||
(maxLines! > rows &&
overflow == TextOverflow.fade))
? TextOverflow.clip
: overflow,
),
),
),
],
),
if (maxLines == null || maxLines! > rows)
Padding(
padding: EdgeInsets.only(left: indentation.dx),
child: selectable!
? SelectableText.rich(
TextSpan(
text: parseInlineMarkdown!
? null
: restData.substring(charIndexEnd),
children: parseInlineMarkdown!
? mdRest!.subchars(charIndexEnd).toTextSpanList()
: null,
style: textStyle.apply(
fontSizeFactor:
MediaQuery.of(context).textScaleFactor),
),
scrollPhysics: NeverScrollableScrollPhysics(),
maxLines: maxLines != null && maxLines! > rows
? maxLines! - rows
: null,
textAlign: textAlign,
textDirection: textDirection,
)
: Text.rich(
TextSpan(
text: parseInlineMarkdown!
? null
: restData.substring(charIndexEnd),
children: parseInlineMarkdown!
? mdRest!.subchars(charIndexEnd).toTextSpanList()
: null,
style: textStyle.apply(
fontSizeFactor:
MediaQuery.of(context).textScaleFactor),
),
overflow: overflow,
maxLines: maxLines != null && maxLines! > rows
? maxLines! - rows
: null,
textAlign: textAlign,
textDirection: textDirection,
),
),
],
);
});
}
_buildBaseline(
BuildContext context, TextStyle textStyle, TextStyle capStyle) {
MarkdownParser mdData = MarkdownParser(data);
return selectable!
? SelectableText.rich(
TextSpan(
style: textStyle,
children: <TextSpan>[
TextSpan(
text: mdData.plainText!.substring(0, dropCapChars),
style: capStyle.merge(TextStyle(height: 0)),
),
TextSpan(
children: mdData.subchars(dropCapChars).toTextSpanList(),
style: textStyle.apply(
fontSizeFactor: MediaQuery.of(context).textScaleFactor),
),
],
),
textAlign: textAlign,
)
: Text.rich(
TextSpan(
style: textStyle,
children: <TextSpan>[
TextSpan(
text: mdData.plainText!.substring(0, dropCapChars),
style: capStyle.merge(TextStyle(height: 0)),
),
TextSpan(
children: mdData.subchars(dropCapChars).toTextSpanList(),
style: textStyle.apply(
fontSizeFactor: MediaQuery.of(context).textScaleFactor),
),
],
),
textAlign: textAlign,
);
}
}
class MarkdownParser {
final String data;
late List<MarkdownSpan> spans;
String? plainText;
List<TextSpan> toTextSpanList() {
return spans.map((s) => s.toTextSpan()).toList();
}
MarkdownParser subchars(int? startIndex, [int? endIndex]) {
final List<MarkdownSpan> subspans = [];
int? skip = startIndex;
for (int s = 0; s < spans.length; s++) {
MarkdownSpan span = spans[s];
if (skip! <= 0) {
subspans.add(span);
} else if (span.text.length < skip) {
skip -= span.text.length;
} else {
subspans.add(
MarkdownSpan(
style: span.style,
markups: span.markups,
text: span.text.substring(skip, span.text.length),
),
);
skip = 0;
}
}
return MarkdownParser(
subspans
.asMap()
.map((int index, MarkdownSpan span) {
String markup = index > 0
? (span.markups.isNotEmpty ? span.markups[0].code : '')
: span.markups.map((m) => m.isActive ? m.code : '').join();
return MapEntry(index, '$markup${span.text}');
})
.values
.toList()
.join(),
);
}
MarkdownParser(this.data) {
plainText = '';
spans = [MarkdownSpan(text: '', markups: [], style: TextStyle())];
bool bold = false;
bool italic = false;
bool underline = false;
const String MARKUP_BOLD = '**';
const String MARKUP_ITALIC = '_';
const String MARKUP_UNDERLINE = '++';
addSpan(String markup, bool isOpening) {
final List<Markup> markups = [Markup(markup, isOpening)];
if (bold && markup != MARKUP_BOLD) markups.add(Markup(MARKUP_BOLD, true));
if (italic && markup != MARKUP_ITALIC)
markups.add(Markup(MARKUP_ITALIC, true));
if (underline && markup != MARKUP_UNDERLINE)
markups.add(Markup(MARKUP_UNDERLINE, true));
spans.add(
MarkdownSpan(
text: '',
markups: markups,
style: TextStyle(
fontWeight: bold ? FontWeight.bold : null,
fontStyle: italic ? FontStyle.italic : null,
decoration: underline ? TextDecoration.underline : null,
),
),
);
}
bool checkMarkup(int i, String markup) {
return data.substring(i, min(i + markup.length, data.length)) == markup;
}
for (int c = 0; c < data.length; c++) {
if (checkMarkup(c, MARKUP_BOLD)) {
bold = !bold;
addSpan(MARKUP_BOLD, bold);
c += MARKUP_BOLD.length - 1;
} else if (checkMarkup(c, MARKUP_ITALIC)) {
italic = !italic;
addSpan(MARKUP_ITALIC, italic);
c += MARKUP_ITALIC.length - 1;
} else if (checkMarkup(c, MARKUP_UNDERLINE)) {
underline = !underline;
addSpan(MARKUP_UNDERLINE, underline);
c += MARKUP_UNDERLINE.length - 1;
} else {
spans[spans.length - 1].text += data[c];
plainText = plainText ?? "" + data[c];
}
}
}
}
class MarkdownSpan {
final TextStyle style;
final List<Markup> markups;
String text;
TextSpan toTextSpan() => TextSpan(text: text, style: style);
MarkdownSpan({
required this.text,
required this.style,
required this.markups,
});
}
class Markup {
final String code;
final bool isActive;
Markup(this.code, this.isActive);
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class AlignWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Align(
alignment: map.containsKey("alignment")
? parseAlignment(map["alignment"])
: Alignment.center,
widthFactor: map.containsKey("widthFactor")
? map["widthFactor"]?.toDouble()
: null,
heightFactor: map.containsKey("heightFactor")
? map["heightFactor"]?.toDouble()
: null,
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "Align";
@override
Type get widgetType => Align;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/material.dart';
class AppBarWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
var appBarWidget = AppBar(
key: map.containsKey("key") ? createKeyForWidget(map["key"]) : null,
title: map.containsKey("title")
? WidgetParserBuilder.buildFromMap(
map["title"], buildContext, listener)
: null,
leading: map.containsKey("leading")
? WidgetParserBuilder.buildFromMap(
map["leading"], buildContext, listener)
: null,
actions: map.containsKey("actions")
? WidgetParserBuilder.buildWidgets(
map["actions"], buildContext, listener)
: null,
centerTitle:
map.containsKey("centerTitle") ? map["centerTitle"] as bool? : false,
backgroundColor: map.containsKey("backgroundColor")
? parseHexColor(map["backgroundColor"])
: null,
automaticallyImplyLeading: map.containsKey('automaticallyImplyLeading') ? map['automaticallyImplyLeading'] as bool : true,
elevation: map.containsKey('elevation') ? map['elevation'] : null,
foregroundColor: map.containsKey("foregroundColor")
? parseHexColor(map["foregroundColor"])
: null
);
return appBarWidget;
}
@override
String get widgetName => "AppBar";
@override
Type get widgetType => AppBar;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/widgets.dart';
class AspectRatioWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return AspectRatio(
aspectRatio: map["aspectRatio"]?.toDouble(),
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "AspectRatio";
@override
Type get widgetType => AspectRatio;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/widgets.dart';
class BaselineWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Baseline(
baseline: map["baseline"]?.toDouble(),
baselineType: map["baselineType"] == "alphabetic"
? TextBaseline.alphabetic
: TextBaseline.ideographic,
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "Baseline";
@override
Type get widgetType => Baseline;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/widgets.dart';
class CenterWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Center(
widthFactor: map.containsKey("widthFactor")
? map["widthFactor"]?.toDouble()
: null,
heightFactor: map.containsKey("heightFactor")
? map["heightFactor"]?.toDouble()
: null,
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "Center";
@override
Type get widgetType => Center;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class ClipRRectWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
var radius = map['borderRadius'].toString().split(",");
double topLeft = double.parse(radius[0]);
double topRight = double.parse(radius[1]);
double bottomLeft = double.parse(radius[2]);
double bottomRight = double.parse(radius[3]);
var clipBehaviorString = map['clipBehavior'];
return ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(topLeft),
topRight: Radius.circular(topRight),
bottomLeft: Radius.circular(bottomLeft),
bottomRight: Radius.circular(bottomRight)),
clipBehavior: parseClipBehavior(clipBehaviorString),
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "ClipRRect";
@override
Type get widgetType => ClipRRect;
}
\ No newline at end of file
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class ContainerWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
Alignment alignment = parseAlignment(map['alignment']);
Color? color = parseHexColor(map['color']);
BoxConstraints constraints = parseBoxConstraints(map['constraints']);
EdgeInsetsGeometry? margin = parseEdgeInsetsGeometry(map['margin']);
EdgeInsetsGeometry? padding = parseEdgeInsetsGeometry(map['padding']);
Map<String, dynamic>? childMap = map['child'];
Widget? child = childMap == null
? null
: WidgetParserBuilder.buildFromMap(childMap, buildContext, listener);
var containerWidget = Container(
alignment: alignment,
padding: padding,
color: color,
margin: margin,
width: map['width']?.toDouble(),
height: map['height']?.toDouble(),
constraints: constraints,
child: child,
decoration: map.containsKey('decoration') ? parseBoxDecoration(map['decoration']) : null,
);
return containerWidget;
}
@override
String get widgetName => "Container";
@override
Type get widgetType => Container;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/drop_cap_text.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/material.dart';
class DropCapTextParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return DropCapText(
data: map.containsKey('data') ? map['data'] : null,
selectable: map.containsKey('selectable') ? map['selectable'] : false,
mode: map.containsKey('mode')
? parseDropCapMode(map['mode'])
: DropCapMode.inside,
style: map.containsKey('style') ? parseTextStyle(map['style']) : null,
dropCapStyle: map.containsKey('dropCapStyle')
? parseTextStyle(map['dropCapStyle'])
: null,
textAlign: map.containsKey('textAlign')
? parseTextAlign(map['textAlign'])
: TextAlign.start,
dropCap: map.containsKey('dropCap')
? parseDropCap(map['dropCap'], buildContext, listener)
: null,
dropCapPadding: map.containsKey('dropCapPadding')
? parseEdgeInsetsGeometry(map['dropCapPadding']) as EdgeInsets?
: EdgeInsets.zero,
indentation: Offset.zero,
//todo: actually add this
dropCapChars: map.containsKey('dropCapChars') ? map['dropCapChars'] : 1,
forceNoDescent:
map.containsKey('forceNoDescent') ? map['forceNoDescent'] : false,
parseInlineMarkdown: map.containsKey('parseInlineMarkdown')
? map['parseInlineMarkdown']
: false,
textDirection: map.containsKey('textDirection')
? parseTextDirection(map['textDirection'])
: TextDirection.ltr,
overflow: map.containsKey('overflow')
? parseTextOverflow(map['overflow'])
: TextOverflow.clip,
maxLines: map.containsKey('maxLines') ? map['maxLines'] : null,
dropCapPosition: map.containsKey('dropCapPosition')
? parseDropCapPosition(map['dropCapPosition'])
: null,
);
}
@override
String get widgetName => "DropCapText";
@override
Type get widgetType => DropCapText;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/widgets.dart';
class ExpandedWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Expanded(
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener)!,
flex: map.containsKey("flex") ? map["flex"] : 1,
);
}
@override
String get widgetName => "Expanded";
@override
Type get widgetType => Expanded;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class FittedBoxWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return FittedBox(
alignment: map.containsKey("alignment")
? parseAlignment(map["alignment"])
: Alignment.center,
fit: map.containsKey("fit") ? parseBoxFit(map["fit"])! : BoxFit.contain,
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "FittedBox";
@override
Type get widgetType => FittedBox;
}
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
class GestureDetectorWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
var gestureDetectorWidget = GestureDetector(
key: map.containsKey('key') ? createKeyForWidget(map['key']) : null,
child: WidgetParserBuilder.buildFromMap(map['child'], buildContext, listener),
onTap: map.containsKey('onTap') ? () => listener!.run(buildContext, map['onTap']) : null,
onTapDown: map.containsKey('onTapDown') ? (TapDownDetails tapDownDetails) => listener!.run(buildContext, map['onTapDown']) : null,
onTapUp: map.containsKey('onTapUp') ? (TapUpDetails tapUpDetails) => listener!.run(buildContext, map['onTapUp']) : null,
onTapCancel: map.containsKey('onTapCancel') ? () => listener!.run(buildContext, map['onTapCancel']) : null,
onSecondaryTap: map.containsKey('onSecondaryTap') ? () => listener!.run(buildContext, map['onSecondaryTap']) : null,
);
return gestureDetectorWidget;
}
@override
String get widgetName => "GestureDetector";
@override
Type get widgetType => GestureDetector;
}
\ No newline at end of file
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/icons_helper.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/material.dart';
class IconWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Icon(
map.containsKey('data')
? getIconUsingPrefix(name: map['data'])
: Icons.android,
size: map.containsKey("size") ? map['size']?.toDouble() : null,
color: map.containsKey('color') ? parseHexColor(map['color']) : null,
semanticLabel:
map.containsKey('semanticLabel') ? map['semanticLabel'] : null,
textDirection: map.containsKey('textDirection')
? parseTextDirection(map['textDirection'])
: null,
);
}
@override
String get widgetName => "Icon";
@override
Type get widgetType => Icon;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/material.dart';
class IconButtonWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
EdgeInsets? padding = parseEdgeInsetsGeometry(map['padding']) as EdgeInsets;
return IconButton(
key: map.containsKey("key") ? createKeyForWidget(map["key"]) : null,
iconSize: map.containsKey('iconSize') ? map['iconSize'] : 24.0,
icon: WidgetParserBuilder.buildFromMap(map['icon'], buildContext, listener)!,
padding: map.containsKey('padding') ? padding : EdgeInsets.all(8.0),
color: map.containsKey('color') ? parseHexColor(map['color']) : null,
focusColor: map.containsKey('focusColor') ? parseHexColor(map['focusColor']) : null,
hoverColor: map.containsKey('hoverColor') ? parseHexColor(map['hoverColor']) : null,
alignment: parseAlignment(map['alignment']),
onPressed: () {
listener!.run(buildContext, map['onPressed']);
}
);
}
@override
String get widgetName => "IconButton";
@override
Type get widgetType => IconButton;
}
\ No newline at end of file
import 'dart:ui';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class AssetImageWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
String name = map['name'];
String? semanticLabel =
map.containsKey('semanticLabel') ? map['semanticLabel'] : null;
bool excludeFromSemantics = map.containsKey('excludeFromSemantics')
? map['excludeFromSemantics']
: false;
double? scale = map.containsKey("scale") ? map['scale']?.toDouble() : null;
double? width = map.containsKey('width') ? map['width']?.toDouble() : null;
double? height =
map.containsKey('height') ? map['height']?.toDouble() : null;
Color? color = map.containsKey('color') ? parseHexColor(map['color']) : null;
BlendMode? blendMode =
map.containsKey('blendMode') ? parseBlendMode(map['blendMode']) : null;
BoxFit? boxFit =
map.containsKey('boxFit') ? parseBoxFit(map['boxFit']) : null;
Alignment alignment = map.containsKey('alignment')
? parseAlignment(map['alignment'])
: Alignment.center;
ImageRepeat repeat = map.containsKey('repeat')
? parseImageRepeat(map['repeat'])!
: ImageRepeat.noRepeat;
Rect? centerSlice =
map.containsKey('centerSlice') ? parseRect(map['centerSlice']) : null;
bool matchTextDirection = map.containsKey('matchTextDirection')
? map['matchTextDirection']
: false;
bool gaplessPlayback =
map.containsKey('gaplessPlayback') ? map['gaplessPlayback'] : false;
FilterQuality filterQuality = map.containsKey('filterQuality')
? parseFilterQuality(map['filterQuality'])!
: FilterQuality.low;
var widget = Image.asset(
name,
semanticLabel: semanticLabel,
excludeFromSemantics: excludeFromSemantics,
scale: scale,
width: width,
height: height,
color: color,
colorBlendMode: blendMode,
fit: boxFit,
alignment: alignment,
repeat: repeat,
centerSlice: centerSlice,
matchTextDirection: matchTextDirection,
gaplessPlayback: gaplessPlayback,
filterQuality: filterQuality,
);
return widget;
}
@override
String get widgetName => "AssetImage";
@override
Type get widgetType => AssetImage;
}
class NetworkImageWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
String src = map['src'];
String? semanticLabel =
map.containsKey('semanticLabel') ? map['semanticLabel'] : null;
bool excludeFromSemantics = map.containsKey('excludeFromSemantics')
? map['excludeFromSemantics']
: false;
double scale = map.containsKey("scale") ? map['scale']?.toDouble() : 1.0;
double? width = map.containsKey('width') ? map['width']?.toDouble() : null;
double? height =
map.containsKey('height') ? map['height']?.toDouble() : null;
Color? color = map.containsKey('color') ? parseHexColor(map['color']) : null;
BlendMode? blendMode =
map.containsKey('blendMode') ? parseBlendMode(map['blendMode']) : null;
BoxFit? boxFit =
map.containsKey('boxFit') ? parseBoxFit(map['boxFit']) : null;
Alignment alignment = map.containsKey('alignment')
? parseAlignment(map['alignment'])
: Alignment.center;
ImageRepeat repeat = map.containsKey('repeat')
? parseImageRepeat(map['repeat'])!
: ImageRepeat.noRepeat;
Rect? centerSlice =
map.containsKey('centerSlice') ? parseRect(map['centerSlice']) : null;
bool matchTextDirection = map.containsKey('matchTextDirection')
? map['matchTextDirection']
: false;
bool gaplessPlayback =
map.containsKey('gaplessPlayback') ? map['gaplessPlayback'] : false;
FilterQuality filterQuality = map.containsKey('filterQuality')
? parseFilterQuality(map['filterQuality'])!
: FilterQuality.low;
var widget = Image.network(
src,
semanticLabel: semanticLabel,
excludeFromSemantics: excludeFromSemantics,
scale: scale,
width: width,
height: height,
color: color,
colorBlendMode: blendMode,
fit: boxFit,
alignment: alignment,
repeat: repeat,
centerSlice: centerSlice,
matchTextDirection: matchTextDirection,
gaplessPlayback: gaplessPlayback,
filterQuality: filterQuality,
);
return widget;
}
@override
String get widgetName => "ImageNetwork";
@override
Type get widgetType => NetworkImage;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class IndexedStackWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return IndexedStack(
index: map.containsKey("index") ? map["index"] : 0,
alignment: map.containsKey("alignment")
? parseAlignment(map["alignment"])
: AlignmentDirectional.topStart,
textDirection: map.containsKey("textDirection")
? parseTextDirection(map["textDirection"])
: null,
children: WidgetParserBuilder.buildWidgets(
map['children'], buildContext, listener),
);
}
@override
String get widgetName => "IndexedStack";
@override
Type get widgetType => IndexedStack;
}
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
class InkWellWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return InkWell(
key: map.containsKey('key') ? createKeyForWidget(map['key']) : null,
child: WidgetParserBuilder.buildFromMap(map['child'], buildContext, listener),
onTap: map.containsKey('onTap') ? () => listener!.run(buildContext, map['onTap']) : null,
onTapDown: map.containsKey('onTapDown') ? (TapDownDetails tapDownDetails) => listener!.run(buildContext, map['onTapDown']) : null,
onTapCancel: map.containsKey('onTapCancel') ? () => listener!.run(buildContext, map['onTapCancel']) : null
);
}
@override
String get widgetName => "InkWell";
@override
Type get widgetType => InkWell;
}
\ No newline at end of file
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/material.dart';
class LimitedBoxWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return LimitedBox(
maxWidth: map.containsKey("maxWidth") ? map['maxWidth'] : double.infinity,
maxHeight:
map.containsKey("maxHeight") ? map['maxHeight'] : double.infinity,
child: WidgetParserBuilder.buildFromMap(
map['child'], buildContext, listener),
);
}
@override
String get widgetName => "LimitedBox";
@override
Type get widgetType => LimitedBox;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import '../utils.dart';
class ListTileWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
bool isThreeLine =
map.containsKey("isThreeLine") ? map["isThreeLine"] : false;
EdgeInsetsGeometry? contentPadding = map.containsKey("contentPadding")
? parseEdgeInsetsGeometry(map["contentPadding"])
: null;
bool? dense = map.containsKey("dense") ? map["dense"] : false;
bool enabled = map.containsKey("enabled") ? map["enabled"] : true;
Widget? leading = map.containsKey("leading")
? WidgetParserBuilder.buildFromMap(
map["leading"], buildContext, listener)
: null;
bool selected = map.containsKey("selected") ? map["selected"] : false;
Widget? subtitle = map.containsKey("subtitle")
? WidgetParserBuilder.buildFromMap(
map["subtitle"], buildContext, listener)
: null;
Widget? title = map.containsKey("title")
? WidgetParserBuilder.buildFromMap(
map["title"], buildContext, listener)
: null;
Widget? trailing = map.containsKey("trailing")
? WidgetParserBuilder.buildFromMap(
map["trailing"], buildContext, listener)
: null;
// String? tapEvent = map.containsKey("tapEvent") ? map["tapEvent"] : null;
return ListTile(
isThreeLine: isThreeLine,
leading: leading,
title: title,
subtitle: subtitle,
trailing: trailing,
dense: dense,
contentPadding: contentPadding,
enabled: enabled,
// onTap: () {
// if (listener != null && tapEvent != null) {
// listener.onTap(tapEvent);
// }
// },
selected: selected,
);
}
@override
String get widgetName => "ListTile";
@override
Type get widgetType => ListTile;
}
import 'dart:convert';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class ListViewWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
var scrollDirection = Axis.vertical;
if (map.containsKey("scrollDirection") &&
"horizontal" == map["scrollDirection"]) {
scrollDirection = Axis.horizontal;
}
var reverse = map.containsKey("reverse") ? map['reverse'] : false;
var shrinkWrap = map.containsKey("shrinkWrap") ? map["shrinkWrap"] : false;
var cacheExtent =
map.containsKey("cacheExtent") ? map["cacheExtent"]?.toDouble() : 0.0;
var padding = map.containsKey('padding')
? parseEdgeInsetsGeometry(map['padding'])
: null;
var itemExtent =
map.containsKey("itemExtent") ? map["itemExtent"]?.toDouble() : null;
var children = WidgetParserBuilder.buildWidgets(
map['children'], buildContext, listener);
return ListView(
scrollDirection: scrollDirection,
reverse: reverse,
shrinkWrap: shrinkWrap,
cacheExtent: cacheExtent,
padding: padding,
itemExtent: itemExtent,
children: children,);
}
@override
String get widgetName => "ListView";
@override
Type get widgetType => ListView;
}
\ No newline at end of file
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/cupertino.dart';
class OffstageWidgetParser extends WidgetParser{
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Offstage(
offstage: map.containsKey("offstage")?map['offstage']:true,
child: WidgetParserBuilder.buildFromMap(map['child'], buildContext, listener),
);
}
@override
String get widgetName => "Offstage";
@override
Type get widgetType => Offstage;
}
\ No newline at end of file
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/widgets.dart';
class OpacityWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Opacity(
opacity: map["opacity"]?.toDouble(),
alwaysIncludeSemantics: map.containsKey("alwaysIncludeSemantics")
? map["alwaysIncludeSemantics"]
: false,
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "Opacity";
@override
Type get widgetType => Opacity;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/cupertino.dart';
class OverflowBoxWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return OverflowBox(
alignment: parseAlignment(map['alignment']),
minWidth: map.containsKey("minWidth")?map['minWidth']:null,
maxWidth: map.containsKey("maxWidth")?map['maxWidth']:null,
minHeight: map.containsKey("minHeight")?map['minHeight']:null,
maxHeight: map.containsKey("maxHeight")?map['maxHeight']:null,
child: WidgetParserBuilder.buildFromMap(map['child'], buildContext, listener),
);
}
@override
String get widgetName => "OverflowBox";
@override
Type get widgetType => OverflowBox;
}
\ No newline at end of file
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class PaddingWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Padding(
padding: map.containsKey("padding")
? parseEdgeInsetsGeometry(map["padding"])!
: EdgeInsets.zero,
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "Padding";
@override
Type get widgetType => Padding;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/widgets.dart';
class PageViewWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
var scrollDirection = Axis.vertical;
if (map.containsKey("scrollDirection") &&
"horizontal" == map["scrollDirection"]) {
scrollDirection = Axis.horizontal;
}
return PageView(
scrollDirection: scrollDirection,
reverse: map.containsKey("reverse") ? map["reverse"] : false,
pageSnapping:
map.containsKey("pageSnapping") ? map["pageSnapping"] : true,
children: WidgetParserBuilder.buildWidgets(
map['children'], buildContext, listener),
);
}
@override
String get widgetName => "PageView";
@override
Type get widgetType => PageView;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class PlaceholderWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Placeholder(
color: map.containsKey('color')
? parseHexColor(map['color'])!
: const Color(0xFF455A64),
strokeWidth:
map.containsKey('strokeWidth') ? map['strokeWidth']?.toDouble() : 2.0,
fallbackWidth: map.containsKey('fallbackWidth')
? map['fallbackWidth']?.toDouble()
: 400.0,
fallbackHeight: map.containsKey('fallbackHeight')
? map['fallbackHeight']?.toDouble()
: 400.0,
);
}
@override
String get widgetName => "Placeholder";
@override
Type get widgetType => Placeholder;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class RowWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Row(
crossAxisAlignment: map.containsKey('crossAxisAlignment')
? parseCrossAxisAlignment(map['crossAxisAlignment'])
: CrossAxisAlignment.center,
mainAxisAlignment: map.containsKey('mainAxisAlignment')
? parseMainAxisAlignment(map['mainAxisAlignment'])
: MainAxisAlignment.start,
mainAxisSize: map.containsKey('mainAxisSize')
? parseMainAxisSize(map['mainAxisSize'])
: MainAxisSize.max,
textBaseline: map.containsKey('textBaseline')
? parseTextBaseline(map['textBaseline'])
: null,
textDirection: map.containsKey('textDirection')
? parseTextDirection(map['textDirection'])
: null,
verticalDirection: map.containsKey('verticalDirection')
? parseVerticalDirection(map['verticalDirection'])
: VerticalDirection.down,
children: WidgetParserBuilder.buildWidgets(
map['children'], buildContext, listener),
);
}
@override
String get widgetName => "Row";
@override
Type get widgetType => Row;
}
class ColumnWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Column(
crossAxisAlignment: map.containsKey('crossAxisAlignment')
? parseCrossAxisAlignment(map['crossAxisAlignment'])
: CrossAxisAlignment.center,
mainAxisAlignment: map.containsKey('mainAxisAlignment')
? parseMainAxisAlignment(map['mainAxisAlignment'])
: MainAxisAlignment.start,
mainAxisSize: map.containsKey('mainAxisSize')
? parseMainAxisSize(map['mainAxisSize'])
: MainAxisSize.max,
textBaseline: map.containsKey('textBaseline')
? parseTextBaseline(map['textBaseline'])
: null,
textDirection: map.containsKey('textDirection')
? parseTextDirection(map['textDirection'])
: null,
verticalDirection: map.containsKey('verticalDirection')
? parseVerticalDirection(map['verticalDirection'])
: VerticalDirection.down,
children: WidgetParserBuilder.buildWidgets(
map['children'], buildContext, listener),
);
}
@override
String get widgetName => "Column";
@override
Type get widgetType => Column;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class SafeAreaWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
var left = map.containsKey("left") ? map["left"] : true;
var right = map.containsKey("right") ? map["right"] : true;
var top = map.containsKey("top") ? map["top"] : true;
var bottom = map.containsKey("bottom") ? map["bottom"] : true;
var edgeInsets = map.containsKey("minimum")
? parseEdgeInsetsGeometry(map['minimum'])!
: EdgeInsets.zero;
var maintainBottomViewPadding = map.containsKey("maintainBottomViewPadding")
? map["maintainBottomViewPadding"]
: false;
return SafeArea(
left: left,
right: right,
top: top,
bottom: bottom,
minimum: edgeInsets as EdgeInsets,
maintainBottomViewPadding: maintainBottomViewPadding,
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener)!,
);
}
@override
String get widgetName => "SafeArea";
@override
Type get widgetType => SafeArea;
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class ScaffoldWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
var scaffoldWidget = Scaffold(
key: map.containsKey("key") ? createKeyForWidget(map["key"]) : null,
appBar: map.containsKey("appBar")
? WidgetParserBuilder.buildFromMap(
map["appBar"], buildContext, listener) as PreferredSizeWidget?
: null,
body: map.containsKey("body")
? WidgetParserBuilder.buildFromMap(
map["body"], buildContext, listener)
: null,
floatingActionButton: map.containsKey("floatingActionButton")
? WidgetParserBuilder.buildFromMap(
map["floatingActionButton"], buildContext, listener)
: null,
backgroundColor: map.containsKey("backgroundColor")
? parseHexColor(map["backgroundColor"])
: null,
persistentFooterButtons: map.containsKey("persistentFooterButtons")
? WidgetParserBuilder.buildWidgets(
map["persistentFooterButtons"], buildContext, listener)
: null,
);
return scaffoldWidget;
}
@override
String get widgetName => "Scaffold";
@override
Type get widgetType => Scaffold;
}
import 'package:flutter/gestures.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
// import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
class SelectableTextWidgetParser implements WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
String? data = map['data'];
String? textAlignString = map['textAlign'];
int? maxLines = map['maxLines'];
String? textDirectionString = map['textDirection'];
// double textScaleFactor = map['textScaleFactor'];
var textSpan;
var textSpanParser = SelectableTextSpanParser();
if (map.containsKey("textSpan")) {
textSpan = textSpanParser.parse(map['textSpan'], buildContext, listener);
}
if (textSpan == null) {
return SelectableText(
data!,
textAlign: parseTextAlign(textAlignString),
maxLines: maxLines,
textDirection: parseTextDirection(textDirectionString),
style: map.containsKey('style') ? parseTextStyle(map['style']) : null,
// textScaleFactor: textScaleFactor,
);
} else {
return SelectableText.rich(
textSpan,
textAlign: parseTextAlign(textAlignString),
maxLines: maxLines,
textDirection: parseTextDirection(textDirectionString),
style: map.containsKey('style') ? parseTextStyle(map['style']) : null,
// textScaleFactor: textScaleFactor,
);
}
}
@override
String get widgetName => "SelectableText";
@override
Type get widgetType => SelectableText;
}
class SelectableTextSpanParser {
TextSpan parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
Map<String, String>? recognizer = map.containsKey("recognizer") ? map['recognizer'] : null;
var textSpan = TextSpan(
text: map['text'],
style: parseTextStyle(map['style']),
recognizer: TapGestureRecognizer()
..onTap = () => listener!.run(buildContext, recognizer),
children: []);
if (map.containsKey('children')) {
parseChildren(textSpan, map['children'], buildContext, listener);
}
return textSpan;
}
void parseChildren(
TextSpan textSpan, List<dynamic> childrenSpan, BuildContext buildContext, MethodListener? listener) {
for (var childmap in childrenSpan) {
textSpan.children!.add(parse(childmap, buildContext, listener));
}
}
}
import 'package:widgetparser/widgetparser.dart';
import 'package:flutter/widgets.dart';
//Creates a box that will become as large as its parent allows.
class ExpandedSizedBoxWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return SizedBox.expand(
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "ExpandedSizedBox";
@override
Type get widgetType => UnimplementedType;
}
class SizedBoxWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return SizedBox(
width: map["width"],
height: map["height"],
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener),
);
}
@override
String get widgetName => "SizedBox";
@override
Type get widgetType => SizedBox;
}
class UnimplementedType {}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class PositionedWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Positioned(
child: WidgetParserBuilder.buildFromMap(
map["child"], buildContext, listener)!,
top: map.containsKey("top") ? map["top"]?.toDouble() : null,
right: map.containsKey("right") ? map["right"]?.toDouble() : null,
bottom: map.containsKey("bottom") ? map["bottom"]?.toDouble() : null,
left: map.containsKey("left") ? map["left"]?.toDouble() : null,
width: map.containsKey("width") ? map["width"]?.toDouble() : null,
height: map.containsKey("height") ? map["height"]?.toDouble() : null,
);
}
@override
String get widgetName => "Positioned";
@override
Type get widgetType => Positioned;
}
class StackWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Stack(
alignment: map.containsKey("alignment")
? parseAlignment(map["alignment"])
: AlignmentDirectional.topStart,
textDirection: map.containsKey("textDirection")
? parseTextDirection(map["textDirection"])
: null,
fit: map.containsKey("fit") ? parseStackFit(map["fit"])! : StackFit.loose,
clipBehavior: map.containsKey("clipBehavior")
? parseClip(map["clipBehavior"])!
: Clip.hardEdge,
children: WidgetParserBuilder.buildWidgets(
map['children'], buildContext, listener),
);
}
@override
String get widgetName => "Stack";
@override
Type get widgetType => Stack;
}
import 'package:flutter/gestures.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
// import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
class TextWidgetParser implements WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
String? data = map['data'];
String? textAlignString = map['textAlign'];
String? overflow = map['overflow'];
int? maxLines = map['maxLines'];
String? semanticsLabel = map['semanticsLabel'];
bool? softWrap = map['softWrap'];
String? textDirectionString = map['textDirection'];
double? textScaleFactor = map['textScaleFactor']?.toDouble();
var textSpan;
var textSpanParser = TextSpanParser();
if (map.containsKey("textSpan")) {
textSpan = textSpanParser.parse(map['textSpan'], buildContext, listener);
}
if (textSpan == null) {
return Text(
data!,
textAlign: parseTextAlign(textAlignString),
overflow: parseTextOverflow(overflow),
maxLines: maxLines,
semanticsLabel: semanticsLabel,
softWrap: softWrap,
textDirection: parseTextDirection(textDirectionString),
style: map.containsKey('style') ? parseTextStyle(map['style']) : null,
textScaleFactor: textScaleFactor,
);
} else {
return Text.rich(
textSpan,
textAlign: parseTextAlign(textAlignString),
overflow: parseTextOverflow(overflow),
maxLines: maxLines,
semanticsLabel: semanticsLabel,
softWrap: softWrap,
textDirection: parseTextDirection(textDirectionString),
style: map.containsKey('style') ? parseTextStyle(map['style']) : null,
textScaleFactor: textScaleFactor,
);
}
}
@override
String get widgetName => "Text";
@override
Type get widgetType => Text;
}
class TextSpanParser {
TextSpan parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
Map<String, String>? recognizer = map.containsKey("recognizer") ? map['recognizer'] : null;
var textSpan = TextSpan(
text: map['text'],
style: parseTextStyle(map['style']),
recognizer: TapGestureRecognizer()
..onTap = () => listener!.run(buildContext, recognizer),
children: []);
if (map.containsKey('children')) {
parseChildren(textSpan, map['children'], buildContext, listener);
}
return textSpan;
}
void parseChildren(
TextSpan textSpan, List<dynamic> childrenSpan, BuildContext buildContext, MethodListener? listener) {
for (var childmap in childrenSpan) {
textSpan.children!.add(parse(childmap, buildContext, listener));
}
}
}
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:flutter/widgets.dart';
class WrapWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return Wrap(
direction: map.containsKey("direction")
? parseAxis(map["direction"])
: Axis.horizontal,
alignment: map.containsKey("alignment")
? parseWrapAlignment(map["alignment"])
: WrapAlignment.start,
spacing: map.containsKey("spacing") ? map["spacing"]?.toDouble() : 0.0,
runAlignment: map.containsKey("runAlignment")
? parseWrapAlignment(map["runAlignment"])
: WrapAlignment.start,
runSpacing:
map.containsKey("runSpacing") ? map["runSpacing"]?.toDouble() : 0.0,
crossAxisAlignment: map.containsKey("crossAxisAlignment")
? parseWrapCrossAlignment(map["crossAxisAlignment"])
: WrapCrossAlignment.start,
textDirection: map.containsKey("textDirection")
? parseTextDirection(map["textDirection"])
: null,
verticalDirection: map.containsKey("verticalDirection")
? parseVerticalDirection(map["verticalDirection"])
: VerticalDirection.down,
children: WidgetParserBuilder.buildWidgets(
map['children'], buildContext, listener)
);
}
@override
String get widgetName => "Wrap";
@override
Type get widgetType => Wrap;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
import 'package:flutter/widgets.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:llswidget/llswidget.dart';
class LLSButtonWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return LLSButton(
key: map.containsKey("key") ? createKeyForWidget(map["key"]) : null,
onPressed: map.containsKey('onPressed') ? () => listener!.run(buildContext, map['onPressed']) : null,
onHighlightChanged: map.containsKey('onHighlightChanged') ? (bool value) => listener!.run(buildContext, map['onHighlightChanged']) : null,
textStyle: map.containsKey('textStyle') ? parseTextStyle(map['style']) : null,
boxShadow: map.containsKey('boxShadow') ? parseBoxShadow(map['boxShadow']) : null,
buttonBoxShadow: map.containsKey('buttonBoxShadow') ? map['buttonBoxShadow'] : null,
focusColor: map.containsKey('focusColor') ? parseHexColor(map['focusColor']) : null,
hoverColor: map.containsKey('hoverColor') ? parseHexColor(map['hoverColor']) : null,
highlightColor: map.containsKey('highlightColor') ? parseHexColor(map['highlightColor']) : null,
splashColor: map.containsKey('splashColor') ? parseHexColor(map['splashColor']) : null,
elevation: map.containsKey('elevation') ? map['elevation'] : 0.0,
focusElevation: map.containsKey('focusElevation') ? map['focusElevation'] : 4.0,
hoverElevation: map.containsKey('hoverElevation') ? map['hoverElevation'] : 4.0,
highlightElevation: map.containsKey('highlightElevation') ? map['highlightElevation'] : 1.0,
disabledElevation: map.containsKey('disabledElevation') ? map['disabledElevation'] : 0.0,
padding: map.containsKey('padding') ? parseEdgeInsetsGeometry(map['padding'])! : EdgeInsets.symmetric(horizontal: 8),
constraints: map.containsKey('constraints') ? parseBoxConstraints(map['constraints']) : null,
clipBehavior: parseClipBehavior(map['clipBehavior']),
focusNode: map.containsKey('focusNode') ? map['focusNode'] : null,
autofocus: map.containsKey('autofocus') ? map['autofocus'] as bool : false,
child: map.containsKey('child') ? WidgetParserBuilder.buildFromMap(map["child"], buildContext, listener) : SizedBox(),
type: map.containsKey('type') ? parseLLSButtonType(map['type']) : LLSButtonType.solid,
shape: map.containsKey('shape') ? parseLLSButtonShape(map['shape']) : LLSButtonShape.standard,
color: map.containsKey('color') ? parseHexColor(map['color'])! : LLSColors.PRIMARY,
textColor: map.containsKey('textColor') ? parseHexColor(map['textColor'])! : LLSColors.DARK,
position: map.containsKey('position') ? parseLLSPosition(map['position']) : LLSPosition.start,
size: map.containsKey('size') ? parseLLSSize(map['size']) : LLSSize.MEDIUM,
borderSide: map.containsKey('borderSide') ? parseBorderSide(map['borderSide']) : null,
text: map.containsKey('text') ? map['text'] : '',
icon: map.containsKey('icon') ? WidgetParserBuilder.buildFromMap(map['icon'], buildContext, listener) : null,
blockButton: map.containsKey('blockButton') ? map['blockButton'] as bool : null,
fullWidthButton: map.containsKey('fullWidthButton') ? map['fullWidthButton'] as bool : null,
onLongPress: map.containsKey('onLongPress') ? () => listener!.run(buildContext, map['onLongPress']) : null,
disabledColor: map.containsKey('disabledColor') ? parseHexColor(map['disabledColor']) : null,
disabledTextColor: map.containsKey('disabledTextColor') ? parseHexColor(map['disabledTextColor']) : null,
widthBorderOutline: map.containsKey('widthBorderOutline') ? map['widthBorderOutline'] : null,
);
}
@override
String get widgetName => "LLSButton";
@override
Type get widgetType => LLSButton;
}
import 'package:flutter/widgets.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:llswidget/llswidget.dart';
class LLSCardWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
EdgeInsets? margin = parseEdgeInsetsGeometry(map['margin']) as EdgeInsets;
return LLSCard(
key: map.containsKey('key') ? createKeyForWidget(map['key']) : null,
color: map.containsKey('color') ? parseHexColor(map['color'])! : LLSColors.WHITE,
elevation: map.containsKey('elevation') ? map['elevation'] : 0.0,
borderOnForeground: map['borderOnForeground'],
padding: map.containsKey('padding') ? parseEdgeInsetsGeometry(map['padding']) as EdgeInsets : EdgeInsets.symmetric(horizontal: 12, vertical: 8),
margin: margin,
clipBehavior: parseClipBehavior(map['clipBehavior']),
semanticContainer: map.containsKey('autofocus') ? map['autofocus'] as bool : null,
title: map.containsKey('title') ? WidgetParserBuilder.buildFromMap(map['title'], buildContext, listener) as LLSListTile : LLSListTile(),
content: map.containsKey('content') ? WidgetParserBuilder.buildFromMap(map['content'], buildContext, listener) : SizedBox(),
image: map.containsKey('image') ? WidgetParserBuilder.buildFromMap(map['image'], buildContext, listener) as Image : null,
showImage: map.containsKey('showImage') ? map['showImage'] as bool : false,
showOverlayImage: map.containsKey('showOverlayImage') ? map['showOverlayImage'] as bool : false,
// buttonBar: ,
imageOverlay: map.containsKey('imageOverlay') ? parseImageProvider(map['imageOverlay']) : null,
titlePosition: map.containsKey('titlePosition') ? parseLLSPosition(map['titlePosition']) : null,
border: map.containsKey('border') ? parseBorder(map['border']) : null,
boxFit: map.containsKey('boxFit') ? parseBoxFit(map['boxFit']) : null,
height: map.containsKey('height') ? map['height'] : 0.0,
);
}
@override
String get widgetName => "LLSCard";
@override
Type get widgetType => LLSCard;
}
\ No newline at end of file
import 'package:flutter/widgets.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:llswidget/llswidget.dart';
class LLSLabelWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return LLSLabel(
key: map.containsKey('key') ? createKeyForWidget(map['key']) : null,
type: parseLLSLabelType(map['type']),
child: map.containsKey('child') ? WidgetParserBuilder.buildFromMap(map['child'], buildContext, listener) : null,
text: map.containsKey('text') ? map['text'] : '',
icon: map.containsKey('icon') ? WidgetParserBuilder.buildFromMap(map['icon'], buildContext, listener) : null,
dividerBorderRadius: map.containsKey('dividerBorderRadius') ? parseBorderRadius(map['dividerBorderRadius']) : null,
textColor: map.containsKey('textColor') ? parseHexColor(map['textColor'])! : LLSColors.DARK,
dividerAlignment: map.containsKey('dividerAlignment') ? parseAlignment(map['dividerAlignment']) : null,
dividerColor: map.containsKey('dividerColor') ? parseHexColor(map['dividerColor'])! : LLSColors.LIGHT,
showDivider: map['showDivider'] as bool,
dividerWidth: map.containsKey('dividerWidth') ? map['dividerWidth'] : null,
backgroundImage: map.containsKey('backgroundImage') ? parseImageProvider(map['backgroundImage']) : null
);
}
@override
String get widgetName => "LLSLabel";
@override
Type get widgetType => LLSLabel;
}
\ No newline at end of file
import 'package:flutter/widgets.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/utils.dart';
import 'package:llswidget/llswidget.dart';
class LLSListTileWidgetParser extends WidgetParser {
@override
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener) {
return LLSListTile(
key: map.containsKey('key') ? createKeyForWidget(map['key']) : null,
titleText: map.containsKey('titleText') ? map['titleText'] : null,
subTitleText: map.containsKey('subTitleText') ? map['subTitleText'] : null,
color: map.containsKey('color') ? parseHexColor(map['color'])! : LLSColors.WHITE,
avatar: map.containsKey('avatar') ? WidgetParserBuilder.buildFromMap(map['avatar'], buildContext, listener) : null,
title: map.containsKey('title') ? WidgetParserBuilder.buildFromMap(map['title'], buildContext, listener) : null,
subTitle: map.containsKey('subTitle') ? WidgetParserBuilder.buildFromMap(map['subTitle'], buildContext, listener) : null,
description: map.containsKey('description') ? WidgetParserBuilder.buildFromMap(map['description'], buildContext, listener) : null,
icon: map.containsKey('icon') ? WidgetParserBuilder.buildFromMap(map['icon'], buildContext, listener) : null,
padding: map.containsKey('padding') ? parseEdgeInsetsGeometry(map['padding']) as EdgeInsets : EdgeInsets.all(8),
margin: map.containsKey('margin') ? parseEdgeInsetsGeometry(map['margin']) as EdgeInsets : EdgeInsets.symmetric(vertical: 8, horizontal: 16),
enabled: map.containsKey('enabled') ? map['enabled'] as bool : true,
onTap: map.containsKey('onTap') ? () => listener!.run(buildContext, map['onTap']) : null,
onLongPress: map.containsKey('onLongPress') ? () => listener!.run(buildContext, map['onLongPress']) : null,
selected: map.containsKey('selected') ? map['selected'] : false,
focusColor: map.containsKey('focusColor') ? parseHexColor(map['focusColor'])! : LLSColors.PRIMARY,
hoverColor: map.containsKey('hoverColor') ? parseHexColor(map['hoverColor'])! : LLSColors.PRIMARY,
focusNode: map.containsKey('focusNode') ? map['focusNode'] : null,
autofocus: map.containsKey('autofocus') ? map['autofocus'] as bool : false
);
}
@override
String get widgetName => "LLSListTile";
@override
Type get widgetType => LLSListTile;
}
\ No newline at end of file
import 'dart:io';
import 'dart:ui';
import 'package:llswidget/llswidget.dart';
import 'package:widgetparser/widgetparser.dart';
import 'package:widgetparser/src/drop_cap_text.dart';
import 'package:flutter/widgets.dart';
TextAlign parseTextAlign(String? textAlignString) {
//left the system decide
TextAlign textAlign = TextAlign.start;
switch (textAlignString) {
case "left":
textAlign = TextAlign.left;
break;
case "right":
textAlign = TextAlign.right;
break;
case "center":
textAlign = TextAlign.center;
break;
case "justify":
textAlign = TextAlign.justify;
break;
case "start":
textAlign = TextAlign.start;
break;
case "end":
textAlign = TextAlign.end;
break;
default:
textAlign = TextAlign.start;
}
return textAlign;
}
String exportTextAlign(TextAlign? textAlign) {
String rt = "start";
if (textAlign == TextAlign.left) {
rt = "left";
}
if (textAlign == TextAlign.right) {
rt = "right";
}
if (textAlign == TextAlign.center) {
rt = "center";
}
if (textAlign == TextAlign.justify) {
rt = "justify";
}
if (textAlign == TextAlign.start) {
rt = "start";
}
if (textAlign == TextAlign.end) {
rt = "end";
}
return rt;
}
TextOverflow parseTextOverflow(String? textOverflowString) {
TextOverflow textOverflow = TextOverflow.ellipsis;
switch (textOverflowString) {
case "ellipsis":
textOverflow = TextOverflow.ellipsis;
break;
case "clip":
textOverflow = TextOverflow.clip;
break;
case "fade":
textOverflow = TextOverflow.fade;
break;
default:
textOverflow = TextOverflow.fade;
}
return textOverflow;
}
String exportTextOverflow(TextOverflow? textOverflow) {
String rt = "ellipsis";
if (textOverflow == TextOverflow.clip) {
rt = "clip";
}
if (textOverflow == TextOverflow.fade) {
rt = "fade";
}
return rt;
}
TextDecoration parseTextDecoration(String? textDecorationString) {
TextDecoration textDecoration = TextDecoration.none;
switch (textDecorationString) {
case "lineThrough":
textDecoration = TextDecoration.lineThrough;
break;
case "overline":
textDecoration = TextDecoration.overline;
break;
case "underline":
textDecoration = TextDecoration.underline;
break;
case "none":
default:
textDecoration = TextDecoration.none;
}
return textDecoration;
}
String exportTextDecoration(TextDecoration? decoration) {
var rt = "none";
if (decoration == TextDecoration.lineThrough) {
rt = "lineThrough";
}
if (decoration == TextDecoration.overline) {
rt = "overline";
}
if (decoration == TextDecoration.underline) {
rt = "underline";
}
return rt;
}
TextDirection parseTextDirection(String? textDirectionString) {
TextDirection textDirection = TextDirection.ltr;
switch (textDirectionString) {
case 'ltr':
textDirection = TextDirection.ltr;
break;
case 'rtl':
textDirection = TextDirection.rtl;
break;
default:
textDirection = TextDirection.ltr;
}
return textDirection;
}
String exportTextDirection(TextDirection? textDirection) {
String rt = "ltr";
if (textDirection == TextDirection.rtl) {
rt = "rtl";
}
return rt;
}
FontWeight parseFontWeight(String? textFontWeight) {
FontWeight fontWeight = FontWeight.normal;
switch (textFontWeight) {
case 'w100':
fontWeight = FontWeight.w100;
break;
case 'w200':
fontWeight = FontWeight.w200;
break;
case 'w300':
fontWeight = FontWeight.w300;
break;
case 'normal':
case 'w400':
fontWeight = FontWeight.w400;
break;
case 'w500':
fontWeight = FontWeight.w500;
break;
case 'w600':
fontWeight = FontWeight.w600;
break;
case 'bold':
case 'w700':
fontWeight = FontWeight.w700;
break;
case 'w800':
fontWeight = FontWeight.w800;
break;
case 'w900':
fontWeight = FontWeight.w900;
break;
default:
fontWeight = FontWeight.normal;
}
return fontWeight;
}
String exportFontWeight(FontWeight? fontWeight) {
String rt = "normal";
if (fontWeight == FontWeight.w100) {
rt = "w100";
}
if (fontWeight == FontWeight.w200) {
rt = "w200";
}
if (fontWeight == FontWeight.w300) {
rt = "w300";
}
if (fontWeight == FontWeight.w400) {
rt = "w400";
}
if (fontWeight == FontWeight.w500) {
rt = "w500";
}
if (fontWeight == FontWeight.w600) {
rt = "w600";
}
if (fontWeight == FontWeight.w700) {
rt = "w700";
}
if (fontWeight == FontWeight.w800) {
rt = "w800";
}
if (fontWeight == FontWeight.w900) {
rt = "w900";
}
return rt;
}
Color? parseHexColor(String? hexColorString) {
if (hexColorString == null) {
return null;
}
if (hexColorString.contains(',')) {
List<String> hexColorArr = hexColorString.split(',');
if (hexColorArr.length == 3) {
if (hexColorArr[1] == 'withOpacity') {
return parseColor(hexColorArr[0]).withOpacity(double.parse(hexColorArr[2]));
}
return parseColor(hexColorArr[0]);
}
return parseColor(hexColorArr[0]);
}
return parseColor(hexColorString);
}
Color parseColor(String color) {
if (color.contains('#')) {
color = color.toUpperCase().replaceAll("#", "");
if (color.length == 6) {
color = "FF" + color;
}
int colorInt = int.parse(color, radix: 16);
return Color(colorInt);
} else {
if (color == 'lls_secondary') {
return LLSColors.SECONDARY;
} else if (color == 'lls_tertiary') {
return LLSColors.TERTIARY;
} else if (color == 'lls_success') {
return LLSColors.SUCCESS;
} else if (color == 'lls_info') {
return LLSColors.INFO;
} else if (color == 'lls_warning') {
return LLSColors.WARNING;
} else if (color == 'lls_danger') {
return LLSColors.DANGER;
} else if (color == 'lls_light') {
return LLSColors.LIGHT;
} else if (color == 'lls_dark') {
return LLSColors.DARK;
} else if (color == 'lls_white') {
return LLSColors.WHITE;
} else if (color == 'lls_focus') {
return LLSColors.FOCUS;
} else if (color == 'lls_alt') {
return LLSColors.ALT;
} else if (color == 'lls_transparent') {
return LLSColors.TRANSPARENT;
} else {
return LLSColors.PRIMARY;
}
}
}
TextStyle? parseTextStyle(Map<String, dynamic>? map) {
if (map == null) {
return null;
}
String? color = map['color'];
String? debugLabel = map['debugLabel'];
String? decoration = map['decoration'];
String? fontFamily = map['fontFamily'];
double? fontSize = map['fontSize']?.toDouble();
String? fontWeight = map['fontWeight'];
FontStyle fontStyle = 'italic' == map['fontStyle'] ? FontStyle.italic : FontStyle.normal;
return TextStyle(
color: parseHexColor(color),
debugLabel: debugLabel,
decoration: parseTextDecoration(decoration),
fontSize: fontSize,
fontFamily: fontFamily,
fontStyle: fontStyle,
fontWeight: parseFontWeight(fontWeight),
);
}
Alignment parseAlignment(String? alignmentString) {
Alignment alignment = Alignment.center;
switch (alignmentString) {
case 'topLeft':
alignment = Alignment.topLeft;
break;
case 'topCenter':
alignment = Alignment.topCenter;
break;
case 'topRight':
alignment = Alignment.topRight;
break;
case 'centerLeft':
alignment = Alignment.centerLeft;
break;
case 'center':
alignment = Alignment.center;
break;
case 'centerRight':
alignment = Alignment.centerRight;
break;
case 'bottomLeft':
alignment = Alignment.bottomLeft;
break;
case 'bottomCenter':
alignment = Alignment.bottomCenter;
break;
case 'bottomRight':
alignment = Alignment.bottomRight;
break;
}
return alignment;
}
const double infinity = 9999999999;
BoxConstraints parseBoxConstraints(Map<String, dynamic>? map) {
double minWidth = 0.0;
double maxWidth = double.infinity;
double minHeight = 0.0;
double maxHeight = double.infinity;
if (map != null) {
if (map.containsKey('minWidth')) {
var minWidthValue = map['minWidth']?.toDouble();
if (minWidthValue != null) {
if (minWidthValue >= infinity) {
minWidth = double.infinity;
} else {
minWidth = minWidthValue;
}
}
}
if (map.containsKey('maxWidth')) {
var maxWidthValue = map['maxWidth']?.toDouble();
if (maxWidthValue != null) {
if (maxWidthValue >= infinity) {
maxWidth = double.infinity;
} else {
maxWidth = maxWidthValue;
}
}
}
if (map.containsKey('minHeight')) {
var minHeightValue = map['minHeight']?.toDouble();
if (minHeightValue != null) {
if (minHeightValue >= infinity) {
minHeight = double.infinity;
} else {
minHeight = minHeightValue;
}
}
}
if (map.containsKey('maxHeight')) {
var maxHeightValue = map['maxHeight']?.toDouble();
if (maxHeightValue != null) {
if (maxHeightValue >= infinity) {
maxHeight = double.infinity;
} else {
maxHeight = maxHeightValue;
}
}
}
}
return BoxConstraints(
minWidth: minWidth,
maxWidth: maxWidth,
minHeight: minHeight,
maxHeight: maxHeight,
);
}
EdgeInsetsGeometry? parseEdgeInsetsGeometry(String? edgeInsetsGeometryString) {
//left,top,right,bottom
if (edgeInsetsGeometryString == null ||
edgeInsetsGeometryString.trim() == '') {
return null;
}
var values = edgeInsetsGeometryString.split(",");
return EdgeInsets.only(
left: double.parse(values[0]),
top: double.parse(values[1]),
right: double.parse(values[2]),
bottom: double.parse(values[3]));
}
CrossAxisAlignment parseCrossAxisAlignment(String? crossAxisAlignmentString) {
switch (crossAxisAlignmentString) {
case 'start':
return CrossAxisAlignment.start;
case 'end':
return CrossAxisAlignment.end;
case 'center':
return CrossAxisAlignment.center;
case 'stretch':
return CrossAxisAlignment.stretch;
case 'baseline':
return CrossAxisAlignment.baseline;
}
return CrossAxisAlignment.center;
}
String exportCrossAxisAlignment(CrossAxisAlignment crossAxisAlignment) {
String rt = "center";
if (crossAxisAlignment == CrossAxisAlignment.start) {
rt = "start";
}
if (crossAxisAlignment == CrossAxisAlignment.end) {
rt = "end";
}
if (crossAxisAlignment == CrossAxisAlignment.center) {
rt = "center";
}
if (crossAxisAlignment == CrossAxisAlignment.stretch) {
rt = "stretch";
}
if (crossAxisAlignment == CrossAxisAlignment.baseline) {
rt = "baseline";
}
return rt;
}
MainAxisAlignment parseMainAxisAlignment(String? mainAxisAlignmentString) {
switch (mainAxisAlignmentString) {
case 'start':
return MainAxisAlignment.start;
case 'end':
return MainAxisAlignment.end;
case 'center':
return MainAxisAlignment.center;
case 'spaceBetween':
return MainAxisAlignment.spaceBetween;
case 'spaceAround':
return MainAxisAlignment.spaceAround;
case 'spaceEvenly':
return MainAxisAlignment.spaceEvenly;
}
return MainAxisAlignment.start;
}
String exportMainAxisAlignment(MainAxisAlignment mainAxisAlignment) {
String rt = "start";
if (mainAxisAlignment == MainAxisAlignment.end) {
rt = "end";
} else if (mainAxisAlignment == MainAxisAlignment.center) {
rt = "center";
} else if (mainAxisAlignment == MainAxisAlignment.spaceBetween) {
rt = "spaceBetween";
} else if (mainAxisAlignment == MainAxisAlignment.spaceAround) {
rt = "spaceAround";
} else if (mainAxisAlignment == MainAxisAlignment.spaceEvenly) {
rt = "spaceEvenly";
}
return rt;
}
MainAxisSize parseMainAxisSize(String? mainAxisSizeString) =>
mainAxisSizeString == 'min' ? MainAxisSize.min : MainAxisSize.max;
TextBaseline parseTextBaseline(String? parseTextBaselineString) =>
'alphabetic' == parseTextBaselineString
? TextBaseline.alphabetic
: TextBaseline.ideographic;
VerticalDirection parseVerticalDirection(String? verticalDirectionString) =>
'up' == verticalDirectionString
? VerticalDirection.up
: VerticalDirection.down;
String? exportBlendMode(BlendMode? blendMode) {
if (blendMode == null) {
return null;
}
String rt = "srcIn";
if (blendMode == BlendMode.clear) {
rt = "clear";
}
if (blendMode == BlendMode.src) {
rt = "src";
}
if (blendMode == BlendMode.dst) {
rt = "dst";
}
if (blendMode == BlendMode.srcOver) {
rt = "srcOver";
}
if (blendMode == BlendMode.dstOver) {
rt = "dstOver";
}
if (blendMode == BlendMode.srcIn) {
rt = "srcIn";
}
if (blendMode == BlendMode.dstIn) {
rt = "dstIn";
}
if (blendMode == BlendMode.srcOut) {
rt = "srcOut";
}
if (blendMode == BlendMode.dstOut) {
rt = "dstOut";
}
if (blendMode == BlendMode.srcATop) {
rt = "srcATop";
}
if (blendMode == BlendMode.dstATop) {
rt = "dstATop";
}
if (blendMode == BlendMode.xor) {
rt = "xor";
}
if (blendMode == BlendMode.plus) {
rt = "plus";
}
if (blendMode == BlendMode.modulate) {
rt = "modulate";
}
if (blendMode == BlendMode.screen) {
rt = "screen";
}
if (blendMode == BlendMode.overlay) {
rt = "overlay";
}
if (blendMode == BlendMode.darken) {
rt = "darken";
}
if (blendMode == BlendMode.lighten) {
rt = "lighten";
}
if (blendMode == BlendMode.colorDodge) {
rt = "colorDodge";
}
if (blendMode == BlendMode.colorBurn) {
rt = "colorBurn";
}
if (blendMode == BlendMode.hardLight) {
rt = "hardLight";
}
if (blendMode == BlendMode.softLight) {
rt = "softLight";
}
if (blendMode == BlendMode.difference) {
rt = "difference";
}
if (blendMode == BlendMode.exclusion) {
rt = "exclusion";
}
if (blendMode == BlendMode.multiply) {
rt = "multiply";
}
if (blendMode == BlendMode.hue) {
rt = "hue";
}
if (blendMode == BlendMode.saturation) {
rt = "saturation";
}
if (blendMode == BlendMode.color) {
rt = "color";
}
if (blendMode == BlendMode.luminosity) {
rt = "luminosity";
}
return rt;
}
BlendMode? parseBlendMode(String? blendModeString) {
if (blendModeString == null || blendModeString.trim().length == 0) {
return null;
}
switch (blendModeString.trim()) {
case 'clear':
return BlendMode.clear;
case 'src':
return BlendMode.src;
case 'dst':
return BlendMode.dst;
case 'srcOver':
return BlendMode.srcOver;
case 'dstOver':
return BlendMode.dstOver;
case 'srcIn':
return BlendMode.srcIn;
case 'dstIn':
return BlendMode.dstIn;
case 'srcOut':
return BlendMode.srcOut;
case 'dstOut':
return BlendMode.dstOut;
case 'srcATop':
return BlendMode.srcATop;
case 'dstATop':
return BlendMode.dstATop;
case 'xor':
return BlendMode.xor;
case 'plus':
return BlendMode.plus;
case 'modulate':
return BlendMode.modulate;
case 'screen':
return BlendMode.screen;
case 'overlay':
return BlendMode.overlay;
case 'darken':
return BlendMode.darken;
case 'lighten':
return BlendMode.lighten;
case 'colorDodge':
return BlendMode.colorDodge;
case 'colorBurn':
return BlendMode.colorBurn;
case 'hardLight':
return BlendMode.hardLight;
case 'softLight':
return BlendMode.softLight;
case 'difference':
return BlendMode.difference;
case 'exclusion':
return BlendMode.exclusion;
case 'multiply':
return BlendMode.multiply;
case 'hue':
return BlendMode.hue;
case 'saturation':
return BlendMode.saturation;
case 'color':
return BlendMode.color;
case 'luminosity':
return BlendMode.luminosity;
default:
return BlendMode.srcIn;
}
}
BoxFit? parseBoxFit(String? boxFitString) {
if (boxFitString == null) {
return null;
}
switch (boxFitString) {
case 'fill':
return BoxFit.fill;
case 'contain':
return BoxFit.contain;
case 'cover':
return BoxFit.cover;
case 'fitWidth':
return BoxFit.fitWidth;
case 'fitHeight':
return BoxFit.fitHeight;
case 'none':
return BoxFit.none;
case 'scaleDown':
return BoxFit.scaleDown;
}
return null;
}
String exportBoxFit(BoxFit? boxFit) {
String rt = "contain";
if (boxFit == BoxFit.fill) {
rt = "fill";
}
if (boxFit == BoxFit.cover) {
rt = "cover";
}
if (boxFit == BoxFit.fitWidth) {
rt = "fitWidth";
}
if (boxFit == BoxFit.fitHeight) {
rt = "fitHeight";
}
if (boxFit == BoxFit.none) {
rt = "none";
}
if (boxFit == BoxFit.scaleDown) {
rt = "scaleDown";
}
return rt;
}
ImageRepeat? parseImageRepeat(String? imageRepeatString) {
if (imageRepeatString == null) {
return null;
}
switch (imageRepeatString) {
case 'repeat':
return ImageRepeat.repeat;
case 'repeatX':
return ImageRepeat.repeatX;
case 'repeatY':
return ImageRepeat.repeatY;
case 'noRepeat':
return ImageRepeat.noRepeat;
default:
return ImageRepeat.noRepeat;
}
}
String exportImageRepeat(ImageRepeat imageRepeat) {
String rt = "noRepeat";
if (imageRepeat == ImageRepeat.repeat) {
rt = "repeat";
}
if (imageRepeat == ImageRepeat.repeatX) {
rt = "repeatX";
}
if (imageRepeat == ImageRepeat.repeatY) {
rt = "repeatY";
}
return rt;
}
Rect? parseRect(String? fromLTRBString) {
if (fromLTRBString == null) {
return null;
}
var strings = fromLTRBString.split(',');
return Rect.fromLTRB(double.parse(strings[0]), double.parse(strings[1]),
double.parse(strings[2]), double.parse(strings[3]));
}
String exportRect(Rect rect) {
return "${rect.left},${rect.top},${rect.right},${rect.bottom}";
}
FilterQuality? parseFilterQuality(String? filterQualityString) {
if (filterQualityString == null) {
return null;
}
switch (filterQualityString) {
case 'none':
return FilterQuality.none;
case 'low':
return FilterQuality.low;
case 'medium':
return FilterQuality.medium;
case 'high':
return FilterQuality.high;
default:
return FilterQuality.low;
}
}
String exportFilterQuality(FilterQuality filterQuality) {
String rt = "low";
if (filterQuality == FilterQuality.none) {
rt = "none";
}
if (filterQuality == FilterQuality.low) {
rt = "low";
}
if (filterQuality == FilterQuality.medium) {
rt = "medium";
}
if (filterQuality == FilterQuality.high) {
rt = "high";
}
return rt;
}
String? getLoadMoreUrl(String? url, int currentNo, int? pageSize) {
if (url == null) {
return null;
}
url = url.trim();
if (url.contains("?")) {
url = url +
"&startNo=" +
currentNo.toString() +
"&pageSize=" +
pageSize.toString();
} else {
url = url +
"?startNo=" +
currentNo.toString() +
"&pageSize=" +
pageSize.toString();
}
return url;
}
StackFit? parseStackFit(String? value) {
if (value == null) return null;
switch (value) {
case 'loose':
return StackFit.loose;
case 'expand':
return StackFit.expand;
case 'passthrough':
return StackFit.passthrough;
default:
return StackFit.loose;
}
}
String exportStackFit(StackFit stackFit) {
String rt = "loose";
if (stackFit == StackFit.expand) {
rt = "expand";
} else if (stackFit == StackFit.passthrough) {
rt = "passthrough";
}
return rt;
}
Clip? parseClip(String? value) {
if (value == null) {
return null;
}
switch (value) {
case 'none':
return Clip.none;
case 'hardEdge':
return Clip.hardEdge;
case 'antiAlias':
return Clip.antiAlias;
case 'antiAliasWithSaveLayer':
return Clip.antiAliasWithSaveLayer;
default:
return Clip.hardEdge;
}
}
String exportClip(Clip clip) {
String rt = "hardEdge";
if (clip == Clip.none) {
rt = "none";
} else if (clip == Clip.hardEdge) {
rt = "hardEdge";
} else if (clip == Clip.antiAlias) {
rt = "antiAlias";
} else if (clip == Clip.antiAliasWithSaveLayer) {
rt = "antiAliasWithSaveLayer";
}
return rt;
}
Axis parseAxis(String? axisString) {
if (axisString == null) {
return Axis.horizontal;
}
switch (axisString) {
case "horizontal":
return Axis.horizontal;
case "vertical":
return Axis.vertical;
}
return Axis.horizontal;
}
//WrapAlignment
WrapAlignment parseWrapAlignment(String? wrapAlignmentString) {
if (wrapAlignmentString == null) {
return WrapAlignment.start;
}
switch (wrapAlignmentString) {
case "start":
return WrapAlignment.start;
case "end":
return WrapAlignment.end;
case "center":
return WrapAlignment.center;
case "spaceBetween":
return WrapAlignment.spaceBetween;
case "spaceAround":
return WrapAlignment.spaceAround;
case "spaceEvenly":
return WrapAlignment.spaceEvenly;
}
return WrapAlignment.start;
}
String exportWrapAlignment(WrapAlignment wrapAlignment) {
String rt = "start";
if (wrapAlignment == WrapAlignment.end) {
rt = "end";
} else if (wrapAlignment == WrapAlignment.center) {
rt = "center";
} else if (wrapAlignment == WrapAlignment.spaceBetween) {
rt = "spaceBetween";
} else if (wrapAlignment == WrapAlignment.spaceAround) {
rt = "spaceAround";
} else if (wrapAlignment == WrapAlignment.spaceEvenly) {
rt = "spaceEvenly";
}
return rt;
}
//WrapCrossAlignment
WrapCrossAlignment parseWrapCrossAlignment(String? wrapCrossAlignmentString) {
if (wrapCrossAlignmentString == null) {
return WrapCrossAlignment.start;
}
switch (wrapCrossAlignmentString) {
case "start":
return WrapCrossAlignment.start;
case "end":
return WrapCrossAlignment.end;
case "center":
return WrapCrossAlignment.center;
}
return WrapCrossAlignment.start;
}
String exportWrapCrossAlignment(WrapCrossAlignment wrapCrossAlignment) {
String rt = "start";
if (wrapCrossAlignment == WrapCrossAlignment.end) {
rt = "end";
} else if (wrapCrossAlignment == WrapCrossAlignment.center) {
rt = "center";
}
return rt;
}
Clip parseClipBehavior(String? clipBehaviorString) {
if (clipBehaviorString == null) {
return Clip.antiAlias;
}
switch (clipBehaviorString) {
case "antiAlias":
return Clip.antiAlias;
case "none":
return Clip.none;
case "hardEdge":
return Clip.hardEdge;
case "antiAliasWithSaveLayer":
return Clip.antiAliasWithSaveLayer;
}
return Clip.antiAlias;
}
String exportClipBehavior(Clip clip) {
if (clip == Clip.antiAliasWithSaveLayer) {
return "antiAliasWithSaveLayer";
}
if (clip == Clip.hardEdge) {
return "hardEdge";
}
if (clip == Clip.none) {
return "none";
}
return "antiAlias";
}
DropCapMode? parseDropCapMode(String? value) {
if (value == null) {
return null;
}
switch (value) {
case 'inside':
return DropCapMode.inside;
case 'upwards':
return DropCapMode.upwards;
case 'aside':
return DropCapMode.aside;
default:
return DropCapMode.inside;
}
}
String? exportDropCapMod(DropCapMode? mode) {
if (mode == null) {
return null;
}
switch (mode) {
case DropCapMode.inside:
return "inside";
case DropCapMode.baseline:
return "baseline";
case DropCapMode.aside:
return "aside";
case DropCapMode.upwards:
return "upwards";
default:
return "inside";
}
}
DropCapPosition? parseDropCapPosition(String? value) {
if (value == null) {
return null;
}
switch (value) {
case 'start':
return DropCapPosition.start;
case 'end':
return DropCapPosition.end;
default:
return DropCapPosition.start;
}
}
String exportDropCapPosition(DropCapPosition? dropCapPosition) {
String rt = "start";
if (dropCapPosition == DropCapPosition.end) {
rt = "end";
}
return rt;
}
DropCap? parseDropCap(Map<String, dynamic>? map, BuildContext buildContext, MethodListener? listener) {
if (map == null) {
return null;
}
return DropCap(
width: map['width']?.toDouble(),
height: map['height']?.toDouble(),
child: WidgetParserBuilder.buildFromMap(map["child"], buildContext, listener),
);
}
String exportAlignmentDirectional(AlignmentDirectional alignmentDirectional){
if (alignmentDirectional == AlignmentDirectional.bottomCenter) {
return "bottomCenter";
}
if (alignmentDirectional == AlignmentDirectional.center) {
return "center";
}
if (alignmentDirectional == AlignmentDirectional.bottomEnd) {
return "bottomEnd";
}
if (alignmentDirectional == AlignmentDirectional.bottomStart) {
return "bottomStart";
}
if (alignmentDirectional == AlignmentDirectional.centerEnd) {
return "centerEnd";
}
if (alignmentDirectional == AlignmentDirectional.centerStart) {
return "centerStart";
}
if (alignmentDirectional == AlignmentDirectional.bottomCenter) {
return "bottomCenter";
}
if (alignmentDirectional == AlignmentDirectional.topCenter) {
return "topCenter";
}
if (alignmentDirectional == AlignmentDirectional.topEnd) {
return "topEnd";
}
if (alignmentDirectional == AlignmentDirectional.topStart) {
return "topStart";
}
return "topStart";
}
String exportAlignment(Alignment? alignment) {
if (alignment == null) {
return "center";
}
if (alignment == Alignment.center) {
return "center";
}
if (alignment == Alignment.bottomRight) {
return "bottomRight";
}
if (alignment == Alignment.bottomCenter) {
return "bottomCenter";
}
if (alignment == Alignment.bottomLeft) {
return "bottomLeft";
}
if (alignment == Alignment.centerLeft) {
return "centerLeft";
}
if (alignment == Alignment.centerRight) {
return "centerRight";
}
if (alignment == Alignment.topCenter) {
return "topCenter";
}
if (alignment == Alignment.topLeft) {
return "topLeft";
}
if (alignment == Alignment.topRight) {
return "topRight";
}
if (alignment == Alignment.bottomRight) {
return "bottomRight";
}
return "center";
}
Map<String, dynamic> exportConstraints(BoxConstraints constraints) {
return {
'minWidth': constraints.minWidth,
'maxWidth': constraints.maxWidth == double.infinity
? infinity
: constraints.maxWidth,
'minHeight': constraints.minHeight,
'maxHeight': constraints.maxHeight == double.infinity
? infinity
: constraints.maxHeight,
};
}
Key? createKeyForWidget(dynamic keyParams) {
if (keyParams == 'UniqueKey') {
return UniqueKey();
} else {
return keyParams;
}
}
BoxShadow parseBoxShadow(Map<String, dynamic> map) {
return BoxShadow(
color: (map.containsKey('color') ? parseHexColor(map['color']) : null)!,
blurRadius: (map.containsKey('blurRadius') ? map['blurRadius'] : 0.0)!,
spreadRadius: (map.containsKey('spreadRadius') ? map['spreadRadius'] : 0.0)!,
);
}
LLSButtonType parseLLSButtonType(String type) {
if (type == 'solid') {
return LLSButtonType.solid;
} else if (type == 'outline') {
return LLSButtonType.outline;
} else {
return LLSButtonType.transparent;
}
}
LLSButtonShape parseLLSButtonShape(String shape) {
if (shape == 'rounded') {
return LLSButtonShape.rounded;
} else if (shape == 'square') {
return LLSButtonShape.square;
} else {
return LLSButtonShape.standard;
}
}
LLSPosition parseLLSPosition(String position) {
if (position == 'end') {
return LLSPosition.end;
} else {
return LLSPosition.start;
}
}
double parseLLSSize(String size) {
if (size == 'small') {
return LLSSize.SMALL;
} else if (size == 'large') {
return LLSSize.LARGE;
} else if (size == 'medium') {
return LLSSize.MEDIUM;
} else {
return double.parse(size);
}
}
BorderSide parseBorderSide(Map<String, dynamic> borderSide) {
return BorderSide(
color: borderSide.containsKey('color') ? parseHexColor(borderSide['color'])! : LLSColors.PRIMARY,
width: borderSide.containsKey('width') ? borderSide['width'] : 0.1,
style: borderSide.containsKey('style') ? parseBorderStyle(borderSide['style']) : BorderStyle.none
);
}
BorderStyle parseBorderStyle(String borderStyle) {
if (borderStyle == 'solid') {
return BorderStyle.solid;
} else {
return BorderStyle.none;
}
}
ImageProvider<Object>? parseImageProvider(Map<String, dynamic> imageProvider) {
String object = imageProvider['object'];
String? assetName = imageProvider['assetName'];
String? package = imageProvider['package'];
double? scale = imageProvider['scale'];
String? pathFile = imageProvider['pathFile'];
String? url = imageProvider['url'];
if (object == 'assetImage') {
return parseAssetImage(assetName, package: package);
} else if (object == 'fileImage') {
return parseFileImage(pathFile, scale: scale);
} else if (object == 'networkImage') {
return parseNetworkImage(url, scale: scale);
}
}
AssetImage parseAssetImage(String? assetName, {String? package}) {
return AssetImage(assetName!, package: package!);
}
FileImage parseFileImage(String? pathFile, {double? scale}) {
return FileImage(File(pathFile!), scale: scale!);
}
NetworkImage parseNetworkImage(String? url, {double? scale}) {
return NetworkImage(url!, scale: scale!);
}
BorderRadius parseBorderRadius(Map<String, dynamic> map) {
String borderRadiusMethod = map['borderRadiusMethod'];
Map<String, dynamic> radiusMap = map['radiusMap'];
if (borderRadiusMethod == 'circular') {
return BorderRadius.circular(radiusMap['all_directions']);
} else if (borderRadiusMethod == 'vertical') {
return BorderRadius.vertical(top: radiusMap['top'], bottom: radiusMap['bottom']);
} else if (borderRadiusMethod == 'horizontal') {
return BorderRadius.horizontal(left: radiusMap['left'], right: radiusMap['right']);
} else {
return BorderRadius.only(
topLeft: radiusMap['topLeft'],
topRight: radiusMap['topRight'],
bottomLeft: radiusMap['bottomLeft'],
bottomRight: radiusMap['bottomRight']
);
}
}
Border parseBorder(Map<String, dynamic> map) {
return Border(
top: parseBorderSide(map['top']),
right: parseBorderSide(map['right']),
bottom: parseBorderSide(map['bottom']),
left: parseBorderSide(map['left'])
);
}
LLSLabelType parseLLSLabelType(String labelType) {
if (labelType == 'typo1') {
return LLSLabelType.typo1;
} else if (labelType == 'typo2') {
return LLSLabelType.typo2;
} else if (labelType == 'typo3') {
return LLSLabelType.typo3;
} else if (labelType == 'typo4') {
return LLSLabelType.typo4;
} else if (labelType == 'typo5') {
return LLSLabelType.typo5;
} else {
return LLSLabelType.typo6;
}
}
BoxDecoration parseBoxDecoration(Map<String, dynamic> decoration) {
return BoxDecoration(
borderRadius: decoration.containsKey('borderRadius') ? parseBorderRadius(decoration['borderRadius']) : null,
color: decoration.containsKey('color') ? parseHexColor(decoration['color'])! : LLSColors.WHITE,
boxShadow: decoration.containsKey('boxShadow') ? decoration['boxShadow'].length > 0
? parseBoxShadowList(decoration['boxShadow'])
: null
: null
);
}
List<BoxShadow> parseBoxShadowList(List<dynamic> boxShadow) {
List<BoxShadow> boxSList = [];
for (var item in boxShadow) {
boxSList.add(parseBoxShadow(item));
}
return boxSList;
}
\ No newline at end of file
library widgetparser;
// package Widget Parser
// author Rizal Hermawan <rizal.hermawan@locatorlogic.com>
import 'dart:convert';
import 'package:flutter/widgets.dart';
//exports flutter widget parser
import 'package:widgetparser/src/flutter_widget/align_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/appbar_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/aspectratio_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/baseline_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/center_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/container_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/dropcaptext_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/expanded_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/fittedbox_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/icon_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/image_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/indexedstack_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/limitedbox_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/listtile_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/offstage_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/opacity_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/padding_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/placeholder_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/row_column_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/safearea_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/scaffold_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/selectabletext_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/sizedbox_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/stack_positioned_widgets_parser.dart';
import 'package:widgetparser/src/flutter_widget/text_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/wrap_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/listview_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/pageview_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/cliprrect_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/overflowbox_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/inkwell_widget_parser.dart';
import 'package:widgetparser/src/flutter_widget/gesturedetector_widget_parser.dart';
//exports llswidget parser
import 'package:widgetparser/src/llswidget/llsbutton_widget_parser.dart';
import 'package:widgetparser/src/llswidget/llslisttile_widget_parser.dart';
import 'package:widgetparser/src/llswidget/llscard_widget_parser.dart';
import 'package:widgetparser/src/llswidget/llslabel_widget_parser.dart';
class WidgetParserBuilder {
static final _parsers = [
ContainerWidgetParser(),
TextWidgetParser(),
SelectableTextWidgetParser(),
RowWidgetParser(),
ColumnWidgetParser(),
AssetImageWidgetParser(),
NetworkImageWidgetParser(),
PlaceholderWidgetParser(),
ListViewWidgetParser(),
PageViewWidgetParser(),
ExpandedWidgetParser(),
PaddingWidgetParser(),
CenterWidgetParser(),
AlignWidgetParser(),
AspectRatioWidgetParser(),
FittedBoxWidgetParser(),
BaselineWidgetParser(),
StackWidgetParser(),
PositionedWidgetParser(),
IndexedStackWidgetParser(),
ExpandedSizedBoxWidgetParser(),
SizedBoxWidgetParser(),
OpacityWidgetParser(),
WrapWidgetParser(),
DropCapTextParser(),
IconWidgetParser(),
ClipRRectWidgetParser(),
SafeAreaWidgetParser(),
ListTileWidgetParser(),
ScaffoldWidgetParser(),
AppBarWidgetParser(),
LimitedBoxWidgetParser(),
OffstageWidgetParser(),
OverflowBoxWidgetParser(),
InkWellWidgetParser(),
GestureDetectorWidgetParser(),
//llswidget
LLSButtonWidgetParser(),
LLSListTileWidgetParser(),
LLSCardWidgetParser(),
LLSLabelWidgetParser()
];
static final _widgetNameParserMap = <String, WidgetParser>{};
static bool _defaultParserInited = false;
static void initDefaultParsersIfNess() {
if (!_defaultParserInited) {
for (var parser in _parsers) {
_widgetNameParserMap[parser.widgetName] = parser;
}
_defaultParserInited = true;
}
}
static Widget? build(String json, BuildContext buildContext, MethodListener? listener) {
initDefaultParsersIfNess();
var map = jsonDecode(json);
MethodListener _listener = listener == null ? new MethodListener() : listener;
var widget = buildFromMap(map, buildContext, _listener);
return widget;
}
static Widget? buildFromMap(Map<String, dynamic>? map, BuildContext buildContext, MethodListener? listener) {
initDefaultParsersIfNess();
if (map == null) {
return null;
}
String? widgetName = map['widget'];
var parser = _widgetNameParserMap[widgetName];
if (parser != null) {
try {
return parser.parse(map, buildContext, listener);
} catch (e) {
print(e.toString());
return null;
}
} else {
print("please initialize the $widgetName widget to the WidgetBuilderParser.");
}
return null;
}
static List<Widget> buildWidgets(List<dynamic> values, BuildContext buildContext, MethodListener? listener) {
initDefaultParsersIfNess();
List<Widget> rt = [];
for (var value in values) {
var buildFromMap2 = buildFromMap(value, buildContext, listener);
if(buildFromMap2!=null) {
rt.add(buildFromMap2);
}
}
return rt;
}
}
abstract class WidgetParser {
Widget parse(Map<String, dynamic> map, BuildContext buildContext, MethodListener? listener);
String get widgetName;
Type get widgetType;
}
class MethodListener {
void run(BuildContext context, Map<String, dynamic>? event) {
if (isFunctionNameExist(event)) {
print("event: ${event!['func_name']}");
} else {
print("receiver event: ${event.toString()}");
}
}
bool isFunctionNameExist(Map<String, dynamic>? event) {
return event!.containsKey('func_name');
}
bool isParametersExist(Map<String, dynamic>? event) {
return event!.containsKey('parameters');
}
}
\ No newline at end of file
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.15.0"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
font_awesome_flutter:
dependency: "direct main"
description:
name: font_awesome_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "9.0.0"
llswidget:
dependency: "direct main"
description:
path: "../llswidget"
relative: true
source: path
version: "0.0.1"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
sdks:
dart: ">=2.12.0 <3.0.0"
flutter: ">=1.17.0"
name: widgetparser
description: this package to dynamically render widgets from JSON
version: 0.0.1
author: Rizal Hermawan
homepage: https://locatorlogic.com
publish_to: 'none'
environment:
sdk: ">=2.12.0 <3.0.0"
flutter: ">=1.17.0"
dependencies:
flutter:
sdk: flutter
font_awesome_flutter: ^9.0.0
llswidget:
path: ../llswidget
cupertino_icons: ^1.0.2
dev_dependencies:
flutter_test:
sdk: flutter
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter.
flutter:
# To add assets to your package, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
#
# For details regarding assets in packages, see
# https://flutter.dev/assets-and-images/#from-packages
#
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.
# To add custom fonts to your package, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts in packages, see
# https://flutter.dev/custom-fonts/#from-packages
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment