diff --git a/lib/src/transformers/node_transformers/node_transformers.dart b/lib/src/transformers/node_transformers/node_transformers.dart index c1e8de99..df42c835 100644 --- a/lib/src/transformers/node_transformers/node_transformers.dart +++ b/lib/src/transformers/node_transformers/node_transformers.dart @@ -10,8 +10,10 @@ export 'passive_expansion_tile_transformer.dart'; export 'passive_floating_action_button_transformer.dart'; export 'passive_icon_transformer.dart'; export 'passive_list_tile_transformer.dart'; +export 'passive_list_view_transformer.dart'; export 'passive_loading_indicator_transformer.dart'; export 'passive_navigation_bar_transformer.dart'; +export 'passive_page_view_transformer.dart'; export 'passive_placeholder_transformer.dart'; export 'passive_progressbar_transformer.dart'; export 'passive_radio_transformer.dart'; @@ -26,4 +28,3 @@ export 'passive_text_field_transformer.dart'; export 'passive_text_transformer.dart'; export 'passive_variance_transformer.dart'; export 'passive_web_view_transformer.dart'; -export 'passive_list_view_transformer.dart'; diff --git a/lib/src/transformers/node_transformers/passive_button_transformer.dart b/lib/src/transformers/node_transformers/passive_button_transformer.dart index 540167c8..a7a7dbfc 100644 --- a/lib/src/transformers/node_transformers/passive_button_transformer.dart +++ b/lib/src/transformers/node_transformers/passive_button_transformer.dart @@ -88,7 +88,7 @@ class PassiveButtonWidget extends StatelessWidget { @override Widget build(BuildContext context) { /// Check if this is a part of a list item. - final ListItemProvider? indexProvider = ListItemProvider.of(context); + final IndexedItemProvider? indexProvider = IndexedItemProvider.of(context); if (indexProvider != null) { variables.add( VariableData( diff --git a/lib/src/transformers/node_transformers/passive_list_view_transformer.dart b/lib/src/transformers/node_transformers/passive_list_view_transformer.dart index 3104fd6a..353349ee 100644 --- a/lib/src/transformers/node_transformers/passive_list_view_transformer.dart +++ b/lib/src/transformers/node_transformers/passive_list_view_transformer.dart @@ -61,7 +61,7 @@ class PassiveListViewWidget extends StatelessWidget { properties: node.properties, ) : null, - itemBuilder: (context, index) => ListItemProvider( + itemBuilder: (context, index) => IndexedItemProvider( index: index, child: manager.buildWidgetByID( itemNode, @@ -182,24 +182,3 @@ class ListViewItemSeparator extends StatelessWidget { } } } - -class ListItemProvider extends InheritedWidget { - final int index; - final dynamic item; - - const ListItemProvider({ - super.key, - required super.child, - required this.index, - this.item, - }); - - static ListItemProvider? of(BuildContext context) { - return context.dependOnInheritedWidgetOfExactType(); - } - - @override - bool updateShouldNotify(covariant ListItemProvider oldWidget) { - return index != oldWidget.index || item != oldWidget.item; - } -} diff --git a/lib/src/transformers/node_transformers/passive_page_view_transformer.dart b/lib/src/transformers/node_transformers/passive_page_view_transformer.dart new file mode 100644 index 00000000..7d062015 --- /dev/null +++ b/lib/src/transformers/node_transformers/passive_page_view_transformer.dart @@ -0,0 +1,97 @@ +import 'package:codelessly_api/codelessly_api.dart'; +import 'package:flutter/material.dart'; + +import '../../utils/extensions.dart'; +import '../transformers.dart'; + +class PassivePageViewTransformer extends NodeWidgetTransformer { + PassivePageViewTransformer(super.getNode, super.manager); + + @override + Widget buildWidget( + PageViewNode node, BuildContext context, WidgetBuildSettings settings) { + return PassivePageViewWidget( + node: node, + manager: manager, + settings: settings, + ); + } +} + +class PassivePageViewWidget extends StatefulWidget { + final PageViewNode node; + final NodeTransformerManager manager; + final WidgetBuildSettings settings; + + const PassivePageViewWidget({ + super.key, + required this.node, + required this.manager, + this.settings = const WidgetBuildSettings(), + }); + + @override + State createState() => _PassivePageViewWidgetState(); +} + +class _PassivePageViewWidgetState extends State { + + late PageController controller; + + @override + void initState() { + super.initState(); + controller = PageController( + initialPage: widget.node.properties.initialPage, + keepPage: widget.node.properties.keepPage, + viewportFraction: widget.node.properties.viewportFraction, + ); + } + + @override + void didUpdateWidget(covariant PassivePageViewWidget oldWidget) { + super.didUpdateWidget(oldWidget); + if(widget.node.properties.initialPage != oldWidget.node.properties.initialPage) { + controller.jumpToPage(widget.node.properties.initialPage); + } + } + + @override + Widget build(BuildContext context) { + if (widget.node.children.isEmpty) { + return AdaptiveNodeBox(node: widget.node, child: SizedBox()); + } + final itemNode = widget.node.children.first; + + return AdaptiveNodeBox( + node: widget.node, + child: PageView.builder( + itemCount: widget.node.properties.itemCount, + physics: widget.node.physics.flutterScrollPhysics, + scrollDirection: widget.node.scrollDirection.flutterAxis, + reverse: widget.node.reverse, + clipBehavior: widget.node.clipsContent ? Clip.hardEdge : Clip.none, + padEnds: widget.node.properties.padEnds, + pageSnapping: widget.node.properties.pageSnapping, + controller: controller, + onPageChanged: (index) { + // TODO: + }, + itemBuilder: (context, index) => IndexedItemProvider( + index: index, + child: widget.manager.buildWidgetByID( + itemNode, + context, + settings: widget.settings, + ), + ), + ), + ); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } +} \ No newline at end of file diff --git a/lib/src/transformers/node_transformers/passive_text_transformer.dart b/lib/src/transformers/node_transformers/passive_text_transformer.dart index d9421983..93991dd6 100644 --- a/lib/src/transformers/node_transformers/passive_text_transformer.dart +++ b/lib/src/transformers/node_transformers/passive_text_transformer.dart @@ -325,7 +325,7 @@ class _PassiveTextWidgetState extends State { final variables = [...widget.variables]; /// Check if this is a part of a list item. - final ListItemProvider? indexProvider = ListItemProvider.of(context); + final IndexedItemProvider? indexProvider = IndexedItemProvider.of(context); if (indexProvider != null) { print('indexProvider.index: ${indexProvider.index}'); variables.add( diff --git a/lib/src/transformers/passive_transformer_manager.dart b/lib/src/transformers/passive_transformer_manager.dart index 255ce2c4..294d7b04 100644 --- a/lib/src/transformers/passive_transformer_manager.dart +++ b/lib/src/transformers/passive_transformer_manager.dart @@ -48,6 +48,7 @@ class PassiveNodeTransformerManager extends WidgetNodeTransformerManager { 'variance': PassiveVarianceTransformer(getNode, this), 'webView': PassiveWebViewTransformer(getNode, this), 'listView': PassiveListViewTransformer(getNode, this), + 'pageView': PassivePageViewTransformer(getNode, this), }); } diff --git a/lib/src/transformers/transformers.dart b/lib/src/transformers/transformers.dart index c419fabc..ef5c04bb 100644 --- a/lib/src/transformers/transformers.dart +++ b/lib/src/transformers/transformers.dart @@ -1,10 +1,11 @@ -export 'node_transformer_manager.dart'; -export 'node_transformer.dart'; export 'defaults/defaults.dart'; export 'node_registry.dart'; -export 'transformer_functions.dart'; -export 'passive_transformer_manager.dart'; +export 'node_transformer.dart'; +export 'node_transformer_manager.dart'; export 'node_transformers/node_transformers.dart'; +export 'passive_transformer_manager.dart'; +export 'transformer_functions.dart'; export 'utils/dash_path.dart'; +export 'utils/indexed_item_provider.dart'; export 'utils/stroke_painter.dart'; export 'widget_node_transformer_manager.dart'; diff --git a/lib/src/transformers/utils/indexed_item_provider.dart b/lib/src/transformers/utils/indexed_item_provider.dart new file mode 100644 index 00000000..05ac81e1 --- /dev/null +++ b/lib/src/transformers/utils/indexed_item_provider.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class IndexedItemProvider extends InheritedWidget { + final int index; + final dynamic item; + + const IndexedItemProvider({ + super.key, + required super.child, + required this.index, + this.item, + }); + + static IndexedItemProvider? of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType(); + } + + @override + bool updateShouldNotify(covariant IndexedItemProvider oldWidget) { + return index != oldWidget.index || item != oldWidget.item; + } +}