From 3cdb2b93fcee32cb88f379760f44928b58967087 Mon Sep 17 00:00:00 2001 From: waleedf112 Date: Tue, 16 Apr 2024 10:54:32 +0300 Subject: [PATCH 1/7] use `MediaQuery.sizeOf` instead of `MediaQuery.of` to prevent unnecessary rebuilds --- packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart index 4fc0687152d..5a7bcfe579b 100644 --- a/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart +++ b/packages/flutter_adaptive_scaffold/lib/src/breakpoints.dart @@ -95,7 +95,7 @@ class WidthPlatformBreakpoint extends Breakpoint { // Null boundaries are unbounded, assign the max/min of their associated // direction on a number line. - final double width = MediaQuery.of(context).size.width; + final double width = MediaQuery.sizeOf(context).width; final double lowerBound = begin ?? double.negativeInfinity; final double upperBound = end ?? double.infinity; @@ -126,6 +126,6 @@ abstract class Breakpoint { const Breakpoint(); /// A method that returns true based on conditions related to the context of - /// the screen such as MediaQuery.of(context).size.width. + /// the screen such as MediaQuery.sizeOf(context).width. bool isActive(BuildContext context); } From afd13783d216796472cc6c83917fb2174025f160 Mon Sep 17 00:00:00 2001 From: waleedf112 Date: Tue, 16 Apr 2024 11:05:15 +0300 Subject: [PATCH 2/7] Update CHANGELOG and package 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 065983360e9..6cc9c113ec7 100644 --- a/packages/flutter_adaptive_scaffold/CHANGELOG.md +++ b/packages/flutter_adaptive_scaffold/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.10+2 + +* Reduce rebuilds when invoking. + ## 0.1.10+1 * Removes a broken design document link from the README. diff --git a/packages/flutter_adaptive_scaffold/pubspec.yaml b/packages/flutter_adaptive_scaffold/pubspec.yaml index cd322d41d2a..fec581efcc8 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.1.10+1 +version: 0.1.10+2 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 1513cf68159ad316126af98cc7406bb39bddda5c Mon Sep 17 00:00:00 2001 From: waleedf112 Date: Tue, 30 Apr 2024 12:15:04 +0300 Subject: [PATCH 3/7] doc: fix changelog --- packages/flutter_adaptive_scaffold/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter_adaptive_scaffold/CHANGELOG.md b/packages/flutter_adaptive_scaffold/CHANGELOG.md index 6cc9c113ec7..7bb1e1c6526 100644 --- a/packages/flutter_adaptive_scaffold/CHANGELOG.md +++ b/packages/flutter_adaptive_scaffold/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.1.10+2 -* Reduce rebuilds when invoking. +* Reduce rebuilds when invoking `isActive` method. ## 0.1.10+1 From 5f8bf59cf7ac7403fa478ff8551052075396f532 Mon Sep 17 00:00:00 2001 From: waleedf112 Date: Tue, 30 Apr 2024 12:47:04 +0300 Subject: [PATCH 4/7] test: added a test for preventing rebuilds when invoking `Breakpoint.isActive()` --- .../test/breakpoint_test.dart | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index 6ecb20a2701..884064c2ff9 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -3,7 +3,9 @@ // found in the LICENSE file. import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter_adaptive_scaffold/src/breakpoints.dart'; import 'package:flutter_test/flutter_test.dart'; import 'simulated_layout.dart'; @@ -51,4 +53,42 @@ void main() { expect(find.byKey(const Key('Breakpoints.largeDesktop')), findsOneWidget); expect(find.byKey(const Key('Breakpoints.largeMobile')), findsNothing); }, variant: TargetPlatformVariant.desktop()); + + testWidgets('Breakpoint.isActive should not trigger unnecessary rebuilds', + (WidgetTester tester) async { + await tester.pumpWidget(const DymmyWidget()); + expect(find.byKey(const Key('button')), findsOneWidget); + + // first build + expect(DymmyWidget.built, isTrue); + + // Invoke `isActive` method. + await tester.tap(find.byKey(const Key('button'))); + DymmyWidget.built = false; + + // Should not rebuild after modifying any property in `MediaQuery`. + tester.platformDispatcher.platformBrightnessTestValue = Brightness.dark; + await tester.pumpAndSettle(); + expect(DymmyWidget.built, isFalse); + }); +} + +class DymmyWidget extends StatelessWidget { + const DymmyWidget({super.key}); + + static bool built = false; + @override + Widget build(BuildContext context) { + built = true; + return Directionality( + textDirection: TextDirection.ltr, + child: ElevatedButton( + key: const Key('button'), + onPressed: () { + Breakpoints.small.isActive(context); + }, + child: const SizedBox(), + ), + ); + } } From 052bf586c40906d9b02391514f1c513e753a6358 Mon Sep 17 00:00:00 2001 From: waleedf112 Date: Tue, 30 Apr 2024 14:29:38 +0300 Subject: [PATCH 5/7] test: fix tests --- packages/flutter_adaptive_scaffold/test/breakpoint_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index 884064c2ff9..9cf2bf8f77f 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -67,7 +67,7 @@ void main() { DymmyWidget.built = false; // Should not rebuild after modifying any property in `MediaQuery`. - tester.platformDispatcher.platformBrightnessTestValue = Brightness.dark; + tester.platformDispatcher.textScaleFactorTestValue = 2; await tester.pumpAndSettle(); expect(DymmyWidget.built, isFalse); }); From 1a3ddaa53b4255f9c40dae8882dfc455f1385103 Mon Sep 17 00:00:00 2001 From: waleedf112 Date: Tue, 30 Apr 2024 14:40:14 +0300 Subject: [PATCH 6/7] refactor: removed unnecessary imports --- packages/flutter_adaptive_scaffold/test/breakpoint_test.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index 9cf2bf8f77f..6715653d0fe 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -2,9 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_adaptive_scaffold/src/breakpoints.dart'; import 'package:flutter_test/flutter_test.dart'; import 'simulated_layout.dart'; From 5d0c5c90e3807c8d0229f9d38307fc45964afcb5 Mon Sep 17 00:00:00 2001 From: Waleed Alenazi <44902066+waleedf112@users.noreply.github.com> Date: Tue, 30 Apr 2024 20:13:38 +0300 Subject: [PATCH 7/7] Update comments --- packages/flutter_adaptive_scaffold/test/breakpoint_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart index 6715653d0fe..c0975092db6 100644 --- a/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart +++ b/packages/flutter_adaptive_scaffold/test/breakpoint_test.dart @@ -57,7 +57,7 @@ void main() { await tester.pumpWidget(const DymmyWidget()); expect(find.byKey(const Key('button')), findsOneWidget); - // first build + // First build. expect(DymmyWidget.built, isTrue); // Invoke `isActive` method.