From 8bdb34ae2dddece4caec0eb3e0c0634ee7b1195e Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Thu, 8 Aug 2024 22:23:31 +0200 Subject: [PATCH 01/17] Add breakpoint extension to get the current active breakpoint --- .../lib/src/breakpoints.dart | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index aa8e744b344..47bbc946fd2 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -216,3 +216,49 @@ class Breakpoint { return isWidthActive && isHeightActive && isRightPlatform; } } + +/// An extension on [BuildContext] that returns the active [Breakpoint] based on +/// an available [SlotLayout] ancestor or the default breakpoints. +extension BreakpointExtension on BuildContext { + /// Returns the currently active [Breakpoint]. + Breakpoint get activeBreakpoint { + final SlotLayout? slotLayout = findAncestorWidgetOfExactType(); + if (slotLayout != null) { + for (final MapEntry config + in slotLayout.config.entries) { + if (config.key.isActive(this)) { + return config.key; + } + } + } + + final TargetPlatform platform = Theme.of(this).platform; + + if (Breakpoint.desktop.contains(platform)) { + if (Breakpoints.extraLarge.isActive(this)) { + return Breakpoints.extraLargeDesktop; + } else if (Breakpoints.large.isActive(this)) { + return Breakpoints.largeDesktop; + } else if (Breakpoints.mediumLarge.isActive(this)) { + return Breakpoints.mediumLargeDesktop; + } else if (Breakpoints.medium.isActive(this)) { + return Breakpoints.mediumDesktop; + } else if (Breakpoints.small.isActive(this)) { + return Breakpoints.smallDesktop; + } + } else if (Breakpoint.mobile.contains(platform)) { + if (Breakpoints.extraLarge.isActive(this)) { + return Breakpoints.extraLargeMobile; + } else if (Breakpoints.large.isActive(this)) { + return Breakpoints.largeMobile; + } else if (Breakpoints.mediumLarge.isActive(this)) { + return Breakpoints.mediumLargeMobile; + } else if (Breakpoints.medium.isActive(this)) { + return Breakpoints.mediumMobile; + } else if (Breakpoints.small.isActive(this)) { + return Breakpoints.smallMobile; + } + } + return Breakpoints.standard; + } +} From 4ce6c5abe99561538ab4167717399fc2c78762da Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Mon, 12 Aug 2024 21:37:41 +0200 Subject: [PATCH 02/17] As static --- .../lib/src/breakpoints.dart | 30 ++++++++----------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 47bbc946fd2..2beadabff41 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -215,47 +215,43 @@ class Breakpoint { return isWidthActive && isHeightActive && isRightPlatform; } -} -/// An extension on [BuildContext] that returns the active [Breakpoint] based on -/// an available [SlotLayout] ancestor or the default breakpoints. -extension BreakpointExtension on BuildContext { /// Returns the currently active [Breakpoint]. - Breakpoint get activeBreakpoint { + Breakpoint activeBreakpointOf(BuildContext context) { final SlotLayout? slotLayout = findAncestorWidgetOfExactType(); if (slotLayout != null) { for (final MapEntry config in slotLayout.config.entries) { - if (config.key.isActive(this)) { + if (config.key.isActive(context)) { return config.key; } } } - final TargetPlatform platform = Theme.of(this).platform; + final TargetPlatform platform = Theme.of(context).platform; if (Breakpoint.desktop.contains(platform)) { - if (Breakpoints.extraLarge.isActive(this)) { + if (Breakpoints.extraLarge.isActive(context)) { return Breakpoints.extraLargeDesktop; - } else if (Breakpoints.large.isActive(this)) { + } else if (Breakpoints.large.isActive(context)) { return Breakpoints.largeDesktop; - } else if (Breakpoints.mediumLarge.isActive(this)) { + } else if (Breakpoints.mediumLarge.isActive(context)) { return Breakpoints.mediumLargeDesktop; - } else if (Breakpoints.medium.isActive(this)) { + } else if (Breakpoints.medium.isActive(context)) { return Breakpoints.mediumDesktop; - } else if (Breakpoints.small.isActive(this)) { + } else if (Breakpoints.small.isActive(context)) { return Breakpoints.smallDesktop; } } else if (Breakpoint.mobile.contains(platform)) { - if (Breakpoints.extraLarge.isActive(this)) { + if (Breakpoints.extraLarge.isActive(context)) { return Breakpoints.extraLargeMobile; - } else if (Breakpoints.large.isActive(this)) { + } else if (Breakpoints.large.isActive(context)) { return Breakpoints.largeMobile; - } else if (Breakpoints.mediumLarge.isActive(this)) { + } else if (Breakpoints.mediumLarge.isActive(context)) { return Breakpoints.mediumLargeMobile; - } else if (Breakpoints.medium.isActive(this)) { + } else if (Breakpoints.medium.isActive(context)) { return Breakpoints.mediumMobile; - } else if (Breakpoints.small.isActive(this)) { + } else if (Breakpoints.small.isActive(context)) { return Breakpoints.smallMobile; } } From 48f1d7c33b8884851b2414f6abb1ae7018dafaef Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Tue, 13 Aug 2024 16:35:37 +0200 Subject: [PATCH 03/17] Fix tests --- .../lib/src/breakpoints.dart | 21 ++++- .../test/breakpoint_test.dart | 88 +++++++++++++++++++ 2 files changed, 106 insertions(+), 3 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 2beadabff41..9eb4a18ba8e 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -4,6 +4,8 @@ import 'package:flutter/material.dart'; +import '../flutter_adaptive_scaffold.dart'; + /// A group of standard breakpoints built according to the material /// specifications for screen width size. /// @@ -217,15 +219,28 @@ class Breakpoint { } /// Returns the currently active [Breakpoint]. - Breakpoint activeBreakpointOf(BuildContext context) { - final SlotLayout? slotLayout = findAncestorWidgetOfExactType(); + static Breakpoint activeBreakpointOf(BuildContext context) { + final SlotLayout? slotLayout = + context.findAncestorWidgetOfExactType(); + if (slotLayout != null) { + Breakpoint? fallbackBreakpoint; + for (final MapEntry config in slotLayout.config.entries) { if (config.key.isActive(context)) { - return config.key; + if (config.key.platform != null) { + return config.key; + } else { + fallbackBreakpoint ??= config.key; + } } } + + // If no breakpoint with a platform is found, return the fallback breakpoint. + if (fallbackBreakpoint != null) { + return fallbackBreakpoint; + } } final TargetPlatform platform = Theme.of(context).platform; diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index e990b3a7f91..4b0a622439b 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -99,6 +99,94 @@ void main() { await tester.pumpAndSettle(); expect(DummyWidget.built, isFalse); }); + + testWidgets( + 'activeBreakpointOf returns correct breakpoints on mobile devices', + (WidgetTester tester) async { + // Small layout on mobile + await tester.pumpWidget(SimulatedLayout.small.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf( + tester.element(find.byKey(const Key('Breakpoints.smallMobile')))), + Breakpoints.smallMobile); + + // Medium layout on mobile + await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf( + tester.element(find.byKey(const Key('Breakpoints.mediumMobile')))), + Breakpoints.mediumMobile); + + // MediumLarge layout on mobile + await tester.pumpWidget(SimulatedLayout.mediumLarge.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf(tester + .element(find.byKey(const Key('Breakpoints.mediumLargeMobile')))), + Breakpoints.mediumLargeMobile); + + // Large layout on mobile + await tester.pumpWidget(SimulatedLayout.large.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf( + tester.element(find.byKey(const Key('Breakpoints.largeMobile')))), + Breakpoints.largeMobile); + + // ExtraLarge layout on mobile + await tester.pumpWidget(SimulatedLayout.extraLarge.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf(tester + .element(find.byKey(const Key('Breakpoints.extraLargeMobile')))), + Breakpoints.extraLargeMobile); + }, variant: TargetPlatformVariant.mobile()); + + testWidgets( + 'activeBreakpointOf returns correct breakpoints on desktop devices', + (WidgetTester tester) async { + // Small layout on desktop + await tester.pumpWidget(SimulatedLayout.small.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf( + tester.element(find.byKey(const Key('Breakpoints.smallDesktop')))), + Breakpoints.smallDesktop); + + // Medium layout on desktop + await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf( + tester.element(find.byKey(const Key('Breakpoints.mediumDesktop')))), + Breakpoints.mediumDesktop); + + // MediumLarge layout on desktop + await tester.pumpWidget(SimulatedLayout.mediumLarge.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf(tester + .element(find.byKey(const Key('Breakpoints.mediumLargeDesktop')))), + Breakpoints.mediumLargeDesktop); + + // Large layout on desktop + await tester.pumpWidget(SimulatedLayout.large.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf( + tester.element(find.byKey(const Key('Breakpoints.largeDesktop')))), + Breakpoints.largeDesktop); + + // ExtraLarge layout on desktop + await tester.pumpWidget(SimulatedLayout.extraLarge.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf(tester + .element(find.byKey(const Key('Breakpoints.extraLargeDesktop')))), + Breakpoints.extraLargeDesktop); + }, variant: TargetPlatformVariant.desktop()); } class DummyWidget extends StatelessWidget { From 4c7b87552bd5c781438f8c7b28c9ec821d4cb121 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Tue, 13 Aug 2024 16:37:17 +0200 Subject: [PATCH 04/17] Update version --- packages/flutter_adaptive_scaffold/CHANGELOG.md | 4 ++++ packages/flutter_adaptive_scaffold/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/flutter_adaptive_scaffold/CHANGELOG.md b/packages/flutter_adaptive_scaffold/CHANGELOG.md index 5d65f72a5ef..de6a772e820 100644 --- a/packages/flutter_adaptive_scaffold/CHANGELOG.md +++ b/packages/flutter_adaptive_scaffold/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.1 + +* Add `Breakpoint.activeBreakpointOf(context)` to find the currently active breakpoint. + ## 0.2.0 * Add breakpoints for mediumLarge and extraLarge. diff --git a/packages/flutter_adaptive_scaffold/pubspec.yaml b/packages/flutter_adaptive_scaffold/pubspec.yaml index 504f5257c9a..a4b7215af98 100644 --- a/packages/flutter_adaptive_scaffold/pubspec.yaml +++ b/packages/flutter_adaptive_scaffold/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_adaptive_scaffold description: Widgets to easily build adaptive layouts, including navigation elements. -version: 0.2.0 +version: 0.2.1 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+flutter_adaptive_scaffold%22 repository: https://github.com/flutter/packages/tree/main/packages/flutter_adaptive_scaffold From c74479eb770a2079b21240a7a128d7653e1f8cb8 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Tue, 13 Aug 2024 17:11:24 +0200 Subject: [PATCH 05/17] Fixes --- .../lib/src/breakpoints.dart | 78 ++++++++++++------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 9eb4a18ba8e..14a7b4b831a 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -224,7 +224,7 @@ class Breakpoint { context.findAncestorWidgetOfExactType(); if (slotLayout != null) { - Breakpoint? fallbackBreakpoint; + Breakpoint? nonPlatformBreakpoint; for (final MapEntry config in slotLayout.config.entries) { @@ -232,42 +232,60 @@ class Breakpoint { if (config.key.platform != null) { return config.key; } else { - fallbackBreakpoint ??= config.key; + nonPlatformBreakpoint ??= config.key; } } } - - // If no breakpoint with a platform is found, return the fallback breakpoint. - if (fallbackBreakpoint != null) { - return fallbackBreakpoint; + if (nonPlatformBreakpoint != null) { + return nonPlatformBreakpoint; } } final TargetPlatform platform = Theme.of(context).platform; - - if (Breakpoint.desktop.contains(platform)) { - if (Breakpoints.extraLarge.isActive(context)) { - return Breakpoints.extraLargeDesktop; - } else if (Breakpoints.large.isActive(context)) { - return Breakpoints.largeDesktop; - } else if (Breakpoints.mediumLarge.isActive(context)) { - return Breakpoints.mediumLargeDesktop; - } else if (Breakpoints.medium.isActive(context)) { - return Breakpoints.mediumDesktop; - } else if (Breakpoints.small.isActive(context)) { - return Breakpoints.smallDesktop; - } - } else if (Breakpoint.mobile.contains(platform)) { - if (Breakpoints.extraLarge.isActive(context)) { - return Breakpoints.extraLargeMobile; - } else if (Breakpoints.large.isActive(context)) { - return Breakpoints.largeMobile; - } else if (Breakpoints.mediumLarge.isActive(context)) { - return Breakpoints.mediumLargeMobile; - } else if (Breakpoints.medium.isActive(context)) { - return Breakpoints.mediumMobile; - } else if (Breakpoints.small.isActive(context)) { - return Breakpoints.smallMobile; + final bool isDesktop = Breakpoint.desktop.contains(platform); + final bool isMobile = Breakpoint.mobile.contains(platform); + + for (final Breakpoint breakpoint in [ + Breakpoints.extraLarge, + Breakpoints.large, + Breakpoints.mediumLarge, + Breakpoints.medium, + Breakpoints.small, + ]) { + if (breakpoint.isActive(context)) { + if (isDesktop) { + switch (breakpoint) { + case Breakpoints.extraLarge: + return Breakpoints.extraLargeDesktop; + case Breakpoints.large: + return Breakpoints.largeDesktop; + case Breakpoints.mediumLarge: + return Breakpoints.mediumLargeDesktop; + case Breakpoints.medium: + return Breakpoints.mediumDesktop; + case Breakpoints.small: + return Breakpoints.smallDesktop; + default: + return Breakpoints.standard; + } + } else if (isMobile) { + switch (breakpoint) { + case Breakpoints.extraLarge: + return Breakpoints.extraLargeMobile; + case Breakpoints.large: + return Breakpoints.largeMobile; + case Breakpoints.mediumLarge: + return Breakpoints.mediumLargeMobile; + case Breakpoints.medium: + return Breakpoints.mediumMobile; + case Breakpoints.small: + return Breakpoints.smallMobile; + default: + return Breakpoints.standard; + } + } else { + return breakpoint; + } } } return Breakpoints.standard; From 56240d25d0975869be4c110e93cc328d622522d4 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Tue, 13 Aug 2024 17:17:13 +0200 Subject: [PATCH 06/17] And up --- .../lib/src/breakpoints.dart | 60 ++++++++++++------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 14a7b4b831a..2d0bc766471 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -219,7 +219,10 @@ class Breakpoint { } /// Returns the currently active [Breakpoint]. - static Breakpoint activeBreakpointOf(BuildContext context) { + static Breakpoint activeBreakpointOf( + BuildContext context, { + bool andUp = false, + }) { final SlotLayout? slotLayout = context.findAncestorWidgetOfExactType(); @@ -246,40 +249,55 @@ class Breakpoint { final bool isMobile = Breakpoint.mobile.contains(platform); for (final Breakpoint breakpoint in [ - Breakpoints.extraLarge, - Breakpoints.large, - Breakpoints.mediumLarge, - Breakpoints.medium, Breakpoints.small, + Breakpoints.medium, + Breakpoints.mediumLarge, + Breakpoints.large, + Breakpoints.extraLarge, ]) { if (breakpoint.isActive(context)) { - if (isDesktop) { + if (andUp) { switch (breakpoint) { - case Breakpoints.extraLarge: - return Breakpoints.extraLargeDesktop; - case Breakpoints.large: - return Breakpoints.largeDesktop; - case Breakpoints.mediumLarge: - return Breakpoints.mediumLargeDesktop; + case Breakpoints.small: + return Breakpoints.smallAndUp; case Breakpoints.medium: - return Breakpoints.mediumDesktop; + return Breakpoints.mediumAndUp; + case Breakpoints.mediumLarge: + return Breakpoints.mediumLargeAndUp; + case Breakpoints.large: + return Breakpoints.largeAndUp; + case Breakpoints.extraLarge: + return Breakpoints.extraLarge; + default: + return Breakpoints.standard; + } + } else if (isDesktop) { + switch (breakpoint) { case Breakpoints.small: return Breakpoints.smallDesktop; + case Breakpoints.medium: + return Breakpoints.mediumDesktop; + case Breakpoints.mediumLarge: + return Breakpoints.mediumLargeDesktop; + case Breakpoints.large: + return Breakpoints.largeDesktop; + case Breakpoints.extraLarge: + return Breakpoints.extraLargeDesktop; default: return Breakpoints.standard; } } else if (isMobile) { switch (breakpoint) { - case Breakpoints.extraLarge: - return Breakpoints.extraLargeMobile; - case Breakpoints.large: - return Breakpoints.largeMobile; - case Breakpoints.mediumLarge: - return Breakpoints.mediumLargeMobile; - case Breakpoints.medium: - return Breakpoints.mediumMobile; case Breakpoints.small: return Breakpoints.smallMobile; + case Breakpoints.medium: + return Breakpoints.mediumMobile; + case Breakpoints.mediumLarge: + return Breakpoints.mediumLargeMobile; + case Breakpoints.large: + return Breakpoints.largeMobile; + case Breakpoints.extraLarge: + return Breakpoints.extraLargeMobile; default: return Breakpoints.standard; } From 51b8d93c076438ceb10681a6ca2ea09699146c96 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Tue, 13 Aug 2024 17:21:16 +0200 Subject: [PATCH 07/17] Fix --- .../lib/src/breakpoints.dart | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 2d0bc766471..0d8d0cf2ea5 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -219,10 +219,7 @@ class Breakpoint { } /// Returns the currently active [Breakpoint]. - static Breakpoint activeBreakpointOf( - BuildContext context, { - bool andUp = false, - }) { + static Breakpoint activeBreakpointOf(BuildContext context) { final SlotLayout? slotLayout = context.findAncestorWidgetOfExactType(); @@ -256,22 +253,7 @@ class Breakpoint { Breakpoints.extraLarge, ]) { if (breakpoint.isActive(context)) { - if (andUp) { - switch (breakpoint) { - case Breakpoints.small: - return Breakpoints.smallAndUp; - case Breakpoints.medium: - return Breakpoints.mediumAndUp; - case Breakpoints.mediumLarge: - return Breakpoints.mediumLargeAndUp; - case Breakpoints.large: - return Breakpoints.largeAndUp; - case Breakpoints.extraLarge: - return Breakpoints.extraLarge; - default: - return Breakpoints.standard; - } - } else if (isDesktop) { + if (isDesktop) { switch (breakpoint) { case Breakpoints.small: return Breakpoints.smallDesktop; From 65b9be477fa2e0c745697ed03948fa9ea0a2e8bd Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 14 Aug 2024 17:09:33 +0200 Subject: [PATCH 08/17] Rename --- .../flutter_adaptive_scaffold/lib/src/breakpoints.dart | 8 ++++---- .../flutter_adaptive_scaffold/lib/src/slot_layout.dart | 8 +++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 0d8d0cf2ea5..0c5d34698e2 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -224,7 +224,7 @@ class Breakpoint { context.findAncestorWidgetOfExactType(); if (slotLayout != null) { - Breakpoint? nonPlatformBreakpoint; + Breakpoint? fallbackBreakpoint; for (final MapEntry config in slotLayout.config.entries) { @@ -232,12 +232,12 @@ class Breakpoint { if (config.key.platform != null) { return config.key; } else { - nonPlatformBreakpoint ??= config.key; + fallbackBreakpoint ??= config.key; } } } - if (nonPlatformBreakpoint != null) { - return nonPlatformBreakpoint; + if (fallbackBreakpoint != null) { + return fallbackBreakpoint; } } diff --git a/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart b/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart index 38789fb8660..88935fce97d 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart @@ -20,11 +20,17 @@ class SlotLayout extends StatefulWidget { static SlotLayoutConfig? pickWidget( BuildContext context, Map config) { SlotLayoutConfig? chosenWidget; + SlotLayoutConfig? fallbackWidget; config.forEach((Breakpoint breakpoint, SlotLayoutConfig? pickedWidget) { if (breakpoint.isActive(context)) { - chosenWidget = pickedWidget; + if (breakpoint.platform != null) { + chosenWidget = pickedWidget; + } else if (pickedWidget != null) { + fallbackWidget = pickedWidget; + } } }); + chosenWidget ??= fallbackWidget; return chosenWidget; } From a9d8a3c5d966868402999e4876edc98af46dd2c0 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 14 Aug 2024 21:21:19 +0200 Subject: [PATCH 09/17] Split up methods --- .../lib/src/breakpoints.dart | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 0c5d34698e2..71e61bfca81 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -218,14 +218,13 @@ class Breakpoint { return isWidthActive && isHeightActive && isRightPlatform; } - /// Returns the currently active [Breakpoint]. - static Breakpoint activeBreakpointOf(BuildContext context) { + /// Returns the currently active [Breakpoint] based on the [SlotLayout] in the + /// context. + static Breakpoint? maybeActiveBreakpointFromSlotLayout(BuildContext context) { final SlotLayout? slotLayout = context.findAncestorWidgetOfExactType(); - + Breakpoint? fallbackBreakpoint; if (slotLayout != null) { - Breakpoint? fallbackBreakpoint; - for (final MapEntry config in slotLayout.config.entries) { if (config.key.isActive(context)) { @@ -236,11 +235,12 @@ class Breakpoint { } } } - if (fallbackBreakpoint != null) { - return fallbackBreakpoint; - } } + return fallbackBreakpoint; + } + /// Returns the default [Breakpoint] based on the [BuildContext]. + static Breakpoint defaultBreakpointOf(BuildContext context) { final TargetPlatform platform = Theme.of(context).platform; final bool isDesktop = Breakpoint.desktop.contains(platform); final bool isMobile = Breakpoint.mobile.contains(platform); @@ -290,4 +290,14 @@ class Breakpoint { } return Breakpoints.standard; } + + /// Returns the currently active [Breakpoint]. + static Breakpoint activeBreakpointOf(BuildContext context) { + final Breakpoint? slotBreakpoint = + maybeActiveBreakpointFromSlotLayout(context); + if (slotBreakpoint != null) { + return slotBreakpoint; + } + return defaultBreakpointOf(context); + } } From 446914721fac774f4fa8269243ec40cd482e27dd Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 14 Aug 2024 21:31:07 +0200 Subject: [PATCH 10/17] Tests --- .../example/test/main_test.dart | 2 +- .../test/breakpoint_test.dart | 227 ++++++++++++------ 2 files changed, 150 insertions(+), 79 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/example/test/main_test.dart b/packages/flutter_adaptive_scaffold/example/test/main_test.dart index e7b11ec00fb..13d79832c21 100644 --- a/packages/flutter_adaptive_scaffold/example/test/main_test.dart +++ b/packages/flutter_adaptive_scaffold/example/test/main_test.dart @@ -38,7 +38,7 @@ void main() { await tester.pumpAndSettle(); } - testWidgets('dislays correct item of config based on screen width', + testWidgets('displays correct item of config based on screen width', (WidgetTester tester) async { await updateScreen(300, tester); expect(smallBody, findsOneWidget); diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index 4b0a622439b..ce4e1b6023a 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -100,93 +100,164 @@ void main() { expect(DummyWidget.built, isFalse); }); - testWidgets( - 'activeBreakpointOf returns correct breakpoints on mobile devices', - (WidgetTester tester) async { - // Small layout on mobile - await tester.pumpWidget(SimulatedLayout.small.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf( - tester.element(find.byKey(const Key('Breakpoints.smallMobile')))), - Breakpoints.smallMobile); +// Test the `maybeActiveBreakpointFromSlotLayout` method + group('maybeActiveBreakpointFromSlotLayout', () { + testWidgets('returns correct breakpoint from SlotLayout on mobile devices', + (WidgetTester tester) async { + // Small layout on mobile + await tester.pumpWidget(SimulatedLayout.small.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.maybeActiveBreakpointFromSlotLayout( + tester.element(find.byKey(const Key('Breakpoints.smallMobile')))), + Breakpoints.smallMobile); - // Medium layout on mobile - await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf( - tester.element(find.byKey(const Key('Breakpoints.mediumMobile')))), - Breakpoints.mediumMobile); + // Medium layout on mobile + await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.maybeActiveBreakpointFromSlotLayout(tester + .element(find.byKey(const Key('Breakpoints.mediumMobile')))), + Breakpoints.mediumMobile); - // MediumLarge layout on mobile - await tester.pumpWidget(SimulatedLayout.mediumLarge.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf(tester - .element(find.byKey(const Key('Breakpoints.mediumLargeMobile')))), - Breakpoints.mediumLargeMobile); + // Large layout on mobile + await tester.pumpWidget(SimulatedLayout.large.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.maybeActiveBreakpointFromSlotLayout( + tester.element(find.byKey(const Key('Breakpoints.largeMobile')))), + Breakpoints.largeMobile); + }, variant: TargetPlatformVariant.mobile()); - // Large layout on mobile - await tester.pumpWidget(SimulatedLayout.large.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf( - tester.element(find.byKey(const Key('Breakpoints.largeMobile')))), - Breakpoints.largeMobile); + testWidgets('returns correct breakpoint from SlotLayout on desktop devices', + (WidgetTester tester) async { + // Small layout on desktop + await tester.pumpWidget(SimulatedLayout.small.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.maybeActiveBreakpointFromSlotLayout(tester + .element(find.byKey(const Key('Breakpoints.smallDesktop')))), + Breakpoints.smallDesktop); - // ExtraLarge layout on mobile - await tester.pumpWidget(SimulatedLayout.extraLarge.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf(tester - .element(find.byKey(const Key('Breakpoints.extraLargeMobile')))), - Breakpoints.extraLargeMobile); - }, variant: TargetPlatformVariant.mobile()); + // Medium layout on desktop + await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.maybeActiveBreakpointFromSlotLayout(tester + .element(find.byKey(const Key('Breakpoints.mediumDesktop')))), + Breakpoints.mediumDesktop); - testWidgets( - 'activeBreakpointOf returns correct breakpoints on desktop devices', - (WidgetTester tester) async { - // Small layout on desktop - await tester.pumpWidget(SimulatedLayout.small.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf( - tester.element(find.byKey(const Key('Breakpoints.smallDesktop')))), - Breakpoints.smallDesktop); + // Large layout on desktop + await tester.pumpWidget(SimulatedLayout.large.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.maybeActiveBreakpointFromSlotLayout(tester + .element(find.byKey(const Key('Breakpoints.largeDesktop')))), + Breakpoints.largeDesktop); + }, variant: TargetPlatformVariant.desktop()); + }); - // Medium layout on desktop - await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf( - tester.element(find.byKey(const Key('Breakpoints.mediumDesktop')))), - Breakpoints.mediumDesktop); + // Test the `defaultBreakpointOf` method + group('defaultBreakpointOf', () { + testWidgets('returns correct default breakpoint on mobile devices', + (WidgetTester tester) async { + // Small layout on mobile + await tester.pumpWidget(SimulatedLayout.small.slot(tester)); + await tester.pumpAndSettle(); + expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + Breakpoints.smallMobile); - // MediumLarge layout on desktop - await tester.pumpWidget(SimulatedLayout.mediumLarge.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf(tester - .element(find.byKey(const Key('Breakpoints.mediumLargeDesktop')))), - Breakpoints.mediumLargeDesktop); + // Medium layout on mobile + await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); + await tester.pumpAndSettle(); + expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + Breakpoints.mediumMobile); - // Large layout on desktop - await tester.pumpWidget(SimulatedLayout.large.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf( - tester.element(find.byKey(const Key('Breakpoints.largeDesktop')))), - Breakpoints.largeDesktop); + // Large layout on mobile + await tester.pumpWidget(SimulatedLayout.large.slot(tester)); + await tester.pumpAndSettle(); + expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + Breakpoints.largeMobile); + }, variant: TargetPlatformVariant.mobile()); - // ExtraLarge layout on desktop - await tester.pumpWidget(SimulatedLayout.extraLarge.slot(tester)); - await tester.pumpAndSettle(); - expect( - Breakpoint.activeBreakpointOf(tester - .element(find.byKey(const Key('Breakpoints.extraLargeDesktop')))), - Breakpoints.extraLargeDesktop); - }, variant: TargetPlatformVariant.desktop()); + testWidgets('returns correct default breakpoint on desktop devices', + (WidgetTester tester) async { + // Small layout on desktop + await tester.pumpWidget(SimulatedLayout.small.slot(tester)); + await tester.pumpAndSettle(); + expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + Breakpoints.smallDesktop); + + // Medium layout on desktop + await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); + await tester.pumpAndSettle(); + expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + Breakpoints.mediumDesktop); + + // Large layout on desktop + await tester.pumpWidget(SimulatedLayout.large.slot(tester)); + await tester.pumpAndSettle(); + expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + Breakpoints.largeDesktop); + }, variant: TargetPlatformVariant.desktop()); + }); + + // Test the `activeBreakpointOf` method + group('activeBreakpointOf', () { + testWidgets('returns correct active breakpoint on mobile devices', + (WidgetTester tester) async { + // Small layout on mobile + await tester.pumpWidget(SimulatedLayout.small.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf( + tester.element(find.byKey(const Key('Breakpoints.smallMobile')))), + Breakpoints.smallMobile); + + // Medium layout on mobile + await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf(tester + .element(find.byKey(const Key('Breakpoints.mediumMobile')))), + Breakpoints.mediumMobile); + + // Large layout on mobile + await tester.pumpWidget(SimulatedLayout.large.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf( + tester.element(find.byKey(const Key('Breakpoints.largeMobile')))), + Breakpoints.largeMobile); + }, variant: TargetPlatformVariant.mobile()); + + testWidgets('returns correct active breakpoint on desktop devices', + (WidgetTester tester) async { + // Small layout on desktop + await tester.pumpWidget(SimulatedLayout.small.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf(tester + .element(find.byKey(const Key('Breakpoints.smallDesktop')))), + Breakpoints.smallDesktop); + + // Medium layout on desktop + await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf(tester + .element(find.byKey(const Key('Breakpoints.mediumDesktop')))), + Breakpoints.mediumDesktop); + + // Large layout on desktop + await tester.pumpWidget(SimulatedLayout.large.slot(tester)); + await tester.pumpAndSettle(); + expect( + Breakpoint.activeBreakpointOf(tester + .element(find.byKey(const Key('Breakpoints.largeDesktop')))), + Breakpoints.largeDesktop); + }, variant: TargetPlatformVariant.desktop()); + }); } class DummyWidget extends StatelessWidget { From 89a277f4a47387c144e9a9e6a42a1a56971d04f8 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 14 Aug 2024 22:05:16 +0200 Subject: [PATCH 11/17] Fix --- .../test/breakpoint_test.dart | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index ce4e1b6023a..0f585669b39 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -185,19 +185,25 @@ void main() { // Small layout on desktop await tester.pumpWidget(SimulatedLayout.small.slot(tester)); await tester.pumpAndSettle(); - expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + expect( + Breakpoint.defaultBreakpointOf( + tester.element(find.byType(Directionality))), Breakpoints.smallDesktop); // Medium layout on desktop await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); await tester.pumpAndSettle(); - expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + expect( + Breakpoint.defaultBreakpointOf( + tester.element(find.byType(Directionality))), Breakpoints.mediumDesktop); // Large layout on desktop await tester.pumpWidget(SimulatedLayout.large.slot(tester)); await tester.pumpAndSettle(); - expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), + expect( + Breakpoint.defaultBreakpointOf( + tester.element(find.byType(Directionality))), Breakpoints.largeDesktop); }, variant: TargetPlatformVariant.desktop()); }); From 69a951b5574e302d07dc15484322e40646e68f0e Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Wed, 14 Aug 2024 22:06:17 +0200 Subject: [PATCH 12/17] Fix --- .../flutter_adaptive_scaffold/lib/src/breakpoints.dart | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 71e61bfca81..0415026d285 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -293,11 +293,7 @@ class Breakpoint { /// Returns the currently active [Breakpoint]. static Breakpoint activeBreakpointOf(BuildContext context) { - final Breakpoint? slotBreakpoint = - maybeActiveBreakpointFromSlotLayout(context); - if (slotBreakpoint != null) { - return slotBreakpoint; - } - return defaultBreakpointOf(context); + return maybeActiveBreakpointFromSlotLayout(context) ?? + defaultBreakpointOf(context); } } From 68cd508626979840cfdc259d30bbcc35f6be3ad9 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Thu, 15 Aug 2024 16:48:00 +0200 Subject: [PATCH 13/17] Fix --- .../lib/src/breakpoints.dart | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 0415026d285..89df434f0b2 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -195,6 +195,7 @@ class Breakpoint { bool isActive(BuildContext context) { final TargetPlatform host = Theme.of(context).platform; final bool isRightPlatform = platform?.contains(host) ?? true; + final bool isDesktop = Breakpoint.desktop.contains(host); final double width = MediaQuery.sizeOf(context).width; final double height = MediaQuery.sizeOf(context).height; @@ -210,10 +211,11 @@ class Breakpoint { ? width >= lowerBoundWidth : width >= lowerBoundWidth && width < upperBoundWidth; - final bool isHeightActive = (orientation == Orientation.landscape && - height >= lowerBoundHeight && - height < upperBoundHeight) || - orientation == Orientation.portrait; + final bool isHeightActive = + !isDesktop && orientation == Orientation.portrait || + (orientation == Orientation.landscape && + height >= lowerBoundHeight && + height < upperBoundHeight); return isWidthActive && isHeightActive && isRightPlatform; } @@ -241,9 +243,9 @@ class Breakpoint { /// Returns the default [Breakpoint] based on the [BuildContext]. static Breakpoint defaultBreakpointOf(BuildContext context) { - final TargetPlatform platform = Theme.of(context).platform; - final bool isDesktop = Breakpoint.desktop.contains(platform); - final bool isMobile = Breakpoint.mobile.contains(platform); + final TargetPlatform host = Theme.of(context).platform; + final bool isDesktop = Breakpoint.desktop.contains(host); + final bool isMobile = Breakpoint.mobile.contains(host); for (final Breakpoint breakpoint in [ Breakpoints.small, From e78e4ee89adaab7cb9fc66637e58406789b45d4f Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Thu, 15 Aug 2024 17:07:27 +0200 Subject: [PATCH 14/17] Fixes --- packages/flutter_adaptive_scaffold/CHANGELOG.md | 1 + .../example/test/main_test.dart | 10 +++++----- .../flutter_adaptive_scaffold/lib/src/breakpoints.dart | 10 +++++----- .../flutter_adaptive_scaffold/lib/src/slot_layout.dart | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/CHANGELOG.md b/packages/flutter_adaptive_scaffold/CHANGELOG.md index de6a772e820..b5b63762bfc 100644 --- a/packages/flutter_adaptive_scaffold/CHANGELOG.md +++ b/packages/flutter_adaptive_scaffold/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.2.1 * Add `Breakpoint.activeBreakpointOf(context)` to find the currently active breakpoint. +* Don't check for height on Desktop platforms ## 0.2.0 diff --git a/packages/flutter_adaptive_scaffold/example/test/main_test.dart b/packages/flutter_adaptive_scaffold/example/test/main_test.dart index 13d79832c21..26e03899e1b 100644 --- a/packages/flutter_adaptive_scaffold/example/test/main_test.dart +++ b/packages/flutter_adaptive_scaffold/example/test/main_test.dart @@ -42,7 +42,7 @@ void main() { (WidgetTester tester) async { await updateScreen(300, tester); expect(smallBody, findsOneWidget); - expect(sBody, findsNothing); + expect(body, findsNothing); expect(mediumLargeBody, findsNothing); expect(largeBody, findsNothing); expect(extraLargeBody, findsNothing); @@ -60,7 +60,7 @@ void main() { await updateScreen(800, tester); expect(smallBody, findsNothing); - expect(sBody, findsOneWidget); + expect(body, findsOneWidget); expect(mediumLargeBody, findsNothing); expect(largeBody, findsNothing); expect(extraLargeBody, findsNothing); @@ -78,7 +78,7 @@ void main() { await updateScreen(1100, tester); expect(smallBody, findsNothing); - expect(sBody, findsNothing); + expect(body, findsNothing); expect(mediumLargeBody, findsOneWidget); expect(largeBody, findsNothing); expect(extraLargeBody, findsNothing); @@ -96,7 +96,7 @@ void main() { await updateScreen(1400, tester); expect(smallBody, findsNothing); - expect(sBody, findsNothing); + expect(body, findsNothing); expect(mediumLargeBody, findsNothing); expect(largeBody, findsOneWidget); expect(extraLargeBody, findsNothing); @@ -114,7 +114,7 @@ void main() { await updateScreen(1800, tester); expect(smallBody, findsNothing); - expect(sBody, findsNothing); + expect(body, findsNothing); expect(mediumLargeBody, findsNothing); expect(largeBody, findsNothing); expect(extraLargeBody, findsOneWidget); diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 89df434f0b2..beddb144ea7 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -211,11 +211,11 @@ class Breakpoint { ? width >= lowerBoundWidth : width >= lowerBoundWidth && width < upperBoundWidth; - final bool isHeightActive = - !isDesktop && orientation == Orientation.portrait || - (orientation == Orientation.landscape && - height >= lowerBoundHeight && - height < upperBoundHeight); + final bool isHeightActive = isDesktop || + orientation == Orientation.portrait || + (orientation == Orientation.landscape && + height >= lowerBoundHeight && + height < upperBoundHeight); return isWidthActive && isHeightActive && isRightPlatform; } diff --git a/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart b/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart index 88935fce97d..37b9a6e0e81 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart @@ -25,7 +25,7 @@ class SlotLayout extends StatefulWidget { if (breakpoint.isActive(context)) { if (breakpoint.platform != null) { chosenWidget = pickedWidget; - } else if (pickedWidget != null) { + } else if (chosenWidget == null && pickedWidget != null) { fallbackWidget = pickedWidget; } } From 892796e6b50a8fb1b27538b434f096f98e7499d3 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Thu, 15 Aug 2024 20:57:26 +0200 Subject: [PATCH 15/17] Fix --- .../lib/src/breakpoints.dart | 1 + .../lib/src/slot_layout.dart | 23 ++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index beddb144ea7..286a49811f1 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -226,6 +226,7 @@ class Breakpoint { final SlotLayout? slotLayout = context.findAncestorWidgetOfExactType(); Breakpoint? fallbackBreakpoint; + if (slotLayout != null) { for (final MapEntry config in slotLayout.config.entries) { diff --git a/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart b/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart index 37b9a6e0e81..bbece310843 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart @@ -20,17 +20,24 @@ class SlotLayout extends StatefulWidget { static SlotLayoutConfig? pickWidget( BuildContext context, Map config) { SlotLayoutConfig? chosenWidget; - SlotLayoutConfig? fallbackWidget; - config.forEach((Breakpoint breakpoint, SlotLayoutConfig? pickedWidget) { + + for (final Breakpoint breakpoint in config.keys) { if (breakpoint.isActive(context)) { - if (breakpoint.platform != null) { - chosenWidget = pickedWidget; - } else if (chosenWidget == null && pickedWidget != null) { - fallbackWidget = pickedWidget; + final SlotLayoutConfig? pickedWidget = config[breakpoint]; + if (pickedWidget != null) { + if (breakpoint.platform != null) { + // Prioritize platform-specific breakpoints + return pickedWidget; + } else { + // Fallback to non-platform-specific + chosenWidget = pickedWidget; + } + } else { + chosenWidget = null; } } - }); - chosenWidget ??= fallbackWidget; + } + return chosenWidget; } From a687748f25ce265fcb9107760134a37e0342481a Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Thu, 15 Aug 2024 22:20:27 +0200 Subject: [PATCH 16/17] Spelling --- .../flutter_adaptive_scaffold/CHANGELOG.md | 2 +- .../lib/src/slot_layout.dart | 6 ++-- .../test/breakpoint_test.dart | 36 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/CHANGELOG.md b/packages/flutter_adaptive_scaffold/CHANGELOG.md index b5b63762bfc..8b4782b0d34 100644 --- a/packages/flutter_adaptive_scaffold/CHANGELOG.md +++ b/packages/flutter_adaptive_scaffold/CHANGELOG.md @@ -1,7 +1,7 @@ ## 0.2.1 * Add `Breakpoint.activeBreakpointOf(context)` to find the currently active breakpoint. -* Don't check for height on Desktop platforms +* Don't check for height on Desktop platforms. ## 0.2.0 diff --git a/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart b/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart index bbece310843..07cfea33a9d 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/slot_layout.dart @@ -15,7 +15,7 @@ class SlotLayout extends StatefulWidget { /// Creates a [SlotLayout] widget. const SlotLayout({required this.config, super.key}); - /// Given a context and a config, it returns the [SlotLayoutConfig] that will g + /// Given a context and a config, it returns the [SlotLayoutConfig] that will /// be chosen from the config under the context's conditions. static SlotLayoutConfig? pickWidget( BuildContext context, Map config) { @@ -26,10 +26,10 @@ class SlotLayout extends StatefulWidget { final SlotLayoutConfig? pickedWidget = config[breakpoint]; if (pickedWidget != null) { if (breakpoint.platform != null) { - // Prioritize platform-specific breakpoints + // Prioritize platform-specific breakpoints. return pickedWidget; } else { - // Fallback to non-platform-specific + // Fallback to non-platform-specific. chosenWidget = pickedWidget; } } else { diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index 0f585669b39..4391e1f021e 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -100,7 +100,7 @@ void main() { expect(DummyWidget.built, isFalse); }); -// Test the `maybeActiveBreakpointFromSlotLayout` method +// Test the `maybeActiveBreakpointFromSlotLayout` method. group('maybeActiveBreakpointFromSlotLayout', () { testWidgets('returns correct breakpoint from SlotLayout on mobile devices', (WidgetTester tester) async { @@ -112,7 +112,7 @@ void main() { tester.element(find.byKey(const Key('Breakpoints.smallMobile')))), Breakpoints.smallMobile); - // Medium layout on mobile + // Medium layout on mobile. await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); await tester.pumpAndSettle(); expect( @@ -120,7 +120,7 @@ void main() { .element(find.byKey(const Key('Breakpoints.mediumMobile')))), Breakpoints.mediumMobile); - // Large layout on mobile + // Large layout on mobile. await tester.pumpWidget(SimulatedLayout.large.slot(tester)); await tester.pumpAndSettle(); expect( @@ -131,7 +131,7 @@ void main() { testWidgets('returns correct breakpoint from SlotLayout on desktop devices', (WidgetTester tester) async { - // Small layout on desktop + // Small layout on desktop. await tester.pumpWidget(SimulatedLayout.small.slot(tester)); await tester.pumpAndSettle(); expect( @@ -139,7 +139,7 @@ void main() { .element(find.byKey(const Key('Breakpoints.smallDesktop')))), Breakpoints.smallDesktop); - // Medium layout on desktop + // Medium layout on desktop. await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); await tester.pumpAndSettle(); expect( @@ -147,7 +147,7 @@ void main() { .element(find.byKey(const Key('Breakpoints.mediumDesktop')))), Breakpoints.mediumDesktop); - // Large layout on desktop + // Large layout on desktop. await tester.pumpWidget(SimulatedLayout.large.slot(tester)); await tester.pumpAndSettle(); expect( @@ -157,7 +157,7 @@ void main() { }, variant: TargetPlatformVariant.desktop()); }); - // Test the `defaultBreakpointOf` method + // Test the `defaultBreakpointOf` method. group('defaultBreakpointOf', () { testWidgets('returns correct default breakpoint on mobile devices', (WidgetTester tester) async { @@ -167,13 +167,13 @@ void main() { expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), Breakpoints.smallMobile); - // Medium layout on mobile + // Medium layout on mobile. await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); await tester.pumpAndSettle(); expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), Breakpoints.mediumMobile); - // Large layout on mobile + // Large layout on mobile. await tester.pumpWidget(SimulatedLayout.large.slot(tester)); await tester.pumpAndSettle(); expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), @@ -182,7 +182,7 @@ void main() { testWidgets('returns correct default breakpoint on desktop devices', (WidgetTester tester) async { - // Small layout on desktop + // Small layout on desktop. await tester.pumpWidget(SimulatedLayout.small.slot(tester)); await tester.pumpAndSettle(); expect( @@ -190,7 +190,7 @@ void main() { tester.element(find.byType(Directionality))), Breakpoints.smallDesktop); - // Medium layout on desktop + // Medium layout on desktop. await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); await tester.pumpAndSettle(); expect( @@ -198,7 +198,7 @@ void main() { tester.element(find.byType(Directionality))), Breakpoints.mediumDesktop); - // Large layout on desktop + // Large layout on desktop. await tester.pumpWidget(SimulatedLayout.large.slot(tester)); await tester.pumpAndSettle(); expect( @@ -208,7 +208,7 @@ void main() { }, variant: TargetPlatformVariant.desktop()); }); - // Test the `activeBreakpointOf` method + // Test the `activeBreakpointOf` method. group('activeBreakpointOf', () { testWidgets('returns correct active breakpoint on mobile devices', (WidgetTester tester) async { @@ -220,7 +220,7 @@ void main() { tester.element(find.byKey(const Key('Breakpoints.smallMobile')))), Breakpoints.smallMobile); - // Medium layout on mobile + // Medium layout on mobile. await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); await tester.pumpAndSettle(); expect( @@ -228,7 +228,7 @@ void main() { .element(find.byKey(const Key('Breakpoints.mediumMobile')))), Breakpoints.mediumMobile); - // Large layout on mobile + // Large layout on mobile. await tester.pumpWidget(SimulatedLayout.large.slot(tester)); await tester.pumpAndSettle(); expect( @@ -239,7 +239,7 @@ void main() { testWidgets('returns correct active breakpoint on desktop devices', (WidgetTester tester) async { - // Small layout on desktop + // Small layout on desktop. await tester.pumpWidget(SimulatedLayout.small.slot(tester)); await tester.pumpAndSettle(); expect( @@ -247,7 +247,7 @@ void main() { .element(find.byKey(const Key('Breakpoints.smallDesktop')))), Breakpoints.smallDesktop); - // Medium layout on desktop + // Medium layout on desktop. await tester.pumpWidget(SimulatedLayout.medium.slot(tester)); await tester.pumpAndSettle(); expect( @@ -255,7 +255,7 @@ void main() { .element(find.byKey(const Key('Breakpoints.mediumDesktop')))), Breakpoints.mediumDesktop); - // Large layout on desktop + // Large layout on desktop. await tester.pumpWidget(SimulatedLayout.large.slot(tester)); await tester.pumpAndSettle(); expect( From 10cbd430cec5864cd9efaa9900abe1f5d7ce5275 Mon Sep 17 00:00:00 2001 From: Martijn van Dijk Date: Thu, 15 Aug 2024 23:03:12 +0200 Subject: [PATCH 17/17] Dot --- .../flutter_adaptive_scaffold/test/breakpoint_test.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index 4391e1f021e..cbef74c570e 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -104,7 +104,7 @@ void main() { group('maybeActiveBreakpointFromSlotLayout', () { testWidgets('returns correct breakpoint from SlotLayout on mobile devices', (WidgetTester tester) async { - // Small layout on mobile + // Small layout on mobile. await tester.pumpWidget(SimulatedLayout.small.slot(tester)); await tester.pumpAndSettle(); expect( @@ -161,7 +161,7 @@ void main() { group('defaultBreakpointOf', () { testWidgets('returns correct default breakpoint on mobile devices', (WidgetTester tester) async { - // Small layout on mobile + // Small layout on mobile. await tester.pumpWidget(SimulatedLayout.small.slot(tester)); await tester.pumpAndSettle(); expect(Breakpoint.defaultBreakpointOf(tester.element(find.byType(Theme))), @@ -212,7 +212,7 @@ void main() { group('activeBreakpointOf', () { testWidgets('returns correct active breakpoint on mobile devices', (WidgetTester tester) async { - // Small layout on mobile + // Small layout on mobile. await tester.pumpWidget(SimulatedLayout.small.slot(tester)); await tester.pumpAndSettle(); expect(