From 20fedea824ae761cbbbf44a16825695d11b5dcb9 Mon Sep 17 00:00:00 2001 From: birjuvachhani Date: Fri, 7 Apr 2023 16:37:14 +0530 Subject: [PATCH 1/3] PageView #1 - Add page view transformers. - Refactor ListItemProvider to IndexedItemProvider. --- .../node_transformers/node_transformers.dart | 3 +- .../passive_button_transformer.dart | 2 +- .../passive_list_view_transformer.dart | 23 +------ .../passive_page_view_transformer.dart | 64 +++++++++++++++++++ .../passive_text_transformer.dart | 2 +- .../passive_transformer_manager.dart | 1 + lib/src/transformers/transformers.dart | 9 +-- .../utils/indexed_item_provider.dart | 22 +++++++ 8 files changed, 97 insertions(+), 29 deletions(-) create mode 100644 lib/src/transformers/node_transformers/passive_page_view_transformer.dart create mode 100644 lib/src/transformers/utils/indexed_item_provider.dart 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..78183b88 --- /dev/null +++ b/lib/src/transformers/node_transformers/passive_page_view_transformer.dart @@ -0,0 +1,64 @@ +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 StatelessWidget { + final PageViewNode node; + final NodeTransformerManager manager; + final WidgetBuildSettings settings; + + const PassivePageViewWidget({ + super.key, + required this.node, + required this.manager, + this.settings = const WidgetBuildSettings(), + }); + + @override + Widget build(BuildContext context) { + if (node.children.isEmpty) { + return AdaptiveNodeBox(node: node, child: SizedBox()); + } + final itemNode = node.children.first; + + return AdaptiveNodeBox( + node: node, + child: PageView.builder( + itemCount: node.properties.itemCount, + physics: node.physics.flutterScrollPhysics, + scrollDirection: node.scrollDirection.flutterAxis, + reverse: node.reverse, + clipBehavior: node.clipsContent ? Clip.hardEdge : Clip.none, + padEnds: node.properties.padEnds, + pageSnapping: node.properties.pageSnapping, + onPageChanged: (index) { + // TODO: + }, + itemBuilder: (context, index) => IndexedItemProvider( + index: index, + child: manager.buildWidgetByID( + itemNode, + context, + settings: settings, + ), + ), + ), + ); + } +} \ 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; + } +} From aafc6b24b491b0ee82a4702448853bebf9a1fedf Mon Sep 17 00:00:00 2001 From: birjuvachhani Date: Fri, 7 Apr 2023 21:50:12 +0530 Subject: [PATCH 2/3] PageView #3 - Implement controller for page view in passive transformer. --- .../passive_page_view_transformer.dart | 60 ++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/lib/src/transformers/node_transformers/passive_page_view_transformer.dart b/lib/src/transformers/node_transformers/passive_page_view_transformer.dart index 78183b88..cef2d00e 100644 --- a/lib/src/transformers/node_transformers/passive_page_view_transformer.dart +++ b/lib/src/transformers/node_transformers/passive_page_view_transformer.dart @@ -18,7 +18,7 @@ class PassivePageViewTransformer extends NodeWidgetTransformer { } } -class PassivePageViewWidget extends StatelessWidget { +class PassivePageViewWidget extends StatefulWidget { final PageViewNode node; final NodeTransformerManager manager; final WidgetBuildSettings settings; @@ -30,35 +30,67 @@ class PassivePageViewWidget extends StatelessWidget { 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 (node.children.isEmpty) { - return AdaptiveNodeBox(node: node, child: SizedBox()); + if (widget.node.children.isEmpty) { + return AdaptiveNodeBox(node: widget.node, child: SizedBox()); } - final itemNode = node.children.first; + final itemNode = widget.node.children.first; return AdaptiveNodeBox( - node: node, + node: widget.node, child: PageView.builder( - itemCount: node.properties.itemCount, - physics: node.physics.flutterScrollPhysics, - scrollDirection: node.scrollDirection.flutterAxis, - reverse: node.reverse, - clipBehavior: node.clipsContent ? Clip.hardEdge : Clip.none, - padEnds: node.properties.padEnds, - pageSnapping: node.properties.pageSnapping, + 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, onPageChanged: (index) { // TODO: }, itemBuilder: (context, index) => IndexedItemProvider( index: index, - child: manager.buildWidgetByID( + child: widget.manager.buildWidgetByID( itemNode, context, - settings: settings, + settings: widget.settings, ), ), ), ); } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } } \ No newline at end of file From 89f75f5631746e171841cd472b952bcca8ecba45 Mon Sep 17 00:00:00 2001 From: birjuvachhani Date: Tue, 11 Apr 2023 15:44:25 +0530 Subject: [PATCH 3/3] PageView #4 - Add page view controller for passive page view transformer. --- .../node_transformers/passive_page_view_transformer.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/transformers/node_transformers/passive_page_view_transformer.dart b/lib/src/transformers/node_transformers/passive_page_view_transformer.dart index cef2d00e..7d062015 100644 --- a/lib/src/transformers/node_transformers/passive_page_view_transformer.dart +++ b/lib/src/transformers/node_transformers/passive_page_view_transformer.dart @@ -73,6 +73,7 @@ class _PassivePageViewWidgetState extends State { clipBehavior: widget.node.clipsContent ? Clip.hardEdge : Clip.none, padEnds: widget.node.properties.padEnds, pageSnapping: widget.node.properties.pageSnapping, + controller: controller, onPageChanged: (index) { // TODO: },