Committed by
GitHub
Merge branch 'OpenFlutter:master' into main
Showing
10 changed files
with
123 additions
and
72 deletions
1 | -name: Close inactive issues | 1 | +# .github/workflows/publish.yml |
2 | +name: Publish to pub.dev | ||
3 | + | ||
2 | on: | 4 | on: |
3 | - schedule: | ||
4 | - - cron: "30 1 * * *" | 5 | + push: |
6 | + tags: | ||
7 | + - 'v[0-9]+.[0-9]+.[0-9]+*' # tag pattern on pub.dev: 'v' | ||
5 | 8 | ||
9 | +# Publish using custom workflow | ||
6 | jobs: | 10 | jobs: |
7 | - close-issues: | ||
8 | - runs-on: ubuntu-latest | 11 | + publish: |
9 | permissions: | 12 | permissions: |
10 | - issues: write | ||
11 | - pull-requests: write | 13 | + id-token: write # Required for authentication using OIDC |
14 | + runs-on: ubuntu-latest | ||
12 | steps: | 15 | steps: |
13 | - - uses: actions/stale@v3 | ||
14 | - with: | ||
15 | - days-before-issue-stale: 30 | ||
16 | - days-before-issue-close: 14 | ||
17 | - stale-issue-label: "stale" | ||
18 | - stale-issue-message: "This issue is stale because it has been open for 30 days with no activity." | ||
19 | - close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." | ||
20 | - days-before-pr-stale: -1 | ||
21 | - days-before-pr-close: -1 | ||
22 | - repo-token: ${{ secrets.GITHUB_TOKEN }} | ||
16 | + - uses: actions/checkout@v3 | ||
17 | + - uses: dart-lang/setup-dart@v1 | ||
18 | + - name: Install dependencies | ||
19 | + run: dart pub get | ||
20 | + # Here you can insert custom steps you need | ||
21 | + # - run: dart tool/generate-code.dart | ||
22 | + - name: Publish | ||
23 | + run: dart pub publish --force |
1 | +# 5.9.2 | ||
2 | +- Add ability to exclude widgets from from rebuild list | ||
3 | +- Depend on View instead of MediaQuery | ||
4 | +- update readme | ||
5 | + | ||
6 | +# 5.9.1 | ||
7 | +- merge pr #550 #555 #556 | ||
8 | +- update readme | ||
9 | + | ||
1 | # 5.9.0 | 10 | # 5.9.0 |
2 | - ScreenUtilInit won't rebuild the whole widget tree | 11 | - ScreenUtilInit won't rebuild the whole widget tree |
3 | - Add `fontSizeResolver` to specify how font size should be scaled | 12 | - Add `fontSizeResolver` to specify how font size should be scaled |
@@ -40,17 +40,19 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; | @@ -40,17 +40,19 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; | ||
40 | 40 | ||
41 | ### Properties | 41 | ### Properties |
42 | 42 | ||
43 | -| Property | Type | Default Value | Description | | ||
44 | -| ---------------- |--------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------| | ||
45 | -| designSize | Size | Size(360,690) | The size of the device screen in the design draft, in dp | | ||
46 | -| builder | Function | null | Return widget that uses the library in a property (ex: MaterialApp's theme) | | ||
47 | -| child | Widget | null | A part of builder that its dependencies/properties don't use the library | | ||
48 | -| rebuildFactor | Function | *default* | Function that take old and new screen metrics and returns whether to rebuild or not when changes. | | ||
49 | -| splitScreenMode | bool | false | support for split screen | | ||
50 | -| minTextAdapt | bool | false | Whether to adapt the text according to the minimum of width and height | | ||
51 | -| context | BuildContext | null | Get physical device data if not provided, by MediaQuery.of(context) | | ||
52 | -| fontSizeResolver | Function | *default* | Function that specify how font size should be adapted. Default is that font size scale with width of screen. | | ||
53 | -| responsiveWidgets| Iterable<String> | null | List/Set of widget names that should be included in rebuilding tree. (See [How flutter_screenutil marks a widget needs build](#rebuild-list)) | | 43 | +| Property | Type | Default Value | Description | |
44 | +| ----------------- | ---------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | ||
45 | +| designSize | Size | Size(360,690) | The size of the device screen in the design draft, in dp | | ||
46 | +| builder | Function | null | Return widget that uses the library in a property (ex: MaterialApp's theme) | | ||
47 | +| child | Widget | null | A part of builder that its dependencies/properties don't use the library | | ||
48 | +| rebuildFactor | Function | _default_ | Function that take old and new screen metrics and returns whether to rebuild or not when changes. | | ||
49 | +| splitScreenMode | bool | false | support for split screen | | ||
50 | +| minTextAdapt | bool | false | Whether to adapt the text according to the minimum of width and height | | ||
51 | +| context | BuildContext | null | Get physical device data if not provided, by MediaQuery.of(context) | | ||
52 | +| fontSizeResolver | Function | _default_ | Function that specify how font size should be adapted. Default is that font size scale with width of screen. | | ||
53 | +| responsiveWidgets | Iterable<String> | null | List/Set of widget names that should be included in rebuilding tree. (See [How flutter_screenutil marks a widget needs build](#rebuild-list)) | | ||
54 | +| excludeWidgets | Iterable<String> | null | List/Set of widget names that should be excluded from rebuilding tree. | | ||
55 | + | ||
54 | 56 | ||
55 | **Note : You must either provide builder, child or both.** | 57 | **Note : You must either provide builder, child or both.** |
56 | 58 | ||
@@ -361,3 +363,28 @@ To use second method run: `flutter run --dart-define=method=2` | @@ -361,3 +363,28 @@ To use second method run: `flutter run --dart-define=method=2` | ||
361 | 363 | ||
362 |  | 364 |  |
363 |  | 365 |  |
366 | + | ||
367 | + | ||
368 | +### Update for Version 5.9.0 (Tests) | ||
369 | +Reported as bug in [#515](https://github.com/OpenFlutter/flutter_screenutil/issues/515) | ||
370 | + | ||
371 | + | ||
372 | +In version 5.9.0, to ensure compatibility and proper functioning of your tests, it is crucial to use the method `tester.pumpAndSettle()`; when conducting widget tests that depend on animations or a settling time to complete their state. | ||
373 | + | ||
374 | +In the previous version, this step was not strictly necessary. However, to maintain consistency in your tests and avoid unexpected errors, it's strongly recommended incorporating await tester.pumpAndSettle(); in your widget tests if you are using version 5.9.0 | ||
375 | + | ||
376 | +Example usage: | ||
377 | +```dart | ||
378 | +testWidgets('Should ensure widgets settle correctly', (WidgetTester tester) async { | ||
379 | +await tester.pumpWidget( | ||
380 | + const MaterialApp( | ||
381 | + home: ScreenUtilInit( | ||
382 | + child: MyApp(), | ||
383 | + ), | ||
384 | + ), | ||
385 | +); | ||
386 | +// Insertion of recommended method to prevent failures | ||
387 | +await tester.pumpAndSettle(); | ||
388 | +// Continue with your assertions and tests | ||
389 | +}); | ||
390 | +``` |
@@ -39,7 +39,7 @@ android { | @@ -39,7 +39,7 @@ android { | ||
39 | defaultConfig { | 39 | defaultConfig { |
40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | 40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). |
41 | applicationId "li.zhuoyuan.example" | 41 | applicationId "li.zhuoyuan.example" |
42 | - minSdkVersion 16 | 42 | + minSdkVersion flutter.minSdkVersion |
43 | targetSdkVersion 31 | 43 | targetSdkVersion 31 |
44 | versionCode flutterVersionCode.toInteger() | 44 | versionCode flutterVersionCode.toInteger() |
45 | versionName flutterVersionName | 45 | versionName flutterVersionName |
@@ -3,12 +3,11 @@ | @@ -3,12 +3,11 @@ | ||
3 | export "FLUTTER_ROOT=/Users/lizhuoyuan/fvm/versions/stable" | 3 | export "FLUTTER_ROOT=/Users/lizhuoyuan/fvm/versions/stable" |
4 | export "FLUTTER_APPLICATION_PATH=/Users/lizhuoyuan/Development/Project/flutter_screenutil/example" | 4 | export "FLUTTER_APPLICATION_PATH=/Users/lizhuoyuan/Development/Project/flutter_screenutil/example" |
5 | export "COCOAPODS_PARALLEL_CODE_SIGN=true" | 5 | export "COCOAPODS_PARALLEL_CODE_SIGN=true" |
6 | -export "FLUTTER_TARGET=/Users/lizhuoyuan/Development/Project/flutter_screenutil/example/lib/main.dart" | 6 | +export "FLUTTER_TARGET=lib/main.dart" |
7 | export "FLUTTER_BUILD_DIR=build" | 7 | export "FLUTTER_BUILD_DIR=build" |
8 | export "FLUTTER_BUILD_NAME=1.0.0" | 8 | export "FLUTTER_BUILD_NAME=1.0.0" |
9 | export "FLUTTER_BUILD_NUMBER=1" | 9 | export "FLUTTER_BUILD_NUMBER=1" |
10 | -export "DART_DEFINES=Zmx1dHRlci5pbnNwZWN0b3Iuc3RydWN0dXJlZEVycm9ycz10cnVl,RkxVVFRFUl9XRUJfQVVUT19ERVRFQ1Q9dHJ1ZQ==,RkxVVFRFUl9XRUJfQ0FOVkFTS0lUX1VSTD1odHRwczovL3d3dy5nc3RhdGljLmNvbS9mbHV0dGVyLWNhbnZhc2tpdC9jZGJlZGE3ODhhMjkzZmEyOTY2NWRjM2ZhM2Q2ZTYzYmQyMjFjYjBkLw==" | ||
11 | export "DART_OBFUSCATION=false" | 10 | export "DART_OBFUSCATION=false" |
12 | export "TRACK_WIDGET_CREATION=true" | 11 | export "TRACK_WIDGET_CREATION=true" |
13 | export "TREE_SHAKE_ICONS=false" | 12 | export "TREE_SHAKE_ICONS=false" |
14 | -export "PACKAGE_CONFIG=/Users/lizhuoyuan/Development/Project/flutter_screenutil/example/.dart_tool/package_config.json" | 13 | +export "PACKAGE_CONFIG=.dart_tool/package_config.json" |
1 | import 'package:example/responsive_widgets.su.dart'; | 1 | import 'package:example/responsive_widgets.su.dart'; |
2 | -import 'package:example/src/home.dart'; | ||
3 | import 'package:flutter/material.dart'; | 2 | import 'package:flutter/material.dart'; |
4 | import 'package:flutter_screenutil/flutter_screenutil.dart'; | 3 | import 'package:flutter_screenutil/flutter_screenutil.dart'; |
5 | 4 | ||
5 | +import '../src_zh/home.dart'; | ||
6 | + | ||
6 | class MyApp extends StatelessWidget { | 7 | class MyApp extends StatelessWidget { |
7 | const MyApp({Key? key}) : super(key: key); | 8 | const MyApp({Key? key}) : super(key: key); |
8 | 9 |
@@ -3,7 +3,8 @@ | @@ -3,7 +3,8 @@ | ||
3 | * email: zhuoyuan93@gmail.com | 3 | * email: zhuoyuan93@gmail.com |
4 | */ | 4 | */ |
5 | 5 | ||
6 | -import 'dart:io'; | 6 | +import 'package:flutter/foundation.dart' show kIsWeb, defaultTargetPlatform; |
7 | + | ||
7 | import 'dart:math' show min, max; | 8 | import 'dart:math' show min, max; |
8 | import 'dart:ui' as ui show FlutterView; | 9 | import 'dart:ui' as ui show FlutterView; |
9 | 10 | ||
@@ -154,8 +155,9 @@ class ScreenUtil { | @@ -154,8 +155,9 @@ class ScreenUtil { | ||
154 | bool minTextAdapt = false, | 155 | bool minTextAdapt = false, |
155 | FontSizeResolver? fontSizeResolver, | 156 | FontSizeResolver? fontSizeResolver, |
156 | }) { | 157 | }) { |
158 | + final view = View.maybeOf(context); | ||
157 | return configure( | 159 | return configure( |
158 | - data: MediaQuery.maybeOf(context), | 160 | + data: view != null ? MediaQueryData.fromView(view) : null, |
159 | designSize: designSize, | 161 | designSize: designSize, |
160 | splitScreenMode: splitScreenMode, | 162 | splitScreenMode: splitScreenMode, |
161 | minTextAdapt: minTextAdapt, | 163 | minTextAdapt: minTextAdapt, |
@@ -171,8 +173,8 @@ class ScreenUtil { | @@ -171,8 +173,8 @@ class ScreenUtil { | ||
171 | FontSizeResolver? fontSizeResolver, | 173 | FontSizeResolver? fontSizeResolver, |
172 | }) { | 174 | }) { |
173 | return ScreenUtil.ensureScreenSize().then((_) { | 175 | return ScreenUtil.ensureScreenSize().then((_) { |
174 | - return configure( | ||
175 | - data: MediaQuery.maybeOf(context), | 176 | + return init( |
177 | + context, | ||
176 | designSize: designSize, | 178 | designSize: designSize, |
177 | minTextAdapt: minTextAdapt, | 179 | minTextAdapt: minTextAdapt, |
178 | splitScreenMode: splitScreenMode, | 180 | splitScreenMode: splitScreenMode, |
@@ -255,34 +257,43 @@ class ScreenUtil { | @@ -255,34 +257,43 @@ class ScreenUtil { | ||
255 | double setSp(num fontSize) => | 257 | double setSp(num fontSize) => |
256 | fontSizeResolver?.call(fontSize, _instance) ?? fontSize * scaleText; | 258 | fontSizeResolver?.call(fontSize, _instance) ?? fontSize * scaleText; |
257 | 259 | ||
258 | - DeviceType deviceType() { | ||
259 | - DeviceType deviceType; | ||
260 | - switch (Platform.operatingSystem) { | ||
261 | - case 'android': | ||
262 | - case 'ios': | ||
263 | - deviceType = DeviceType.mobile; | ||
264 | - if ((orientation == Orientation.portrait && screenWidth < 600) || | ||
265 | - (orientation == Orientation.landscape && screenHeight < 600)) { | ||
266 | - deviceType = DeviceType.mobile; | ||
267 | - } else { | ||
268 | - deviceType = DeviceType.tablet; | 260 | + DeviceType deviceType(BuildContext context) { |
261 | + var deviceType = DeviceType.web; | ||
262 | + final screenWidth = MediaQuery.of(context).size.width; | ||
263 | + final screenHeight = MediaQuery.of(context).size.height; | ||
264 | + final orientation = MediaQuery.of(context).orientation; | ||
265 | + | ||
266 | + if (kIsWeb) { | ||
267 | + deviceType = DeviceType.web; | ||
268 | + } else { | ||
269 | + bool isMobile = defaultTargetPlatform == TargetPlatform.iOS || | ||
270 | + defaultTargetPlatform == TargetPlatform.android; | ||
271 | + bool isTablet = | ||
272 | + (orientation == Orientation.portrait && screenWidth >= 600) || | ||
273 | + (orientation == Orientation.landscape && screenHeight >= 600); | ||
274 | + | ||
275 | + if (isMobile) { | ||
276 | + deviceType = isTablet ? DeviceType.tablet : DeviceType.mobile; | ||
277 | + } else { | ||
278 | + switch (defaultTargetPlatform) { | ||
279 | + case TargetPlatform.linux: | ||
280 | + deviceType = DeviceType.linux; | ||
281 | + break; | ||
282 | + case TargetPlatform.macOS: | ||
283 | + deviceType = DeviceType.mac; | ||
284 | + break; | ||
285 | + case TargetPlatform.windows: | ||
286 | + deviceType = DeviceType.windows; | ||
287 | + break; | ||
288 | + case TargetPlatform.fuchsia: | ||
289 | + deviceType = DeviceType.fuchsia; | ||
290 | + break; | ||
291 | + default: | ||
292 | + break; | ||
269 | } | 293 | } |
270 | - break; | ||
271 | - case 'linux': | ||
272 | - deviceType = DeviceType.linux; | ||
273 | - break; | ||
274 | - case 'macos': | ||
275 | - deviceType = DeviceType.mac; | ||
276 | - break; | ||
277 | - case 'windows': | ||
278 | - deviceType = DeviceType.windows; | ||
279 | - break; | ||
280 | - case 'fuchsia': | ||
281 | - deviceType = DeviceType.fuchsia; | ||
282 | - break; | ||
283 | - default: | ||
284 | - deviceType = DeviceType.web; | 294 | + } |
285 | } | 295 | } |
296 | + | ||
286 | return deviceType; | 297 | return deviceType; |
287 | } | 298 | } |
288 | 299 |
@@ -2,10 +2,10 @@ import 'dart:async'; | @@ -2,10 +2,10 @@ import 'dart:async'; | ||
2 | import 'dart:collection'; | 2 | import 'dart:collection'; |
3 | 3 | ||
4 | import 'package:flutter/widgets.dart'; | 4 | import 'package:flutter/widgets.dart'; |
5 | -import './_flutter_widgets.dart'; | ||
6 | 5 | ||
7 | -import 'screenutil_mixin.dart'; | 6 | +import './_flutter_widgets.dart'; |
8 | import 'screen_util.dart'; | 7 | import 'screen_util.dart'; |
8 | +import 'screenutil_mixin.dart'; | ||
9 | 9 | ||
10 | typedef RebuildFactor = bool Function(MediaQueryData old, MediaQueryData data); | 10 | typedef RebuildFactor = bool Function(MediaQueryData old, MediaQueryData data); |
11 | 11 | ||
@@ -75,6 +75,7 @@ class ScreenUtilInit extends StatefulWidget { | @@ -75,6 +75,7 @@ class ScreenUtilInit extends StatefulWidget { | ||
75 | this.useInheritedMediaQuery = false, | 75 | this.useInheritedMediaQuery = false, |
76 | this.ensureScreenSize = false, | 76 | this.ensureScreenSize = false, |
77 | this.responsiveWidgets, | 77 | this.responsiveWidgets, |
78 | + this.excludeWidgets, | ||
78 | this.fontSizeResolver = FontSizeResolvers.width, | 79 | this.fontSizeResolver = FontSizeResolvers.width, |
79 | }) : super(key: key); | 80 | }) : super(key: key); |
80 | 81 | ||
@@ -90,6 +91,7 @@ class ScreenUtilInit extends StatefulWidget { | @@ -90,6 +91,7 @@ class ScreenUtilInit extends StatefulWidget { | ||
90 | /// The [Size] of the device in the design draft, in dp | 91 | /// The [Size] of the device in the design draft, in dp |
91 | final Size designSize; | 92 | final Size designSize; |
92 | final Iterable<String>? responsiveWidgets; | 93 | final Iterable<String>? responsiveWidgets; |
94 | + final Iterable<String>? excludeWidgets; | ||
93 | 95 | ||
94 | @override | 96 | @override |
95 | State<ScreenUtilInit> createState() => _ScreenUtilInitState(); | 97 | State<ScreenUtilInit> createState() => _ScreenUtilInitState(); |
@@ -98,6 +100,7 @@ class ScreenUtilInit extends StatefulWidget { | @@ -98,6 +100,7 @@ class ScreenUtilInit extends StatefulWidget { | ||
98 | class _ScreenUtilInitState extends State<ScreenUtilInit> | 100 | class _ScreenUtilInitState extends State<ScreenUtilInit> |
99 | with WidgetsBindingObserver { | 101 | with WidgetsBindingObserver { |
100 | final _canMarkedToBuild = HashSet<String>(); | 102 | final _canMarkedToBuild = HashSet<String>(); |
103 | + final _excludedWidgets = HashSet<String>(); | ||
101 | MediaQueryData? _mediaQueryData; | 104 | MediaQueryData? _mediaQueryData; |
102 | final _binding = WidgetsBinding.instance; | 105 | final _binding = WidgetsBinding.instance; |
103 | final _screenSizeCompleter = Completer<void>(); | 106 | final _screenSizeCompleter = Completer<void>(); |
@@ -126,10 +129,9 @@ class _ScreenUtilInitState extends State<ScreenUtilInit> | @@ -126,10 +129,9 @@ class _ScreenUtilInitState extends State<ScreenUtilInit> | ||
126 | } | 129 | } |
127 | 130 | ||
128 | MediaQueryData? _newData() { | 131 | MediaQueryData? _newData() { |
129 | - MediaQueryData? mq = MediaQuery.maybeOf(context); | ||
130 | - if (mq == null) mq = MediaQueryData.fromView(View.of(context)); | ||
131 | - | ||
132 | - return mq; | 132 | + final view = View.maybeOf(context); |
133 | + if (view != null) return MediaQueryData.fromView(view); | ||
134 | + return null; | ||
133 | } | 135 | } |
134 | 136 | ||
135 | Future<void> _validateSize() async { | 137 | Future<void> _validateSize() async { |
@@ -138,6 +140,7 @@ class _ScreenUtilInitState extends State<ScreenUtilInit> | @@ -138,6 +140,7 @@ class _ScreenUtilInitState extends State<ScreenUtilInit> | ||
138 | 140 | ||
139 | void _markNeedsBuildIfAllowed(Element el) { | 141 | void _markNeedsBuildIfAllowed(Element el) { |
140 | final widgetName = el.widget.runtimeType.toString(); | 142 | final widgetName = el.widget.runtimeType.toString(); |
143 | + if (_excludedWidgets.contains(widgetName)) return; | ||
141 | final allowed = widget is SU || | 144 | final allowed = widget is SU || |
142 | _canMarkedToBuild.contains(widgetName) || | 145 | _canMarkedToBuild.contains(widgetName) || |
143 | !(widgetName.startsWith('_') || flutterWidgets.contains(widgetName)); | 146 | !(widgetName.startsWith('_') || flutterWidgets.contains(widgetName)); |
@@ -114,7 +114,7 @@ extension EdgeInsetsExtension on EdgeInsets { | @@ -114,7 +114,7 @@ extension EdgeInsetsExtension on EdgeInsets { | ||
114 | ); | 114 | ); |
115 | } | 115 | } |
116 | 116 | ||
117 | -extension BorderRaduisExtension on BorderRadius { | 117 | +extension BorderRadiusExtension on BorderRadius { |
118 | /// Creates adapt BorderRadius using r [SizeExtension]. | 118 | /// Creates adapt BorderRadius using r [SizeExtension]. |
119 | BorderRadius get r => copyWith( | 119 | BorderRadius get r => copyWith( |
120 | bottomLeft: bottomLeft.r, | 120 | bottomLeft: bottomLeft.r, |
@@ -138,7 +138,7 @@ extension BorderRaduisExtension on BorderRadius { | @@ -138,7 +138,7 @@ extension BorderRaduisExtension on BorderRadius { | ||
138 | ); | 138 | ); |
139 | } | 139 | } |
140 | 140 | ||
141 | -extension RaduisExtension on Radius { | 141 | +extension RadiusExtension on Radius { |
142 | /// Creates adapt Radius using r [SizeExtension]. | 142 | /// Creates adapt Radius using r [SizeExtension]. |
143 | Radius get r => Radius.elliptical(x.r, y.r); | 143 | Radius get r => Radius.elliptical(x.r, y.r); |
144 | 144 |
1 | name: flutter_screenutil | 1 | name: flutter_screenutil |
2 | description: A flutter plugin for adapting screen and font size.Guaranteed to look good on different models | 2 | description: A flutter plugin for adapting screen and font size.Guaranteed to look good on different models |
3 | -version: 5.9.0 | 3 | +version: 5.9.2 |
4 | homepage: https://github.com/OpenFlutter/flutter_screenutil | 4 | homepage: https://github.com/OpenFlutter/flutter_screenutil |
5 | 5 | ||
6 | environment: | 6 | environment: |
-
Please register or login to post a comment