From fd51a82146f85cc0edaee7f9b78ec349b9973fa6 Mon Sep 17 00:00:00 2001 From: Tony Chen Date: Tue, 17 Mar 2026 02:00:42 +1100 Subject: [PATCH 1/6] Add isMedScreen, isWideScreen, and isVeryWideScreen methods --- lib/src/constants/navigation.dart | 15 ++++-- lib/src/widgets/solid_login_build_helper.dart | 4 +- lib/src/widgets/solid_login_helper.dart | 4 +- lib/src/widgets/solid_login_panel.dart | 4 +- .../solid_scaffold_appbar_builder.dart | 6 +-- lib/src/widgets/solid_scaffold_helpers.dart | 53 +++++++++++++++++-- lib/src/widgets/solid_scaffold_state.dart | 12 ++--- 7 files changed, 76 insertions(+), 22 deletions(-) diff --git a/lib/src/constants/navigation.dart b/lib/src/constants/navigation.dart index 7f551e4..f3fd214 100644 --- a/lib/src/constants/navigation.dart +++ b/lib/src/constants/navigation.dart @@ -33,16 +33,21 @@ library; /// Navigation constants used throughout the application. class NavigationConstants { + /// The width threshold for determining very narrow screen layout. + + static const double veryNarrowScreenThreshold = 600.0; + /// The width threshold for determining narrow/wide screen layout. - /// - /// Screens wider than this value will use the navigation rail, - /// while narrower screens will use the navigation drawer. static const double narrowScreenThreshold = 800.0; - /// The width threshold for determining very narrow screen layout. + /// The width threshold for wide screen layout. - static const double veryNarrowScreenThreshold = 600.0; + static const double wideScreenThreshold = 900.0; + + /// The width threshold for very wide screen layout. + + static const double veryWideScreenThreshold = 1000.0; /// Minimum width for the navigation rail. diff --git a/lib/src/widgets/solid_login_build_helper.dart b/lib/src/widgets/solid_login_build_helper.dart index b1be9f3..2923695 100644 --- a/lib/src/widgets/solid_login_build_helper.dart +++ b/lib/src/widgets/solid_login_build_helper.dart @@ -130,12 +130,12 @@ class SolidLoginBuildHelper { behavior: HitTestBehavior.deferToChild, child: SafeArea( child: DecoratedBox( - decoration: isNarrowScreen(context) + decoration: isNarrowLoginScreen(context) ? loginBoxDecor : const BoxDecoration(), child: Row( children: [ - isNarrowScreen(context) + isNarrowLoginScreen(context) ? Container() : Expanded( flex: 7, diff --git a/lib/src/widgets/solid_login_helper.dart b/lib/src/widgets/solid_login_helper.dart index 10240ab..23a2bfc 100644 --- a/lib/src/widgets/solid_login_helper.dart +++ b/lib/src/widgets/solid_login_helper.dart @@ -42,10 +42,10 @@ const int veryNarrowScreenLimit = 750; double screenWidth(BuildContext context) => MediaQuery.of(context).size.width; -bool isNarrowScreen(BuildContext context) => +bool isNarrowLoginScreen(BuildContext context) => screenWidth(context) < narrowScreenLimit; -bool isVeryNarrowScreen(BuildContext context) => +bool isVeryNarrowLoginScreen(BuildContext context) => screenWidth(context) < veryNarrowScreenLimit; /// Button styles used in the Solid Login widget. diff --git a/lib/src/widgets/solid_login_panel.dart b/lib/src/widgets/solid_login_panel.dart index 2808275..b871ab8 100644 --- a/lib/src/widgets/solid_login_panel.dart +++ b/lib/src/widgets/solid_login_panel.dart @@ -170,7 +170,9 @@ class SolidLoginPanel { required SolidLoginThemeMode currentTheme, }) { final loginPanelInset = - (isVeryNarrowScreen(context) || !isNarrowScreen(context)) ? 0.05 : 0.25; + (isVeryNarrowLoginScreen(context) || !isNarrowLoginScreen(context)) + ? 0.05 + : 0.25; return Container( margin: EdgeInsets.symmetric( diff --git a/lib/src/widgets/solid_scaffold_appbar_builder.dart b/lib/src/widgets/solid_scaffold_appbar_builder.dart index 44569e2..3a607b9 100644 --- a/lib/src/widgets/solid_scaffold_appbar_builder.dart +++ b/lib/src/widgets/solid_scaffold_appbar_builder.dart @@ -67,8 +67,8 @@ class SolidScaffoldAppBarBuilder { hasLogout: true, ); - final isWideScreen = !hideNavRail && - SolidScaffoldHelpers.isWideScreen(context, narrowScreenThreshold); + final isNarrowScreen = hideNavRail || + SolidScaffoldHelpers.isNarrowScreen(context, narrowScreenThreshold); final screenWidth = MediaQuery.of(context).size.width; final theme = Theme.of(context); @@ -124,7 +124,7 @@ class SolidScaffoldAppBarBuilder { return AppBar( title: Text(config.title), backgroundColor: config.backgroundColor, - automaticallyImplyLeading: !isWideScreen, + automaticallyImplyLeading: isNarrowScreen, actions: actions.isEmpty ? null : actions, ); } diff --git a/lib/src/widgets/solid_scaffold_helpers.dart b/lib/src/widgets/solid_scaffold_helpers.dart index d044786..809dc1d 100644 --- a/lib/src/widgets/solid_scaffold_helpers.dart +++ b/lib/src/widgets/solid_scaffold_helpers.dart @@ -33,6 +33,7 @@ import 'package:flutter/material.dart'; import 'package:markdown_tooltip/markdown_tooltip.dart'; import 'package:version_widget/version_widget.dart'; +import 'package:solidui/src/constants/navigation.dart'; import 'package:solidui/src/widgets/solid_about_models.dart'; import 'package:solidui/src/widgets/solid_nav_models.dart'; import 'package:solidui/src/widgets/solid_overflow_menu_helpers.dart'; @@ -151,10 +152,56 @@ class SolidScaffoldHelpers { static List buildOverflowIconButtons(SolidAppBarConfig config) => SolidOverflowMenuHelpers.buildOverflowIconButtons(config); - /// Determines if screen is wide. + /// Determines if the screen width is below the narrow threshold. - static bool isWideScreen(BuildContext context, double narrowScreenThreshold) { - return MediaQuery.of(context).size.width > narrowScreenThreshold; + static bool isNarrowScreen( + BuildContext context, + double narrowScreenThreshold, + ) { + return MediaQuery.of(context).size.width < narrowScreenThreshold; + } + + /// Determines if the screen width is below the very narrow threshold. + + static bool isVeryNarrowScreen( + BuildContext context, { + double veryNarrowScreenThreshold = + NavigationConstants.veryNarrowScreenThreshold, + }) { + return MediaQuery.of(context).size.width < veryNarrowScreenThreshold; + } + + /// Determines if the screen width is between the narrow and wide thresholds + /// (medium range). + + static bool isMedScreen( + BuildContext context, { + double narrowThreshold = NavigationConstants.narrowScreenThreshold, + double wideThreshold = NavigationConstants.wideScreenThreshold, + }) { + final width = MediaQuery.of(context).size.width; + return width >= narrowThreshold && width < wideThreshold; + } + + /// Determines if the screen width is between the wide and very wide + /// thresholds. + + static bool isWideScreen( + BuildContext context, { + double wideThreshold = NavigationConstants.wideScreenThreshold, + double veryWideThreshold = NavigationConstants.veryWideScreenThreshold, + }) { + final width = MediaQuery.of(context).size.width; + return width >= wideThreshold && width < veryWideThreshold; + } + + /// Determines if the screen width exceeds the very wide threshold. + + static bool isVeryWideScreen( + BuildContext context, { + double veryWideThreshold = NavigationConstants.veryWideScreenThreshold, + }) { + return MediaQuery.of(context).size.width >= veryWideThreshold; } /// Gets effective child widget. diff --git a/lib/src/widgets/solid_scaffold_state.dart b/lib/src/widgets/solid_scaffold_state.dart index aba9363..e50e087 100644 --- a/lib/src/widgets/solid_scaffold_state.dart +++ b/lib/src/widgets/solid_scaffold_state.dart @@ -167,9 +167,9 @@ class SolidScaffoldState extends State { } } - bool _isWideScreen(BuildContext c) => - !widget.hideNavRail && - SolidScaffoldHelpers.isWideScreen(c, widget.narrowScreenThreshold); + bool _isNarrowScreen(BuildContext c) => + widget.hideNavRail || + SolidScaffoldHelpers.isNarrowScreen(c, widget.narrowScreenThreshold); bool _getUsesInternalManagement() => _cachedUsesInternalManagement ??= SolidScaffoldHelpers.getUsesInternalManagement(widget.themeToggle); @@ -188,13 +188,13 @@ class SolidScaffoldState extends State { @override Widget build(BuildContext context) { - final isWide = _isWideScreen(context); + final isNarrow = _isNarrowScreen(context); final isCompat = widget.menu == null; final bodyContent = isCompat ? widget.body : SolidScaffoldLayoutBuilder.buildBody( context, - isWide, + !isNarrow, SolidScaffoldHelpers.convertToNavTabs(widget.menu), _currentSelectedIndex, SolidScaffoldHelpers.getEffectiveChild( @@ -220,7 +220,7 @@ class SolidScaffoldState extends State { context: context, scaffoldKey: _scaffoldKey, widget: widget, - isWideScreen: isWide, + isWideScreen: !isNarrow, isCompatibilityMode: isCompat, bodyContent: bodyContent, isKeySaved: _isKeySaved, From 7c8699c3635ca9341f171538e257254fb11d95a6 Mon Sep 17 00:00:00 2001 From: Tony Chen Date: Tue, 17 Mar 2026 11:34:15 +1100 Subject: [PATCH 2/6] Export SolidScaffoldHelpers.isXScreen methods, and fix some minor issues --- lib/solidui.dart | 1 + .../solid_scaffold_appbar_builder.dart | 8 +++- ...solid_scaffold_appbar_ordered_actions.dart | 38 +++++++++++-------- .../solid_scaffold_appbar_overflow.dart | 10 ++--- lib/src/widgets/solid_scaffold_helpers.dart | 13 ++++--- lib/src/widgets/solid_scaffold_state.dart | 6 ++- 6 files changed, 47 insertions(+), 29 deletions(-) diff --git a/lib/solidui.dart b/lib/solidui.dart index 78963f5..21a2d6a 100644 --- a/lib/solidui.dart +++ b/lib/solidui.dart @@ -41,6 +41,7 @@ export 'src/widgets/solid_nav_models.dart'; export 'src/widgets/solid_scaffold.dart'; export 'src/widgets/solid_scaffold_controller.dart'; +export 'src/widgets/solid_scaffold_helpers.dart' show SolidScaffoldHelpers; export 'src/widgets/solid_scaffold_models.dart'; export 'src/widgets/solid_status_bar.dart'; diff --git a/lib/src/widgets/solid_scaffold_appbar_builder.dart b/lib/src/widgets/solid_scaffold_appbar_builder.dart index 3a607b9..67c6abc 100644 --- a/lib/src/widgets/solid_scaffold_appbar_builder.dart +++ b/lib/src/widgets/solid_scaffold_appbar_builder.dart @@ -68,7 +68,11 @@ class SolidScaffoldAppBarBuilder { ); final isNarrowScreen = hideNavRail || - SolidScaffoldHelpers.isNarrowScreen(context, narrowScreenThreshold); + SolidScaffoldHelpers.isNarrowScreen( + context, + narrowThreshold: narrowScreenThreshold, + ) || + SolidScaffoldHelpers.isVeryNarrowScreen(context); final screenWidth = MediaQuery.of(context).size.width; final theme = Theme.of(context); @@ -106,7 +110,7 @@ class SolidScaffoldAppBarBuilder { ); actions.addAll(orderedActions); - // Handle overflow menu if on narrow screen. + // Handle overflow menu if on very narrow screen. SolidAppBarOverflowHandler.handleOverflowMenu( actions, diff --git a/lib/src/widgets/solid_scaffold_appbar_ordered_actions.dart b/lib/src/widgets/solid_scaffold_appbar_ordered_actions.dart index e4b2aff..abffb9c 100644 --- a/lib/src/widgets/solid_scaffold_appbar_ordered_actions.dart +++ b/lib/src/widgets/solid_scaffold_appbar_ordered_actions.dart @@ -62,26 +62,32 @@ class SolidAppBarOrderedActionsBuilder { void Function(BuildContext)? onLogin, }) { final List<_OrderedAction> orderedActions = []; - final isNarrowScreen = screenWidth < config.narrowScreenThreshold; + final isVeryNarrowScreen = screenWidth < config.veryNarrowScreenThreshold; _addThemeToggle( orderedActions, themeToggle, config, screenWidth, - isNarrowScreen, + isVeryNarrowScreen, currentThemeMode, themeToggleCallback, ); - _addCustomActions(orderedActions, config, screenWidth, isNarrowScreen); - _addOverflowItems(orderedActions, config, isNarrowScreen); - _addAuthButton(orderedActions, onLogout, onLogin, isNarrowScreen, context); + _addCustomActions(orderedActions, config, screenWidth, isVeryNarrowScreen); + _addOverflowItems(orderedActions, config, isVeryNarrowScreen); + _addAuthButton( + orderedActions, + onLogout, + onLogin, + isVeryNarrowScreen, + context, + ); _addAboutButton( orderedActions, aboutConfig, config, screenWidth, - isNarrowScreen, + isVeryNarrowScreen, ); orderedActions.sort((a, b) => a.order.compareTo(b.order)); @@ -93,7 +99,7 @@ class SolidAppBarOrderedActionsBuilder { SolidThemeToggleConfig? themeToggle, SolidAppBarConfig config, double screenWidth, - bool isNarrowScreen, + bool isVeryNarrowScreen, ThemeMode currentThemeMode, VoidCallback? themeToggleCallback, ) { @@ -107,7 +113,7 @@ class SolidAppBarOrderedActionsBuilder { final order = actionConfig?.order ?? 0; final shouldShow = isVisible && - (!isNarrowScreen || !isInOverflow) && + (!isVeryNarrowScreen || !isInOverflow) && SolidAppBarVisibilityHelper.shouldShowThemeToggle( themeToggle, config, @@ -132,7 +138,7 @@ class SolidAppBarOrderedActionsBuilder { List<_OrderedAction> orderedActions, SolidAppBarConfig config, double screenWidth, - bool isNarrowScreen, + bool isVeryNarrowScreen, ) { for (int i = 0; i < config.actions.length; i++) { final action = config.actions[i]; @@ -143,7 +149,7 @@ class SolidAppBarOrderedActionsBuilder { final order = actionConfig?.order ?? (100 + i); final shouldShow = isVisible && - (!isNarrowScreen || !isInOverflow) && + (!isVeryNarrowScreen || !isInOverflow) && SolidAppBarVisibilityHelper.shouldShowAction( action, config, @@ -172,7 +178,7 @@ class SolidAppBarOrderedActionsBuilder { static void _addOverflowItems( List<_OrderedAction> orderedActions, SolidAppBarConfig config, - bool isNarrowScreen, + bool isVeryNarrowScreen, ) { for (int i = 0; i < config.overflowItems.length; i++) { final item = config.overflowItems[i]; @@ -181,7 +187,7 @@ class SolidAppBarOrderedActionsBuilder { final isInOverflow = actionConfig?.showInOverflow ?? true; final order = actionConfig?.order ?? (200 + i); - if (isVisible && (!isNarrowScreen || !isInOverflow)) { + if (isVisible && (!isVeryNarrowScreen || !isInOverflow)) { Widget iconButton = IconButton( icon: Icon(item.icon), onPressed: item.onSelected, @@ -200,7 +206,7 @@ class SolidAppBarOrderedActionsBuilder { List<_OrderedAction> orderedActions, void Function(BuildContext)? onLogout, void Function(BuildContext)? onLogin, - bool isNarrowScreen, + bool isVeryNarrowScreen, BuildContext context, ) { final actionConfig = SolidAppBarActionsManager.getActionConfig( @@ -210,7 +216,7 @@ class SolidAppBarOrderedActionsBuilder { final isInOverflow = actionConfig?.showInOverflow ?? false; final order = actionConfig?.order ?? 400; - if (isVisible && (!isNarrowScreen || !isInOverflow)) { + if (isVisible && (!isVeryNarrowScreen || !isInOverflow)) { orderedActions.add( _OrderedAction( order: order, @@ -225,7 +231,7 @@ class SolidAppBarOrderedActionsBuilder { SolidAboutConfig aboutConfig, SolidAppBarConfig config, double screenWidth, - bool isNarrowScreen, + bool isVeryNarrowScreen, ) { if (!aboutConfig.enabled || !aboutConfig.shouldShow( @@ -243,7 +249,7 @@ class SolidAppBarOrderedActionsBuilder { final isInOverflow = actionConfig?.showInOverflow ?? false; final order = actionConfig?.order ?? 900; - if (isVisible && (!isNarrowScreen || !isInOverflow)) { + if (isVisible && (!isVeryNarrowScreen || !isInOverflow)) { orderedActions.add( _OrderedAction( order: order, diff --git a/lib/src/widgets/solid_scaffold_appbar_overflow.dart b/lib/src/widgets/solid_scaffold_appbar_overflow.dart index ae95900..b089104 100644 --- a/lib/src/widgets/solid_scaffold_appbar_overflow.dart +++ b/lib/src/widgets/solid_scaffold_appbar_overflow.dart @@ -58,14 +58,14 @@ class SolidAppBarOverflowHandler { void Function(BuildContext)? onLogout, void Function(BuildContext)? onLogin, }) { - // Use narrowScreenThreshold to determine when to show overflow menu. + // Use veryNarrowScreenThreshold to determine when to show overflow menu. - final isNarrowScreen = screenWidth < config.narrowScreenThreshold; + final isVeryNarrowScreen = screenWidth < config.veryNarrowScreenThreshold; - // Only show overflow menu on narrow screens. - // On wide screens, all buttons are displayed directly in AppBar. + // Only show overflow menu on very narrow screens. + // On wider screens, all buttons are displayed directly in AppBar. - if (!isNarrowScreen) return; + if (!isVeryNarrowScreen) return; actions.add( _buildOverflowMenu( diff --git a/lib/src/widgets/solid_scaffold_helpers.dart b/lib/src/widgets/solid_scaffold_helpers.dart index 809dc1d..33fba27 100644 --- a/lib/src/widgets/solid_scaffold_helpers.dart +++ b/lib/src/widgets/solid_scaffold_helpers.dart @@ -152,13 +152,16 @@ class SolidScaffoldHelpers { static List buildOverflowIconButtons(SolidAppBarConfig config) => SolidOverflowMenuHelpers.buildOverflowIconButtons(config); - /// Determines if the screen width is below the narrow threshold. + /// Determines if the screen width is between the very narrow and narrow + /// thresholds. static bool isNarrowScreen( - BuildContext context, - double narrowScreenThreshold, - ) { - return MediaQuery.of(context).size.width < narrowScreenThreshold; + BuildContext context, { + double veryNarrowThreshold = NavigationConstants.veryNarrowScreenThreshold, + double narrowThreshold = NavigationConstants.narrowScreenThreshold, + }) { + final width = MediaQuery.of(context).size.width; + return width >= veryNarrowThreshold && width < narrowThreshold; } /// Determines if the screen width is below the very narrow threshold. diff --git a/lib/src/widgets/solid_scaffold_state.dart b/lib/src/widgets/solid_scaffold_state.dart index e50e087..4e904cc 100644 --- a/lib/src/widgets/solid_scaffold_state.dart +++ b/lib/src/widgets/solid_scaffold_state.dart @@ -169,7 +169,11 @@ class SolidScaffoldState extends State { bool _isNarrowScreen(BuildContext c) => widget.hideNavRail || - SolidScaffoldHelpers.isNarrowScreen(c, widget.narrowScreenThreshold); + SolidScaffoldHelpers.isNarrowScreen( + c, + narrowThreshold: widget.narrowScreenThreshold, + ) || + SolidScaffoldHelpers.isVeryNarrowScreen(c); bool _getUsesInternalManagement() => _cachedUsesInternalManagement ??= SolidScaffoldHelpers.getUsesInternalManagement(widget.themeToggle); From 3858efc624bbfd991f00677e8cc9c0d7b66d40df Mon Sep 17 00:00:00 2001 From: Tony Chen Date: Thu, 19 Mar 2026 15:10:55 +1100 Subject: [PATCH 3/6] Refine the code --- lib/src/constants/ui_window.dart | 79 ++++++++++--- .../solid_scaffold_appbar_builder.dart | 21 ++-- ...solid_scaffold_appbar_ordered_actions.dart | 22 ++-- .../solid_scaffold_appbar_overflow.dart | 6 +- .../solid_scaffold_appbar_visibility.dart | 18 +-- .../widgets/solid_scaffold_build_helper.dart | 2 + lib/src/widgets/solid_scaffold_helpers.dart | 65 +++++------ lib/src/widgets/solid_scaffold_state.dart | 104 +++++++++--------- .../solid_scaffold_widget_builder.dart | 4 +- 9 files changed, 175 insertions(+), 146 deletions(-) diff --git a/lib/src/constants/ui_window.dart b/lib/src/constants/ui_window.dart index 408d2ac..f841f5f 100644 --- a/lib/src/constants/ui_window.dart +++ b/lib/src/constants/ui_window.dart @@ -30,33 +30,78 @@ library; import 'package:flutter/material.dart'; -/// Thresholds for window size. +import 'package:solidui/src/constants/navigation.dart'; + +/// Responsive layout helpers using [LayoutBuilder] constraints. class WindowSize { /// Small width threshold. - static const double smallWidthLimit = 600; + static const double smallWidthLimit = + NavigationConstants.veryNarrowScreenThreshold; /// Small height threshold. static const double smallHeightLimit = 600; - /// Boolean describing whether the parent widget is narrow. - /// Derived from the box constraints found by LayoutBuilder(). - /// - /// Arguments: - /// - [constraints] - The box constraints of the parent widget - /// where LayoutBuilder() was called. + /// Legacy method — equivalent to [isVeryNarrow]. bool isNarrowWindow(BoxConstraints constraints) { - final bool isNarrow; - if (constraints.maxWidth < WindowSize.smallWidthLimit) { - isNarrow = true; - } else { - isNarrow = false; - } + return isVeryNarrow(constraints); + } + + /// Whether [constraints] width is below the very narrow threshold. + + static bool isVeryNarrow( + BoxConstraints constraints, { + double threshold = NavigationConstants.veryNarrowScreenThreshold, + }) { + return constraints.maxWidth < threshold; + } - return isNarrow; + /// Whether [constraints] width falls in the narrow range, i.e. between + /// [veryNarrowThreshold] (inclusive) and [narrowThreshold] (exclusive). + + static bool isNarrow( + BoxConstraints constraints, { + double veryNarrowThreshold = NavigationConstants.veryNarrowScreenThreshold, + double narrowThreshold = NavigationConstants.narrowScreenThreshold, + }) { + return constraints.maxWidth >= veryNarrowThreshold && + constraints.maxWidth < narrowThreshold; + } + + /// Whether [constraints] width falls in the medium range, i.e. between + /// [narrowThreshold] (inclusive) and [wideThreshold] (exclusive). + + static bool isMedium( + BoxConstraints constraints, { + double narrowThreshold = NavigationConstants.narrowScreenThreshold, + double wideThreshold = NavigationConstants.wideScreenThreshold, + }) { + return constraints.maxWidth >= narrowThreshold && + constraints.maxWidth < wideThreshold; + } + + /// Whether [constraints] width falls in the wide range, i.e. between + /// [wideThreshold] (inclusive) and [veryWideThreshold] (exclusive). + + static bool isWide( + BoxConstraints constraints, { + double wideThreshold = NavigationConstants.wideScreenThreshold, + double veryWideThreshold = NavigationConstants.veryWideScreenThreshold, + }) { + return constraints.maxWidth >= wideThreshold && + constraints.maxWidth < veryWideThreshold; + } + + /// Whether [constraints] width exceeds the very wide threshold. + + static bool isVeryWide( + BoxConstraints constraints, { + double threshold = NavigationConstants.veryWideScreenThreshold, + }) { + return constraints.maxWidth >= threshold; } } @@ -87,9 +132,7 @@ class ListItemSize { final double cardAspectRatio; - // Derive card aspect ratio (width / height). - - if (constraints.maxWidth < WindowSize.smallWidthLimit) { + if (WindowSize.isVeryNarrow(constraints)) { cardAspectRatio = constraints.maxWidth / compressedItemHeight; } else { cardAspectRatio = constraints.maxWidth / uncompressedItemHeight; diff --git a/lib/src/widgets/solid_scaffold_appbar_builder.dart b/lib/src/widgets/solid_scaffold_appbar_builder.dart index 87f483d..fbb7c2e 100644 --- a/lib/src/widgets/solid_scaffold_appbar_builder.dart +++ b/lib/src/widgets/solid_scaffold_appbar_builder.dart @@ -59,6 +59,7 @@ class SolidScaffoldAppBarBuilder { bool showLogout = true, void Function(BuildContext)? onLogout, void Function(BuildContext)? onLogin, + required BoxConstraints constraints, }) { SolidAppBarActionsManager.initializeIfNeeded( config, @@ -66,23 +67,19 @@ class SolidScaffoldAppBarBuilder { hasLogout: showLogout, ); + final layoutWidth = constraints.maxWidth; final isNarrowScreen = hideNavRail || SolidScaffoldHelpers.isNarrowScreen( - context, + constraints, narrowThreshold: narrowScreenThreshold, ) || - SolidScaffoldHelpers.isVeryNarrowScreen(context); - final screenWidth = MediaQuery.of(context).size.width; + SolidScaffoldHelpers.isVeryNarrowScreen(constraints); final theme = Theme.of(context); - // Build action buttons. - List actions = []; - // Add version widget if configured and screen is not too narrow. - if (config.versionConfig != null && - screenWidth >= config.veryNarrowScreenThreshold && + layoutWidth >= config.veryNarrowScreenThreshold && shouldShowVersion) { actions.add( SolidScaffoldHelpers.buildVersionWidget( @@ -94,11 +91,9 @@ class SolidScaffoldAppBarBuilder { actions.add(const Gap(8)); } - // Build ordered actions based on preferences. - final orderedActions = SolidAppBarOrderedActionsBuilder.build( config: config, - screenWidth: screenWidth, + layoutWidth: layoutWidth, themeToggle: themeToggle, currentThemeMode: currentThemeMode, themeToggleCallback: themeToggleCallback, @@ -110,12 +105,10 @@ class SolidScaffoldAppBarBuilder { ); actions.addAll(orderedActions); - // Handle overflow menu if on very narrow screen. - SolidAppBarOverflowHandler.handleOverflowMenu( actions, config, - screenWidth, + layoutWidth, themeToggle, currentThemeMode, themeToggleCallback, diff --git a/lib/src/widgets/solid_scaffold_appbar_ordered_actions.dart b/lib/src/widgets/solid_scaffold_appbar_ordered_actions.dart index 67a4995..69c1f04 100644 --- a/lib/src/widgets/solid_scaffold_appbar_ordered_actions.dart +++ b/lib/src/widgets/solid_scaffold_appbar_ordered_actions.dart @@ -52,7 +52,7 @@ class SolidAppBarOrderedActionsBuilder { static List build({ required SolidAppBarConfig config, - required double screenWidth, + required double layoutWidth, required SolidThemeToggleConfig? themeToggle, required ThemeMode currentThemeMode, required VoidCallback? themeToggleCallback, @@ -63,18 +63,18 @@ class SolidAppBarOrderedActionsBuilder { void Function(BuildContext)? onLogin, }) { final List<_OrderedAction> orderedActions = []; - final isVeryNarrowScreen = screenWidth < config.veryNarrowScreenThreshold; + final isVeryNarrowScreen = layoutWidth < config.veryNarrowScreenThreshold; _addThemeToggle( orderedActions, themeToggle, config, - screenWidth, + layoutWidth, isVeryNarrowScreen, currentThemeMode, themeToggleCallback, ); - _addCustomActions(orderedActions, config, screenWidth, isVeryNarrowScreen); + _addCustomActions(orderedActions, config, layoutWidth, isVeryNarrowScreen); _addOverflowItems(orderedActions, config, isVeryNarrowScreen); _addAuthButton( orderedActions, @@ -88,7 +88,7 @@ class SolidAppBarOrderedActionsBuilder { orderedActions, aboutConfig, config, - screenWidth, + layoutWidth, isVeryNarrowScreen, ); @@ -100,7 +100,7 @@ class SolidAppBarOrderedActionsBuilder { List<_OrderedAction> orderedActions, SolidThemeToggleConfig? themeToggle, SolidAppBarConfig config, - double screenWidth, + double layoutWidth, bool isVeryNarrowScreen, ThemeMode currentThemeMode, VoidCallback? themeToggleCallback, @@ -119,7 +119,7 @@ class SolidAppBarOrderedActionsBuilder { SolidAppBarVisibilityHelper.shouldShowThemeToggle( themeToggle, config, - screenWidth, + layoutWidth, ); if (shouldShow) { @@ -139,7 +139,7 @@ class SolidAppBarOrderedActionsBuilder { static void _addCustomActions( List<_OrderedAction> orderedActions, SolidAppBarConfig config, - double screenWidth, + double layoutWidth, bool isVeryNarrowScreen, ) { for (int i = 0; i < config.actions.length; i++) { @@ -155,7 +155,7 @@ class SolidAppBarOrderedActionsBuilder { SolidAppBarVisibilityHelper.shouldShowAction( action, config, - screenWidth, + layoutWidth, ); if (shouldShow) { @@ -238,12 +238,12 @@ class SolidAppBarOrderedActionsBuilder { List<_OrderedAction> orderedActions, SolidAboutConfig aboutConfig, SolidAppBarConfig config, - double screenWidth, + double layoutWidth, bool isVeryNarrowScreen, ) { if (!aboutConfig.enabled || !aboutConfig.shouldShow( - screenWidth, + layoutWidth, config.narrowScreenThreshold, config.veryNarrowScreenThreshold, )) { diff --git a/lib/src/widgets/solid_scaffold_appbar_overflow.dart b/lib/src/widgets/solid_scaffold_appbar_overflow.dart index b7d534a..f9e8ece 100644 --- a/lib/src/widgets/solid_scaffold_appbar_overflow.dart +++ b/lib/src/widgets/solid_scaffold_appbar_overflow.dart @@ -49,7 +49,7 @@ class SolidAppBarOverflowHandler { static void handleOverflowMenu( List actions, SolidAppBarConfig config, - double screenWidth, + double layoutWidth, SolidThemeToggleConfig? themeToggle, ThemeMode currentThemeMode, VoidCallback? themeToggleCallback, @@ -59,9 +59,7 @@ class SolidAppBarOverflowHandler { void Function(BuildContext)? onLogout, void Function(BuildContext)? onLogin, }) { - // Use veryNarrowScreenThreshold to determine when to show overflow menu. - - final isVeryNarrowScreen = screenWidth < config.veryNarrowScreenThreshold; + final isVeryNarrowScreen = layoutWidth < config.veryNarrowScreenThreshold; // Only show overflow menu on very narrow screens. // On wider screens, all buttons are displayed directly in AppBar. diff --git a/lib/src/widgets/solid_scaffold_appbar_visibility.dart b/lib/src/widgets/solid_scaffold_appbar_visibility.dart index b203dad..213b05c 100644 --- a/lib/src/widgets/solid_scaffold_appbar_visibility.dart +++ b/lib/src/widgets/solid_scaffold_appbar_visibility.dart @@ -34,38 +34,40 @@ import 'package:solidui/src/widgets/solid_theme_models.dart'; /// Provides visibility checks for AppBar actions. class SolidAppBarVisibilityHelper { - /// Determines if an action should be shown based on screen width. + /// Determines if an action should be shown based on the available + /// layout width from [LayoutBuilder] constraints. static bool shouldShowAction( SolidAppBarAction action, SolidAppBarConfig config, - double screenWidth, + double layoutWidth, ) { if (!action.showOnVeryNarrowScreen && - screenWidth < config.veryNarrowScreenThreshold) { + layoutWidth < config.veryNarrowScreenThreshold) { return false; } else if (!action.showOnNarrowScreen && - screenWidth < config.narrowScreenThreshold) { + layoutWidth < config.narrowScreenThreshold) { return false; } return true; } - /// Determines if theme toggle should be shown. + /// Determines if theme toggle should be shown based on the available + /// layout width from [LayoutBuilder] constraints. static bool shouldShowThemeToggle( SolidThemeToggleConfig? themeToggle, SolidAppBarConfig config, - double screenWidth, + double layoutWidth, ) { if (themeToggle == null || !themeToggle.enabled) return false; if (!themeToggle.showInAppBarActions) return false; if (!themeToggle.showOnVeryNarrowScreen && - screenWidth < config.veryNarrowScreenThreshold) { + layoutWidth < config.veryNarrowScreenThreshold) { return false; } else if (!themeToggle.showOnNarrowScreen && - screenWidth < config.narrowScreenThreshold) { + layoutWidth < config.narrowScreenThreshold) { return false; } diff --git a/lib/src/widgets/solid_scaffold_build_helper.dart b/lib/src/widgets/solid_scaffold_build_helper.dart index b878012..b154535 100644 --- a/lib/src/widgets/solid_scaffold_build_helper.dart +++ b/lib/src/widgets/solid_scaffold_build_helper.dart @@ -118,6 +118,7 @@ class SolidScaffoldBuildHelper { static Widget buildConfiguredScaffold({ required BuildContext context, + required BoxConstraints constraints, required GlobalKey scaffoldKey, required SolidScaffoldInternalConfig config, required bool isWideScreen, @@ -164,6 +165,7 @@ class SolidScaffoldBuildHelper { hideNavRail: config.hideNavRail, showLogout: config.onLogout != null, onLogout: config.onLogout, + constraints: constraints, ), ), buildDrawer: () { diff --git a/lib/src/widgets/solid_scaffold_helpers.dart b/lib/src/widgets/solid_scaffold_helpers.dart index c0ee5ad..d7770f3 100644 --- a/lib/src/widgets/solid_scaffold_helpers.dart +++ b/lib/src/widgets/solid_scaffold_helpers.dart @@ -33,7 +33,7 @@ import 'package:flutter/material.dart'; import 'package:markdown_tooltip/markdown_tooltip.dart'; import 'package:version_widget/version_widget.dart'; -import 'package:solidui/src/constants/navigation.dart'; +import 'package:solidui/src/constants/ui_window.dart'; import 'package:solidui/src/widgets/solid_about_models.dart'; import 'package:solidui/src/widgets/solid_nav_models.dart'; import 'package:solidui/src/widgets/solid_overflow_menu_helpers.dart'; @@ -152,59 +152,42 @@ class SolidScaffoldHelpers { static List buildOverflowIconButtons(SolidAppBarConfig config) => SolidOverflowMenuHelpers.buildOverflowIconButtons(config); - /// Determines if the screen width is between the very narrow and narrow - /// thresholds. + /// Delegates to [WindowSize.isNarrow] using [BoxConstraints]. - static bool isNarrowScreen( - BuildContext context, { - double veryNarrowThreshold = NavigationConstants.veryNarrowScreenThreshold, - double narrowThreshold = NavigationConstants.narrowScreenThreshold, + static bool isNarrowScreen(BoxConstraints constraints, { + double? narrowThreshold, }) { - final width = MediaQuery.of(context).size.width; - return width >= veryNarrowThreshold && width < narrowThreshold; + if (narrowThreshold != null) { + return WindowSize.isNarrow( + constraints, + narrowThreshold: narrowThreshold, + ); + } + return WindowSize.isNarrow(constraints); } - /// Determines if the screen width is below the very narrow threshold. + /// Delegates to [WindowSize.isVeryNarrow] using [BoxConstraints]. - static bool isVeryNarrowScreen( - BuildContext context, { - double veryNarrowScreenThreshold = - NavigationConstants.veryNarrowScreenThreshold, - }) { - return MediaQuery.of(context).size.width < veryNarrowScreenThreshold; + static bool isVeryNarrowScreen(BoxConstraints constraints) { + return WindowSize.isVeryNarrow(constraints); } - /// Determines if the screen width is between the narrow and wide thresholds - /// (medium range). + /// Delegates to [WindowSize.isMedium] using [BoxConstraints]. - static bool isMedScreen( - BuildContext context, { - double narrowThreshold = NavigationConstants.narrowScreenThreshold, - double wideThreshold = NavigationConstants.wideScreenThreshold, - }) { - final width = MediaQuery.of(context).size.width; - return width >= narrowThreshold && width < wideThreshold; + static bool isMedScreen(BoxConstraints constraints) { + return WindowSize.isMedium(constraints); } - /// Determines if the screen width is between the wide and very wide - /// thresholds. + /// Delegates to [WindowSize.isWide] using [BoxConstraints]. - static bool isWideScreen( - BuildContext context, { - double wideThreshold = NavigationConstants.wideScreenThreshold, - double veryWideThreshold = NavigationConstants.veryWideScreenThreshold, - }) { - final width = MediaQuery.of(context).size.width; - return width >= wideThreshold && width < veryWideThreshold; + static bool isWideScreen(BoxConstraints constraints) { + return WindowSize.isWide(constraints); } - /// Determines if the screen width exceeds the very wide threshold. + /// Delegates to [WindowSize.isVeryWide] using [BoxConstraints]. - static bool isVeryWideScreen( - BuildContext context, { - double veryWideThreshold = NavigationConstants.veryWideScreenThreshold, - }) { - return MediaQuery.of(context).size.width >= veryWideThreshold; + static bool isVeryWideScreen(BoxConstraints constraints) { + return WindowSize.isVeryWide(constraints); } /// Gets effective child widget. @@ -307,6 +290,7 @@ class SolidScaffoldHelpers { bool showLogout = true, void Function(BuildContext)? onLogout, void Function(BuildContext)? onLogin, + required BoxConstraints constraints, }) { if (appBar == null) return null; if (appBar is! SolidAppBarConfig) return null; @@ -324,6 +308,7 @@ class SolidScaffoldHelpers { showLogout: showLogout, onLogout: onLogout, onLogin: onLogin, + constraints: constraints, ); } diff --git a/lib/src/widgets/solid_scaffold_state.dart b/lib/src/widgets/solid_scaffold_state.dart index 4e904cc..c69323a 100644 --- a/lib/src/widgets/solid_scaffold_state.dart +++ b/lib/src/widgets/solid_scaffold_state.dart @@ -167,13 +167,14 @@ class SolidScaffoldState extends State { } } - bool _isNarrowScreen(BuildContext c) => - widget.hideNavRail || - SolidScaffoldHelpers.isNarrowScreen( - c, - narrowThreshold: widget.narrowScreenThreshold, - ) || - SolidScaffoldHelpers.isVeryNarrowScreen(c); + bool _isNarrowScreen(BoxConstraints constraints) { + return widget.hideNavRail || + SolidScaffoldHelpers.isNarrowScreen( + constraints, + narrowThreshold: widget.narrowScreenThreshold, + ) || + SolidScaffoldHelpers.isVeryNarrowScreen(constraints); + } bool _getUsesInternalManagement() => _cachedUsesInternalManagement ??= SolidScaffoldHelpers.getUsesInternalManagement(widget.themeToggle); @@ -192,49 +193,54 @@ class SolidScaffoldState extends State { @override Widget build(BuildContext context) { - final isNarrow = _isNarrowScreen(context); - final isCompat = widget.menu == null; - final bodyContent = isCompat - ? widget.body - : SolidScaffoldLayoutBuilder.buildBody( - context, - !isNarrow, - SolidScaffoldHelpers.convertToNavTabs(widget.menu), - _currentSelectedIndex, - SolidScaffoldHelpers.getEffectiveChild( - widget.menu, - _currentSelectedIndex, - widget.child, - widget.body, - widget.bodyOverride ?? widget.controller?.currentSubpage, - ), - _onMenuSelected, - widget.onShowAlert, - ); - - return NotificationListener( - onNotification: (n) { - Future.delayed(const Duration(milliseconds: 300), () { - securityKeyNotifier.refreshStatus(); - _loadCurrentWebId(); - }); - return true; + return LayoutBuilder( + builder: (context, constraints) { + final isNarrow = _isNarrowScreen(constraints); + final isCompat = widget.menu == null; + final bodyContent = isCompat + ? widget.body + : SolidScaffoldLayoutBuilder.buildBody( + context, + !isNarrow, + SolidScaffoldHelpers.convertToNavTabs(widget.menu), + _currentSelectedIndex, + SolidScaffoldHelpers.getEffectiveChild( + widget.menu, + _currentSelectedIndex, + widget.child, + widget.body, + widget.bodyOverride ?? widget.controller?.currentSubpage, + ), + _onMenuSelected, + widget.onShowAlert, + ); + + return NotificationListener( + onNotification: (n) { + Future.delayed(const Duration(milliseconds: 300), () { + securityKeyNotifier.refreshStatus(); + _loadCurrentWebId(); + }); + return true; + }, + child: SolidScaffoldWidgetBuilder.buildFromWidget( + context: context, + constraints: constraints, + scaffoldKey: _scaffoldKey, + widget: widget, + isWideScreen: !isNarrow, + isCompatibilityMode: isCompat, + bodyContent: bodyContent, + isKeySaved: _isKeySaved, + currentSelectedIndex: _currentSelectedIndex, + onMenuSelected: _onMenuSelected, + getUsesInternalManagement: _getUsesInternalManagement, + shouldShowVersion: _shouldShowVersion, + getVersionToDisplay: _getVersionToDisplay, + currentWebId: _currentWebId, + ), + ); }, - child: SolidScaffoldWidgetBuilder.buildFromWidget( - context: context, - scaffoldKey: _scaffoldKey, - widget: widget, - isWideScreen: !isNarrow, - isCompatibilityMode: isCompat, - bodyContent: bodyContent, - isKeySaved: _isKeySaved, - currentSelectedIndex: _currentSelectedIndex, - onMenuSelected: _onMenuSelected, - getUsesInternalManagement: _getUsesInternalManagement, - shouldShowVersion: _shouldShowVersion, - getVersionToDisplay: _getVersionToDisplay, - currentWebId: _currentWebId, - ), ); } } diff --git a/lib/src/widgets/solid_scaffold_widget_builder.dart b/lib/src/widgets/solid_scaffold_widget_builder.dart index 1fe7559..b0461c4 100644 --- a/lib/src/widgets/solid_scaffold_widget_builder.dart +++ b/lib/src/widgets/solid_scaffold_widget_builder.dart @@ -91,6 +91,7 @@ class SolidScaffoldWidgetBuilder { static Widget buildFromWidget({ required BuildContext context, + required BoxConstraints constraints, required GlobalKey scaffoldKey, required SolidScaffold widget, required bool isWideScreen, @@ -104,8 +105,6 @@ class SolidScaffoldWidgetBuilder { required String Function() getVersionToDisplay, String? currentWebId, }) { - // Get the effective login/logout callbacks (built-in or custom). - final effectiveLogout = _getEffectiveLogout(widget); final effectiveLogin = _getEffectiveLogin(widget); @@ -144,6 +143,7 @@ class SolidScaffoldWidgetBuilder { showLogout: widget.showLogout, onLogout: effectiveLogout, onLogin: effectiveLogin, + constraints: constraints, ), ), buildDrawer: () { From c7f0352234a09602c595fd16b6c3ba3924e87e57 Mon Sep 17 00:00:00 2001 From: Tony Chen Date: Thu, 19 Mar 2026 15:17:02 +1100 Subject: [PATCH 4/6] Lint --- lib/src/widgets/solid_scaffold_helpers.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/widgets/solid_scaffold_helpers.dart b/lib/src/widgets/solid_scaffold_helpers.dart index d7770f3..d6783b2 100644 --- a/lib/src/widgets/solid_scaffold_helpers.dart +++ b/lib/src/widgets/solid_scaffold_helpers.dart @@ -154,7 +154,8 @@ class SolidScaffoldHelpers { /// Delegates to [WindowSize.isNarrow] using [BoxConstraints]. - static bool isNarrowScreen(BoxConstraints constraints, { + static bool isNarrowScreen( + BoxConstraints constraints, { double? narrowThreshold, }) { if (narrowThreshold != null) { From 3cd942dc4dfd85bf202eda3ce2d1b64708e43d9e Mon Sep 17 00:00:00 2001 From: Tony Chen Date: Thu, 19 Mar 2026 15:26:39 +1100 Subject: [PATCH 5/6] Replace MediaQuery.of(context).size with MediaQuery.sizeOf(context) --- .../initial_setup_widgets/res_create_form_submission.dart | 2 +- lib/src/widgets/build_message_container.dart | 2 +- lib/src/widgets/shared_resources_table.dart | 2 +- lib/src/widgets/solid_file_helpers.dart | 4 ++-- lib/src/widgets/solid_login_helper.dart | 2 +- lib/src/widgets/solid_login_panel.dart | 2 +- lib/src/widgets/solid_nav_bar.dart | 2 +- lib/src/widgets/solid_nav_drawer.dart | 2 +- lib/src/widgets/solid_nav_drawer_header.dart | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/src/screens/initial_setup_widgets/res_create_form_submission.dart b/lib/src/screens/initial_setup_widgets/res_create_form_submission.dart index c1d4282..7ccd850 100644 --- a/lib/src/screens/initial_setup_widgets/res_create_form_submission.dart +++ b/lib/src/screens/initial_setup_widgets/res_create_form_submission.dart @@ -59,7 +59,7 @@ ElevatedButton resCreateFormSubmission( // Use MediaQuery to determine the screen width and adjust the font size // accordingly. - final screenWidth = MediaQuery.of(context).size.width; + final screenWidth = MediaQuery.sizeOf(context).width; final isSmallDevice = screenWidth < 360; // A threshold for small devices, can be adjusted. diff --git a/lib/src/widgets/build_message_container.dart b/lib/src/widgets/build_message_container.dart index 75ae5ac..7f479ab 100644 --- a/lib/src/widgets/build_message_container.dart +++ b/lib/src/widgets/build_message_container.dart @@ -95,7 +95,7 @@ Container buildMsgBox( // ignore: unused_local_variable var isRTL = false; - final size = MediaQuery.of(context).size; + final size = MediaQuery.sizeOf(context); final loc = Localizations.maybeLocaleOf(context); final localeLanguageCode = loc?.languageCode; diff --git a/lib/src/widgets/shared_resources_table.dart b/lib/src/widgets/shared_resources_table.dart index 1c6d3d7..e071ae6 100644 --- a/lib/src/widgets/shared_resources_table.dart +++ b/lib/src/widgets/shared_resources_table.dart @@ -49,7 +49,7 @@ Widget buildSharedResourcesTable( Map sharedResMap, Widget parentWidget, ) { - final cWidth = MediaQuery.of(context).size.width * 0.18; + final cWidth = MediaQuery.sizeOf(context).width * 0.18; DataColumn buildDataColumn(String title, String tooltip) { return DataColumn( label: Expanded(child: Center(child: Text(title))), diff --git a/lib/src/widgets/solid_file_helpers.dart b/lib/src/widgets/solid_file_helpers.dart index 992c22e..355b522 100644 --- a/lib/src/widgets/solid_file_helpers.dart +++ b/lib/src/widgets/solid_file_helpers.dart @@ -45,7 +45,7 @@ class SolidFileHelpers { if (forceWideScreen != null) { return forceWideScreen; } - return MediaQuery.of(context).size.width > 800; + return MediaQuery.sizeOf(context).width > 800; } /// Gets the effective browser height. @@ -54,7 +54,7 @@ class SolidFileHelpers { if (browserHeight != null) { return browserHeight; } - return MediaQuery.of(context).size.height * 0.7; + return MediaQuery.sizeOf(context).height * 0.7; } /// Gets the effective upload configuration, either from the provided config diff --git a/lib/src/widgets/solid_login_helper.dart b/lib/src/widgets/solid_login_helper.dart index 23a2bfc..e9d748f 100644 --- a/lib/src/widgets/solid_login_helper.dart +++ b/lib/src/widgets/solid_login_helper.dart @@ -40,7 +40,7 @@ import 'package:markdown_tooltip/markdown_tooltip.dart'; const int narrowScreenLimit = 1175; const int veryNarrowScreenLimit = 750; -double screenWidth(BuildContext context) => MediaQuery.of(context).size.width; +double screenWidth(BuildContext context) => MediaQuery.sizeOf(context).width; bool isNarrowLoginScreen(BuildContext context) => screenWidth(context) < narrowScreenLimit; diff --git a/lib/src/widgets/solid_login_panel.dart b/lib/src/widgets/solid_login_panel.dart index b871ab8..494b7c1 100644 --- a/lib/src/widgets/solid_login_panel.dart +++ b/lib/src/widgets/solid_login_panel.dart @@ -110,7 +110,7 @@ class SolidLoginPanel { if (isRequired) Expanded( child: SizedBox( - width: MediaQuery.of(context).size.width * 0.5, + width: MediaQuery.sizeOf(context).width * 0.5, child: infoButton, ), ), diff --git a/lib/src/widgets/solid_nav_bar.dart b/lib/src/widgets/solid_nav_bar.dart index 9d42f20..3ac8bf5 100644 --- a/lib/src/widgets/solid_nav_bar.dart +++ b/lib/src/widgets/solid_nav_bar.dart @@ -100,7 +100,7 @@ class SolidNavBar extends StatelessWidget { child: SingleChildScrollView( child: ConstrainedBox( constraints: BoxConstraints( - minHeight: MediaQuery.of(context).size.height, + minHeight: MediaQuery.sizeOf(context).height, ), child: IntrinsicHeight( child: NavigationRail( diff --git a/lib/src/widgets/solid_nav_drawer.dart b/lib/src/widgets/solid_nav_drawer.dart index 53ea331..08c0f56 100644 --- a/lib/src/widgets/solid_nav_drawer.dart +++ b/lib/src/widgets/solid_nav_drawer.dart @@ -153,7 +153,7 @@ class _SolidNavDrawerState extends State { ), ), child: ListView( - padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top), + padding: EdgeInsets.only(top: MediaQuery.paddingOf(context).top), children: [ if (widget.userInfo != null) SolidNavDrawerHeader.build( diff --git a/lib/src/widgets/solid_nav_drawer_header.dart b/lib/src/widgets/solid_nav_drawer_header.dart index 21c0e3f..356ecfd 100644 --- a/lib/src/widgets/solid_nav_drawer_header.dart +++ b/lib/src/widgets/solid_nav_drawer_header.dart @@ -57,7 +57,7 @@ class SolidNavDrawerHeader { return Container( padding: EdgeInsets.only( top: NavigationConstants.userHeaderTopPadding + - MediaQuery.of(context).padding.top, + MediaQuery.paddingOf(context).top, bottom: bottomPadding, ), decoration: BoxDecoration(color: theme.colorScheme.primaryContainer), From 64833c70cabe8d9a8b824831adda7141747cb2ef Mon Sep 17 00:00:00 2001 From: Jess Moore Date: Thu, 26 Mar 2026 10:24:39 +1100 Subject: [PATCH 6/6] update changelog and bump version --- CHANGELOG.md | 1 + pubspec.yaml | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7f5ffc..5262111 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ au](https://solidcommunity.au/docs/solidui) ## 0.4.0 Refine and Tune ++ Adds additional layout width checks [0.3.6 20260326 tonypioneer] + Add checkbox and new webid widgets to SolidLogin() [0.3.5 20260325 tonypioneer] + Add WebID to SetupWizard [0.3.4 20260325 tonypioneer] + Login again if webid changed [0.3.3 20260319 tonypioneer] diff --git a/pubspec.yaml b/pubspec.yaml index 6bfbe33..d4b2155 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,10 +1,10 @@ name: solidui -description: "A UI library for building Solid applications with Flutter." -version: 0.3.5 +description: 'A UI library for building Solid applications with Flutter.' +version: 0.3.6 homepage: https://github.com/anusii/solidui environment: - sdk: ">=3.2.3 <4.0.0" + sdk: '>=3.2.3 <4.0.0' # To automatically upgrade package dependencies to the latest versions: #