From 33712b7690890cc87c2d95e62b13936084bbabc4 Mon Sep 17 00:00:00 2001 From: hannathkadher Date: Tue, 8 Oct 2024 20:37:04 +0400 Subject: [PATCH] fixed re-rendering of community widget --- lib/common/custom_expansion_tile.dart | 27 ++++++----- .../widgets/community_tile.dart | 32 +++++++++---- .../widgets/sidebar_widget.dart | 16 +++---- .../widgets/space_tile_widget.dart | 45 +++++++++++++++++++ 4 files changed, 90 insertions(+), 30 deletions(-) create mode 100644 lib/pages/spaces_management/widgets/space_tile_widget.dart diff --git a/lib/common/custom_expansion_tile.dart b/lib/common/custom_expansion_tile.dart index bf39991e..995b5d04 100644 --- a/lib/common/custom_expansion_tile.dart +++ b/lib/common/custom_expansion_tile.dart @@ -5,8 +5,8 @@ class CustomExpansionTile extends StatefulWidget { final String title; final List? children; final bool initiallyExpanded; - final bool? isExpanded; // New parameter to control expansion - final ValueChanged? onExpansionChanged; // Callback for expansion change + final bool? isExpanded; // External control over expansion + final ValueChanged? onExpansionChanged; // Notify when expansion changes CustomExpansionTile({ required this.title, @@ -21,8 +21,8 @@ class CustomExpansionTile extends StatefulWidget { } class CustomExpansionTileState extends State { - bool _isExpanded = false; - bool _isChecked = false; + bool _isExpanded = false; // Local expansion state + bool _isChecked = false; // Local checkbox state @override void initState() { @@ -33,6 +33,7 @@ class CustomExpansionTileState extends State { @override void didUpdateWidget(CustomExpansionTile oldWidget) { super.didUpdateWidget(oldWidget); + // Sync local state with external control of expansion state if (widget.isExpanded != null && widget.isExpanded != _isExpanded) { setState(() { _isExpanded = widget.isExpanded!; @@ -40,6 +41,7 @@ class CustomExpansionTileState extends State { } } + // Utility function to capitalize the first letter of the title String _capitalizeFirstLetter(String text) { if (text.isEmpty) return text; return text[0].toUpperCase() + text.substring(1); @@ -49,6 +51,7 @@ class CustomExpansionTileState extends State { Widget build(BuildContext context) { return Column( children: [ + // The main clickable row for the expansion tile InkWell( onTap: () { setState(() { @@ -58,7 +61,7 @@ class CustomExpansionTileState extends State { }, child: Row( children: [ - // Customizing the Checkbox + // Checkbox with independent state management Checkbox( value: _isChecked, onChanged: (bool? value) { @@ -66,11 +69,11 @@ class CustomExpansionTileState extends State { _isChecked = value ?? false; }); }, - side: WidgetStateBorderSide.resolveWith((states) { + side: MaterialStateBorderSide.resolveWith((states) { return const BorderSide(color: ColorsManager.grayBorder); }), - fillColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.selected)) { + fillColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.selected)) { return ColorsManager.grayBorder; } else { return ColorsManager.checkBoxFillColor; @@ -78,15 +81,16 @@ class CustomExpansionTileState extends State { }), checkColor: ColorsManager.whiteColors, ), + // Show the expand/collapse icon if (widget.children != null && widget.children!.isNotEmpty) Icon( _isExpanded ? Icons.keyboard_arrow_down : Icons.keyboard_arrow_right, color: Colors.grey, - size: 16.0, // Reduced icon size + size: 16.0, // Adjusted size for better alignment ), - // Title Text + // The title text with dynamic styling Expanded( child: Text( _capitalizeFirstLetter(widget.title), @@ -101,11 +105,12 @@ class CustomExpansionTileState extends State { ], ), ), + // The expanded section (children) that shows when the tile is expanded if (_isExpanded && widget.children != null && widget.children!.isNotEmpty) Padding( - padding: const EdgeInsets.only(left: 48.0), // Indent the children + padding: const EdgeInsets.only(left: 48.0), // Indented children child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: widget.children!, diff --git a/lib/pages/spaces_management/widgets/community_tile.dart b/lib/pages/spaces_management/widgets/community_tile.dart index 7511d4f3..2943a6e5 100644 --- a/lib/pages/spaces_management/widgets/community_tile.dart +++ b/lib/pages/spaces_management/widgets/community_tile.dart @@ -1,29 +1,45 @@ import 'package:flutter/material.dart'; import 'package:syncrow_web/common/custom_expansion_tile.dart'; -class CommunityTile extends StatelessWidget { +class CommunityTile extends StatefulWidget { final String title; - final bool isExpanded; - final Function(String, bool) onExpansionChanged; final List? children; + final bool initiallyExpanded; + final Function(String, bool) onExpansionChanged; const CommunityTile({ Key? key, required this.title, - required this.isExpanded, + required this.initiallyExpanded, required this.onExpansionChanged, this.children, }) : super(key: key); + @override + _CommunityTileState createState() => _CommunityTileState(); +} + +class _CommunityTileState extends State { + late bool _isExpanded; + + @override + void initState() { + super.initState(); + _isExpanded = widget.initiallyExpanded; + } + @override Widget build(BuildContext context) { return CustomExpansionTile( - title: title, - initiallyExpanded: isExpanded, + title: widget.title, + initiallyExpanded: _isExpanded, onExpansionChanged: (bool expanded) { - onExpansionChanged(title, expanded); + setState(() { + _isExpanded = expanded; + }); + widget.onExpansionChanged(widget.title, expanded); }, - children: children ?? [], + children: widget.children ?? [], ); } } diff --git a/lib/pages/spaces_management/widgets/sidebar_widget.dart b/lib/pages/spaces_management/widgets/sidebar_widget.dart index b5596315..f12f89b3 100644 --- a/lib/pages/spaces_management/widgets/sidebar_widget.dart +++ b/lib/pages/spaces_management/widgets/sidebar_widget.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:syncrow_web/common/custom_expansion_tile.dart'; import 'package:syncrow_web/common/search_bar.dart'; import 'package:syncrow_web/pages/spaces_management/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/model/space_model.dart'; import 'package:syncrow_web/pages/spaces_management/widgets/community_tile.dart'; import 'package:syncrow_web/pages/spaces_management/view/dialogs/create_community_dialog.dart'; +import 'package:syncrow_web/pages/spaces_management/widgets/space_tile_widget.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/style.dart'; @@ -144,7 +144,7 @@ class _SidebarWidgetState extends State { 'Building CommunityTile for ${community.name}, hasChildren: $hasChildren'); return CommunityTile( title: community.name, - isExpanded: _expandedTiles[community.uuid] ?? false, + initiallyExpanded: false, onExpansionChanged: (String title, bool expanded) { debugPrint( 'CommunityTile onExpansionChanged called for $title, expanded: $expanded'); @@ -159,9 +159,9 @@ class _SidebarWidgetState extends State { Widget _buildSpaceTile(SpaceModel space) { debugPrint( 'Building SpaceTile for ${space.name}, hasChildren: ${space.children.isNotEmpty}'); - return CustomExpansionTile( + return SpaceTile( title: space.name, - isExpanded: _expandedTiles[space.uuid] ?? false, + initiallyExpanded: false, onExpansionChanged: (bool expanded) { debugPrint( 'SpaceTile onExpansionChanged called for ${space.name}, expanded: $expanded'); @@ -175,11 +175,5 @@ class _SidebarWidgetState extends State { ); } - void _handleExpansionChange(String uuid, bool expanded) { - setState(() { - _expandedTiles[uuid] = expanded; - debugPrint('_expandedTiles updated: $_expandedTiles'); - }); - widget.onCommunitySelected?.call(uuid); - } + void _handleExpansionChange(String uuid, bool expanded) {} } diff --git a/lib/pages/spaces_management/widgets/space_tile_widget.dart b/lib/pages/spaces_management/widgets/space_tile_widget.dart new file mode 100644 index 00000000..8c48d568 --- /dev/null +++ b/lib/pages/spaces_management/widgets/space_tile_widget.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_web/common/custom_expansion_tile.dart'; + +class SpaceTile extends StatefulWidget { + final String title; + final bool initiallyExpanded; + final ValueChanged onExpansionChanged; + final List? children; + + const SpaceTile({ + Key? key, + required this.title, + required this.initiallyExpanded, + required this.onExpansionChanged, + this.children, + }) : super(key: key); + + @override + _SpaceTileState createState() => _SpaceTileState(); +} + +class _SpaceTileState extends State { + late bool _isExpanded; + + @override + void initState() { + super.initState(); + _isExpanded = widget.initiallyExpanded; + } + + @override + Widget build(BuildContext context) { + return CustomExpansionTile( + title: widget.title, + initiallyExpanded: _isExpanded, + onExpansionChanged: (bool expanded) { + setState(() { + _isExpanded = expanded; + }); + widget.onExpansionChanged(expanded); + }, + children: widget.children ?? [], + ); + } +}