From 4cea5ee0dac6326079608cd6df54ab89a49cb6e1 Mon Sep 17 00:00:00 2001 From: Taha Tesser Date: Mon, 21 Mar 2022 19:10:24 +0200 Subject: [PATCH] `CupertinoSwitch`: Add clickable cursor for web (#99554) --- .../flutter/lib/src/cupertino/switch.dart | 27 +++++---- .../flutter/test/cupertino/switch_test.dart | 59 +++++++++++++++++++ 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/packages/flutter/lib/src/cupertino/switch.dart b/packages/flutter/lib/src/cupertino/switch.dart index ac69dbadb1..5c8c7adb6c 100644 --- a/packages/flutter/lib/src/cupertino/switch.dart +++ b/packages/flutter/lib/src/cupertino/switch.dart @@ -298,19 +298,22 @@ class _CupertinoSwitchState extends State with TickerProviderSt Widget build(BuildContext context) { if (needsPositionAnimation) _resumePositionAnimation(); - return Opacity( - opacity: widget.onChanged == null ? _kCupertinoSwitchDisabledOpacity : 1.0, - child: _CupertinoSwitchRenderObjectWidget( - value: widget.value, - activeColor: CupertinoDynamicColor.resolve( - widget.activeColor ?? CupertinoColors.systemGreen, - context, + return MouseRegion( + cursor: isInteractive && kIsWeb ? SystemMouseCursors.click : MouseCursor.defer, + child: Opacity( + opacity: widget.onChanged == null ? _kCupertinoSwitchDisabledOpacity : 1.0, + child: _CupertinoSwitchRenderObjectWidget( + value: widget.value, + activeColor: CupertinoDynamicColor.resolve( + widget.activeColor ?? CupertinoColors.systemGreen, + context, + ), + trackColor: CupertinoDynamicColor.resolve(widget.trackColor ?? CupertinoColors.secondarySystemFill, context), + thumbColor: CupertinoDynamicColor.resolve(widget.thumbColor ?? CupertinoColors.white, context), + onChanged: widget.onChanged, + textDirection: Directionality.of(context), + state: this, ), - trackColor: CupertinoDynamicColor.resolve(widget.trackColor ?? CupertinoColors.secondarySystemFill, context), - thumbColor: CupertinoDynamicColor.resolve(widget.thumbColor ?? CupertinoColors.white, context), - onChanged: widget.onChanged, - textDirection: Directionality.of(context), - state: this, ), ); } diff --git a/packages/flutter/test/cupertino/switch_test.dart b/packages/flutter/test/cupertino/switch_test.dart index 97dc10b69a..203d702ffa 100644 --- a/packages/flutter/test/cupertino/switch_test.dart +++ b/packages/flutter/test/cupertino/switch_test.dart @@ -7,8 +7,10 @@ @Tags(['reduced-test-set']) import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -761,4 +763,61 @@ void main() { matchesGoldenFile('switch.tap.on.dark.png'), ); }); + + testWidgets('Hovering over Cupertino switch updates cursor to clickable on Web', (WidgetTester tester) async { + const bool value = false; + // Disabled CupertinoSwitch does not update cursor on Web. + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return const Center( + child: CupertinoSwitch( + value: value, + dragStartBehavior: DragStartBehavior.down, + onChanged: null, + ), + ); + }, + ), + ), + ); + + final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse, pointer: 1); + final Offset cupertinoSwitch = tester.getCenter(find.byType(CupertinoSwitch)); + await gesture.addPointer(location: cupertinoSwitch); + await tester.pumpAndSettle(); + expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.basic); + + // Enabled CupertinoSwitch updates cursor when hovering on Web. + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return Center( + child: CupertinoSwitch( + value: value, + dragStartBehavior: DragStartBehavior.down, + onChanged: (bool newValue) { }, + ), + ); + }, + ), + ), + ); + + await gesture.moveTo(const Offset(10, 10)); + await tester.pumpAndSettle(); + expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.basic); + + await gesture.moveTo(cupertinoSwitch); + addTearDown(gesture.removePointer); + await tester.pumpAndSettle(); + expect( + RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), + kIsWeb ? SystemMouseCursors.click : SystemMouseCursors.basic, + ); + }); }