diff --git a/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget_parser.dart index 23a66e62..3ffa3f95 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_network_widget/stac_network_widget_parser.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:stac/src/framework/framework.dart'; +import 'package:stac/src/parsers/core/stac_widget_parser.dart'; import 'package:stac_core/stac_core.dart'; import 'package:stac_framework/stac_framework.dart'; @@ -15,6 +16,16 @@ class StacNetworkWidgetParser extends StacParser { @override Widget parse(BuildContext context, StacNetworkWidget model) { - return Stac.fromNetwork(context: context, request: model.request); + return Stac.fromNetwork( + context: context, + request: model.request, + loadingWidget: model.loadingWidget != null + ? (context) => model.loadingWidget!.parse(context) ?? const SizedBox() + : null, + errorWidget: model.errorWidget != null + ? (context, error) => + model.errorWidget!.parse(context) ?? const SizedBox() + : null, + ); } } diff --git a/packages/stac_core/lib/widgets/network_widget/stac_network_widget.dart b/packages/stac_core/lib/widgets/network_widget/stac_network_widget.dart index e910a64e..7291da28 100644 --- a/packages/stac_core/lib/widgets/network_widget/stac_network_widget.dart +++ b/packages/stac_core/lib/widgets/network_widget/stac_network_widget.dart @@ -8,7 +8,8 @@ part 'stac_network_widget.g.dart'; /// A Stac model representing a network-driven widget. /// /// This widget triggers a [StacNetworkRequest] to fetch a Stac UI JSON from a -/// URL and renders it. +/// URL and renders it. Optionally, you can provide custom loading and error +/// widgets to display during the network request lifecycle. /// /// {@tool snippet} /// Dart Example: @@ -18,6 +19,12 @@ part 'stac_network_widget.g.dart'; /// url: 'https://example.com/data', /// method: 'get', /// ), +/// loadingWidget: StacCenter( +/// child: StacCircularProgressIndicator(), +/// ), +/// errorWidget: StacCenter( +/// child: StacText(data: 'Failed to load'), +/// ), /// ) /// ``` /// {@end-tool} @@ -31,6 +38,19 @@ part 'stac_network_widget.g.dart'; /// "actionType": "networkRequest", /// "url": "https://example.com/data", /// "method": "get" +/// }, +/// "loadingWidget": { +/// "type": "center", +/// "child": { +/// "type": "circularProgressIndicator" +/// } +/// }, +/// "errorWidget": { +/// "type": "center", +/// "child": { +/// "type": "text", +/// "data": "Failed to load" +/// } /// } /// } /// ``` @@ -38,11 +58,31 @@ part 'stac_network_widget.g.dart'; @JsonSerializable() class StacNetworkWidget extends StacWidget { /// Creates a [StacNetworkWidget]. - const StacNetworkWidget({required this.request}); + /// + /// The [request] parameter is required and defines the network request + /// to execute. The [loadingWidget] and [errorWidget] parameters are + /// optional and allow you to customize the loading and error states. + const StacNetworkWidget({ + required this.request, + this.loadingWidget, + this.errorWidget, + }); /// The network request to execute. + /// + /// This defines the URL, method, headers, and body for the network request. final StacNetworkRequest request; + /// Optional widget to display while the network request is in progress. + /// + /// If not provided, a default loading indicator is shown. + final StacWidget? loadingWidget; + + /// Optional widget to display when the network request fails. + /// + /// If not provided, an empty [SizedBox] is shown on error. + final StacWidget? errorWidget; + /// Widget type identifier. @override String get type => WidgetType.networkWidget.name; diff --git a/packages/stac_core/lib/widgets/network_widget/stac_network_widget.g.dart b/packages/stac_core/lib/widgets/network_widget/stac_network_widget.g.dart index 107ff2d0..d2c7ebb5 100644 --- a/packages/stac_core/lib/widgets/network_widget/stac_network_widget.g.dart +++ b/packages/stac_core/lib/widgets/network_widget/stac_network_widget.g.dart @@ -11,10 +11,18 @@ StacNetworkWidget _$StacNetworkWidgetFromJson(Map json) => request: StacNetworkRequest.fromJson( json['request'] as Map, ), + loadingWidget: json['loadingWidget'] == null + ? null + : StacWidget.fromJson(json['loadingWidget'] as Map), + errorWidget: json['errorWidget'] == null + ? null + : StacWidget.fromJson(json['errorWidget'] as Map), ); Map _$StacNetworkWidgetToJson(StacNetworkWidget instance) => { 'request': instance.request.toJson(), + 'loadingWidget': instance.loadingWidget?.toJson(), + 'errorWidget': instance.errorWidget?.toJson(), 'type': instance.type, };