diff --git a/analysis_options.yaml b/analysis_options.yaml index a904da1..14dd309 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -13,3 +13,4 @@ linter: prefer_constructors_over_static_methods: false sort_pub_dependencies: false cast_nullable_to_non_nullable: false + avoid_futureor_void: false \ No newline at end of file diff --git a/example/.gitignore b/example/.gitignore index 29a3a50..79c113f 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # IntelliJ related diff --git a/example/lib/main.dart b/example/lib/main.dart index ce1d12f..77aa55d 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -102,7 +102,7 @@ class _Section extends StatelessWidget { class _ButtonRow extends StatelessWidget { const _ButtonRow({ - // ignore: unused_element + // ignore: unused_element_parameter super.key, required this.children, }); @@ -123,7 +123,7 @@ class _ButtonRow extends StatelessWidget { class _Popover extends StatefulWidget { const _Popover({ - // ignore: unused_element + // ignore: unused_element_parameter super.key, required this.controller, }); @@ -141,7 +141,7 @@ class _PopoverState extends State<_Popover> { Widget build(BuildContext context) { return DecoratedBox( decoration: BoxDecoration( - color: Colors.white.withOpacity(0.4), + color: Colors.white.withValues(alpha: 0.4), ), child: SafeArea( child: AnimatedPadding( diff --git a/example/lib/popover_delegate.dart b/example/lib/popover_delegate.dart index 9743093..a714f36 100644 --- a/example/lib/popover_delegate.dart +++ b/example/lib/popover_delegate.dart @@ -258,7 +258,7 @@ class _PopoverPainter extends CustomPainter { canvas.drawPath( path, Paint() - ..color = Colors.black.withOpacity(0.2) + ..color = Colors.black.withValues(alpha: 0.2) ..style = PaintingStyle.fill ..maskFilter = MaskFilter.blur( brokenBlurStyleOuter ? BlurStyle.normal : BlurStyle.outer, diff --git a/example/lib/widgets.dart b/example/lib/widgets.dart index 561b19f..0647db2 100644 --- a/example/lib/widgets.dart +++ b/example/lib/widgets.dart @@ -55,7 +55,7 @@ class _FocusPainter extends CustomPainter { final opacity = focus; final paint = Paint() - ..color = Colors.deepOrange.shade200.withOpacity(opacity); + ..color = Colors.deepOrange.shade200.withValues(alpha: opacity); final radius = Radius.circular(this.radius).pixelSnap(pixelSnap); var rect = (Offset.zero & size).pixelSnap(pixelSnap).inflate(2); @@ -256,7 +256,7 @@ class SampleButton extends StatelessWidget { shadows: [ BoxShadow( blurStyle: BlurStyle.outer, - color: Colors.black.withOpacity(shadowOpacity), + color: Colors.black.withValues(alpha: shadowOpacity), blurRadius: 3, ), ], diff --git a/example/macos/Runner.xcodeproj/project.pbxproj b/example/macos/Runner.xcodeproj/project.pbxproj index 27e0f50..da45dbb 100644 --- a/example/macos/Runner.xcodeproj/project.pbxproj +++ b/example/macos/Runner.xcodeproj/project.pbxproj @@ -227,7 +227,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { @@ -457,7 +457,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -536,7 +536,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -583,7 +583,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 397f3d3..ac78810 100644 --- a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ diff --git a/example/macos/Runner/AppDelegate.swift b/example/macos/Runner/AppDelegate.swift index d53ef64..b3c1761 100644 --- a/example/macos/Runner/AppDelegate.swift +++ b/example/macos/Runner/AppDelegate.swift @@ -1,9 +1,13 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/example/pubspec.lock b/example/pubspec.lock index 1a2e047..81b9bae 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,42 +5,42 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.13.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" collection: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.1" cupertino_rrect: dependency: "direct main" description: @@ -53,10 +53,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" flutter: dependency: "direct main" description: flutter @@ -73,31 +73,31 @@ packages: path: ".." relative: true source: path - version: "0.0.4" + version: "0.0.5" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lint: dependency: "direct dev" description: @@ -110,34 +110,34 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.18.0" path: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" pixel_snap: dependency: "direct main" description: @@ -150,71 +150,71 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_span: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.11" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: name: vm_service - sha256: a75f83f14ad81d5fe4b3319710b90dec37da0e22612326b696c9e1b8f34bbf48 + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "14.2.0" + version: "15.0.0" sdks: - dart: ">=3.3.0 <4.0.0" + dart: ">=3.10.0-0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/lib/src/hover_region.dart b/lib/src/hover_region.dart index 8316d7b..daa6abc 100644 --- a/lib/src/hover_region.dart +++ b/lib/src/hover_region.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -274,19 +273,6 @@ class _HoverRegionState extends State { } } - static bool? _runningInTester; - - // Flutter tester does not synthesize hover events on mouse up, - // unlike native platforms. - static bool _needSynthetizeHoverOnUp() { - if (kIsWeb) { - _runningInTester = false; - } else { - _runningInTester ??= Platform.environment.containsKey('FLUTTER_TEST'); - } - return _runningInTester!; - } - void _onGlobalRoute(PointerEvent event) { if (event is PointerHoverEvent) { _updateScrolling(false); @@ -294,32 +280,30 @@ class _HoverRegionState extends State { if (event is PointerUpEvent) { if (event.pointer == _ignoredEnterPointer) { _ignoredEnterPointer = null; - if (_needSynthetizeHoverOnUp()) { - _onHover(PointerHoverEvent( - viewId: event.viewId, - timeStamp: event.timeStamp, - kind: event.kind, - pointer: 0, - device: event.device, - position: event.position, - delta: event.delta, - buttons: event.buttons, - obscured: event.obscured, - pressureMin: event.pressureMin, - pressureMax: event.pressureMax, - distance: event.distance, - distanceMax: event.distanceMax, - size: event.size, - radiusMajor: event.radiusMajor, - radiusMinor: event.radiusMinor, - radiusMin: event.radiusMin, - radiusMax: event.radiusMax, - orientation: event.orientation, - tilt: event.tilt, - synthesized: event.synthesized, - embedderId: event.embedderId, - )); - } + _onHover(PointerHoverEvent( + viewId: event.viewId, + timeStamp: event.timeStamp, + kind: event.kind, + pointer: 0, + device: event.device, + position: event.position, + delta: event.delta, + buttons: event.buttons, + obscured: event.obscured, + pressureMin: event.pressureMin, + pressureMax: event.pressureMax, + distance: event.distance, + distanceMax: event.distanceMax, + size: event.size, + radiusMajor: event.radiusMajor, + radiusMinor: event.radiusMinor, + radiusMin: event.radiusMin, + radiusMax: event.radiusMax, + orientation: event.orientation, + tilt: event.tilt, + synthesized: event.synthesized, + embedderId: event.embedderId, + )); } if (event.pointer == _pendingExitPointer) { assert(_pendingExit != null); diff --git a/test/button_test.dart b/test/button_test.dart index 6d3467f..308ee76 100644 --- a/test/button_test.dart +++ b/test/button_test.dart @@ -1089,7 +1089,10 @@ void main() { expect(state, ButtonState(enabled: true)); - final focus = tester.widget(find.bySubtype()); + final focus = tester.widget(find.descendant( + of: find.byKey(button), + matching: find.bySubtype(), + )); focus.focusNode!.requestFocus(); await tester.pumpAndSettle(); expect(state, ButtonState(enabled: true, focused: true)); @@ -1139,7 +1142,10 @@ void main() { ), ); - final focus = tester.widget(find.bySubtype()); + final focus = tester.widget(find.descendant( + of: find.byKey(button), + matching: find.bySubtype(), + )); focus.focusNode!.requestFocus(); await tester.pumpAndSettle(); expect(state, ButtonState(enabled: true, focused: true)); @@ -1193,7 +1199,10 @@ void main() { ), ); - final focus = tester.widget(find.bySubtype()); + final focus = tester.widget(find.descendant( + of: find.byKey(button), + matching: find.bySubtype(), + )); focus.focusNode!.requestFocus(); await tester.pumpAndSettle(); expect(state, ButtonState(enabled: true, focused: true)); @@ -1253,7 +1262,10 @@ void main() { ), ); - final focus = tester.widget(find.bySubtype()); + final focus = tester.widget(find.descendant( + of: find.byKey(button), + matching: find.bySubtype(), + )); focus.focusNode!.requestFocus(); await tester.pumpAndSettle(); expect(state, ButtonState(enabled: true, focused: true)); @@ -1327,7 +1339,10 @@ void main() { ), ); - final focus = tester.widget(find.bySubtype()); + final focus = tester.widget(find.descendant( + of: find.byKey(button), + matching: find.bySubtype(), + )); focus.focusNode!.requestFocus(); await tester.pumpAndSettle(); expect(state, ButtonState(enabled: true, focused: true)); @@ -1392,7 +1407,10 @@ void main() { ), ); - final focus = tester.widget(find.bySubtype()); + final focus = tester.widget(find.descendant( + of: find.byKey(button), + matching: find.bySubtype(), + )); focus.focusNode!.requestFocus(); await tester.pumpAndSettle(); expect(state, ButtonState(enabled: true, focused: true)); @@ -1455,7 +1473,10 @@ void main() { ), ); - final focus = tester.widget(find.bySubtype()); + final focus = tester.widget(find.descendant( + of: find.byKey(button), + matching: find.bySubtype(), + )); focus.focusNode!.requestFocus(); await tester.pumpAndSettle(); expect(state, ButtonState(enabled: true, focused: true)); diff --git a/test/sized_custom_layout_test.dart b/test/sized_custom_layout_test.dart index cd86542..408c23e 100644 --- a/test/sized_custom_layout_test.dart +++ b/test/sized_custom_layout_test.dart @@ -344,10 +344,9 @@ void main() { ' an ID in its parent data.\n' ' The following child has no ID: RenderConstrainedBox#00000 NEEDS-LAYOUT NEEDS-PAINT:\n' ' creator: ConstrainedBox ← Container ← LayoutWithMissingId ←\n' - ' SizedCustomMultiChildLayout ← Center ← MediaQuery ←\n' - ' _MediaQueryFromView ← _PipelineOwnerScope ← _ViewScope ←\n' - ' _RawView-[_DeprecatedRawViewKey TestFlutterView#00000] ← View ←\n' - ' [root]\n' + ' SizedCustomMultiChildLayout ← Center ← _FocusInheritedScope ←\n' + ' _FocusScopeWithExternalFocusNode ← _FocusInheritedScope ← Focus\n' + ' ← FocusTraversalGroup ← MediaQuery ← _MediaQueryFromView ← ⋯\n' ' parentData: offset=Offset(0.0, 0.0); id=null\n' ' constraints: MISSING\n' ' size: MISSING\n'