diff --git a/packages/flutter/lib/src/cupertino/context_menu.dart b/packages/flutter/lib/src/cupertino/context_menu.dart index 4a0409a33d..de591b18bb 100644 --- a/packages/flutter/lib/src/cupertino/context_menu.dart +++ b/packages/flutter/lib/src/cupertino/context_menu.dart @@ -5,6 +5,7 @@ import 'dart:math' as math; import 'dart:ui' as ui; import 'package:flutter/gestures.dart' show kMinFlingVelocity, kLongPressTimeout; +import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/rendering.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; @@ -511,17 +512,22 @@ class _DecoyChildState extends State<_DecoyChild> with TickerProviderStateMixin : _mask.value; return Positioned.fromRect( rect: _rect.value, - child: ShaderMask( - key: _childGlobalKey, - shaderCallback: (Rect bounds) { - return LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [color, color], - ).createShader(bounds); - }, - child: widget.child, - ), + // TODO(justinmc): When ShaderMask is supported on web, remove this + // conditional and use ShaderMask everywhere. + // https://github.com/flutter/flutter/issues/52967. + child: kIsWeb + ? Container(key: _childGlobalKey, child: widget.child) + : ShaderMask( + key: _childGlobalKey, + shaderCallback: (Rect bounds) { + return LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [color, color], + ).createShader(bounds); + }, + child: widget.child, + ), ); } diff --git a/packages/flutter/test/cupertino/context_menu_test.dart b/packages/flutter/test/cupertino/context_menu_test.dart index eecf4f7e22..f63f757400 100644 --- a/packages/flutter/test/cupertino/context_menu_test.dart +++ b/packages/flutter/test/cupertino/context_menu_test.dart @@ -4,6 +4,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; void main() { final TestWidgetsFlutterBinding binding = @@ -103,6 +104,11 @@ void main() { Rect decoyChildRect = tester.getRect(_findDecoyChild(child)); expect(childRect, equals(decoyChildRect)); + // TODO(justinmc): When ShaderMask is supported on web, remove this + // conditional and just check for ShaderMask. + // https://github.com/flutter/flutter/issues/52967. + expect(find.byType(ShaderMask), kIsWeb ? findsNothing : findsOneWidget); + // After a small delay, the _DecoyChild has begun to animate. await tester.pump(const Duration(milliseconds: 100)); decoyChildRect = tester.getRect(_findDecoyChild(child));