Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions examples/stac_gallery/assets/json/home_screen.json
Original file line number Diff line number Diff line change
Expand Up @@ -1351,5 +1351,27 @@
"assetPath": "assets/json/dropdown_menu_view_example.json"
}
}
},
{
"type": "listTile",
"leading": {
"type": "icon",
"icon": "category"
},
"title": {
"type": "text",
"data": "Stac Variable"
},
"subtitle": {
"type": "text",
"data": "Use variables to store and access values"
},
"onTap": {
"actionType": "navigate",
"widgetJson": {
"type": "exampleScreen",
"assetPath": "assets/json/variable_example.json"
}
}
}
]
70 changes: 70 additions & 0 deletions examples/stac_gallery/assets/json/variable_example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"type": "setValue",
"values": [
{
"key": "name",
"value": "John Doe"
},
{
"key": "age",
"value": 30
},
{
"key": "city",
"value": "New York"
},
{
"key": "country",
"value": "USA"
}
],
"child": {
"type": "scaffold",
"body": {
"type": "center",
"child": {
"type": "column",
"mainAxisAlignment": "center",
"children": [
{
"type": "text",
"data": "{{name}}"
},
{
"type": "text",
"data": "{{age}}"
},
{
"type": "text",
"data": "{{city}}",
"children": [
{
"data": "{{country}}"
}
]
}
]
}
},
"floatingActionButton": {
"type": "floatingActionButton",
"child": {
"type": "icon",
"icon": "add"
},
"onPressed": {
"actionType": "setValue",
"values": [
{
"key": "phone",
"value": "1234567890"
}
],
"action": {
"actionType": "navigate",
"assetPath": "assets/json/variable_navigate_example.json"
}
}
}
}
}
33 changes: 33 additions & 0 deletions examples/stac_gallery/assets/json/variable_navigate_example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"type": "scaffold",
"body": {
"type": "center",
"child": {
"type": "column",
"mainAxisAlignment": "center",
"children": [
{
"type": "text",
"data": "{{name}}"
},
{
"type": "text",
"data": "{{age}}"
},
{
"type": "text",
"data": "{{city}} ",
"children": [
{
"data": "{{country}}"
}
]
},
{
"type": "text",
"data": "phone: {{phone}}"
}
]
}
}
}
2 changes: 1 addition & 1 deletion examples/stac_gallery/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class MyApp extends StatelessWidget {
theme: state.lightTheme,
darkTheme: state.darkTheme,
themeMode: state.themeMode,
homeBuilder: (context) => const HomeScreen(),
homeBuilder: (context) => HomeScreen(),
title: 'Stac Gallery',
routes: {
'/homeScreen': (context) => const HomeScreen(),
Expand Down
15 changes: 14 additions & 1 deletion packages/stac/lib/src/framework/stac.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@ import 'package:flutter/services.dart';
import 'package:stac/src/framework/stac_registry.dart';
import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request_parser.dart';
import 'package:stac/src/parsers/parsers.dart';
import 'package:stac/src/parsers/widgets/stac_set_value/stac_set_value_parser.dart';
import 'package:stac/src/parsers/widgets/stac_inkwell/stac_inkwell_parser.dart';
import 'package:stac/src/services/stac_network_service.dart';
import 'package:stac/src/utils/log.dart';
import 'package:stac/src/utils/variable_resolver.dart';
import 'package:stac/src/utils/widget_type.dart';
import 'package:stac_framework/stac_framework.dart';

typedef ErrorWidgetBuilder = Widget Function(
Expand Down Expand Up @@ -101,6 +104,7 @@ class Stac {
const StacClipRRectParser(),
const StacClipOvalParser(),
const StacGestureDetectorParser(),
const StacSetValueParser(),
const StacInkwellParser(),
];

Expand All @@ -113,6 +117,7 @@ class Stac {
const StacGetFormValueParser(),
const StacFormValidateParser(),
const StacSnackBarParser(),
const StacSetValueActionParser(),
];

static Future<void> initialize({
Expand All @@ -134,7 +139,15 @@ class Stac {
String widgetType = json['type'];
StacParser? stacParser = StacRegistry.instance.getParser(widgetType);
if (stacParser != null) {
final model = stacParser.getModel(json);
Map<String, dynamic> resolvedJson;
if (widgetType == WidgetType.setValue.name) {
resolvedJson = json;
} else {
resolvedJson = resolveVariablesInJson(json, StacRegistry.instance);
}

final model = stacParser.getModel(resolvedJson);

return stacParser.parse(context, model);
} else {
Log.w('Widget type [$widgetType] not supported');
Expand Down
18 changes: 18 additions & 0 deletions packages/stac/lib/src/framework/stac_registry.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ class StacRegistry {

static final _stacActionParsers = <String, StacActionParser>{};

static final Map<String, dynamic> _variables = {};

bool register(StacParser parser, [bool override = false]) {
final String type = parser.type;
if (_stacParsers.containsKey(type)) {
Expand Down Expand Up @@ -75,4 +77,20 @@ class StacRegistry {
StacActionParser<dynamic>? getActionParser(String type) {
return _stacActionParsers[type];
}

dynamic setValue(String key, dynamic value) {
if (value == null) {
removeValue(key);
} else {
_variables[key] = value;
}
}

dynamic removeValue(String key) {
return _variables.remove(key);
}

dynamic getValue(String key) {
return _variables[key];
}
}
1 change: 1 addition & 0 deletions packages/stac/lib/src/parsers/actions/actions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ export 'package:stac/src/parsers/actions/stac_modal_bottom_sheet_action/stac_mod
export 'package:stac/src/parsers/actions/stac_navigate_action/stac_navigate_action_parser.dart';
export 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart';
export 'package:stac/src/parsers/actions/stac_none_action/stac_none_action_parser.dart';
export 'package:stac/src/parsers/actions/stac_set_value/stac_set_value_action_parser.dart';
export 'package:stac/src/parsers/actions/stac_snack_bar/stac_snack_bar.dart';
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:stac/src/parsers/actions/stac_navigate_action/stac_navigate_action.dart';
import 'package:stac/src/framework/framework.dart';
import 'package:stac/src/parsers/actions/stac_navigate_action/stac_navigate_action.dart';
import 'package:stac/src/utils/action_type.dart';
import 'package:stac_framework/stac_framework.dart';

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:stac_framework/stac_framework.dart';

part 'stac_set_value_action.freezed.dart';
part 'stac_set_value_action.g.dart';

@freezed
abstract class StacSetValueAction with _$StacSetValueAction {
const factory StacSetValueAction({
@Default([]) List<Map<String, dynamic>> values,
StacAction? action,
}) = _StacSetValueAction;

factory StacSetValueAction.fromJson(Map<String, dynamic> json) =>
_$StacSetValueActionFromJson(json);
}
Loading