Unverified Commit 589b3278 authored by chunhtai's avatar chunhtai Committed by GitHub

Issues/58665 reland and prevent the material widget from absorbing gesture (#60536)

parent e2a638e6
...@@ -681,7 +681,12 @@ class _AppBarState extends State<AppBar> { ...@@ -681,7 +681,12 @@ class _AppBarState extends State<AppBar> {
fit: StackFit.passthrough, fit: StackFit.passthrough,
children: <Widget>[ children: <Widget>[
widget.flexibleSpace, widget.flexibleSpace,
appBar, // Creates a material widget to prevent the flexibleSpace from
// obscuring the ink splashes produced by appBar children.
Material(
type: MaterialType.transparency,
child: appBar,
),
], ],
); );
} }
......
...@@ -366,6 +366,7 @@ class _MaterialState extends State<Material> with TickerProviderStateMixin { ...@@ -366,6 +366,7 @@ class _MaterialState extends State<Material> with TickerProviderStateMixin {
}, },
child: _InkFeatures( child: _InkFeatures(
key: _inkFeatureRenderer, key: _inkFeatureRenderer,
absorbHitTest: widget.type != MaterialType.transparency,
color: backgroundColor, color: backgroundColor,
child: contents, child: contents,
vsync: this, vsync: this,
...@@ -477,6 +478,7 @@ class _RenderInkFeatures extends RenderProxyBox implements MaterialInkController ...@@ -477,6 +478,7 @@ class _RenderInkFeatures extends RenderProxyBox implements MaterialInkController
_RenderInkFeatures({ _RenderInkFeatures({
RenderBox child, RenderBox child,
@required this.vsync, @required this.vsync,
this.absorbHitTest,
this.color, this.color,
}) : assert(vsync != null), }) : assert(vsync != null),
super(child); super(child);
...@@ -493,6 +495,8 @@ class _RenderInkFeatures extends RenderProxyBox implements MaterialInkController ...@@ -493,6 +495,8 @@ class _RenderInkFeatures extends RenderProxyBox implements MaterialInkController
@override @override
Color color; Color color;
bool absorbHitTest;
List<InkFeature> _inkFeatures; List<InkFeature> _inkFeatures;
@override @override
...@@ -517,7 +521,7 @@ class _RenderInkFeatures extends RenderProxyBox implements MaterialInkController ...@@ -517,7 +521,7 @@ class _RenderInkFeatures extends RenderProxyBox implements MaterialInkController
} }
@override @override
bool hitTestSelf(Offset position) => true; bool hitTestSelf(Offset position) => absorbHitTest;
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
...@@ -539,6 +543,7 @@ class _InkFeatures extends SingleChildRenderObjectWidget { ...@@ -539,6 +543,7 @@ class _InkFeatures extends SingleChildRenderObjectWidget {
Key key, Key key,
this.color, this.color,
@required this.vsync, @required this.vsync,
@required this.absorbHitTest,
Widget child, Widget child,
}) : super(key: key, child: child); }) : super(key: key, child: child);
...@@ -549,17 +554,21 @@ class _InkFeatures extends SingleChildRenderObjectWidget { ...@@ -549,17 +554,21 @@ class _InkFeatures extends SingleChildRenderObjectWidget {
final TickerProvider vsync; final TickerProvider vsync;
final bool absorbHitTest;
@override @override
_RenderInkFeatures createRenderObject(BuildContext context) { _RenderInkFeatures createRenderObject(BuildContext context) {
return _RenderInkFeatures( return _RenderInkFeatures(
color: color, color: color,
absorbHitTest: absorbHitTest,
vsync: vsync, vsync: vsync,
); );
} }
@override @override
void updateRenderObject(BuildContext context, _RenderInkFeatures renderObject) { void updateRenderObject(BuildContext context, _RenderInkFeatures renderObject) {
renderObject.color = color; renderObject..color = color
..absorbHitTest = absorbHitTest;
assert(vsync == renderObject.vsync); assert(vsync == renderObject.vsync);
} }
} }
......
...@@ -10,6 +10,7 @@ import 'package:flutter/rendering.dart'; ...@@ -10,6 +10,7 @@ import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import '../rendering/mock_canvas.dart';
import '../widgets/semantics_tester.dart'; import '../widgets/semantics_tester.dart';
Widget buildSliverAppBarApp({ Widget buildSliverAppBarApp({
...@@ -1103,6 +1104,48 @@ void main() { ...@@ -1103,6 +1104,48 @@ void main() {
expect(find.byIcon(Icons.menu), findsNothing); expect(find.byIcon(Icons.menu), findsNothing);
}); });
testWidgets('AppBar ink splash draw on the correct canvas', (WidgetTester tester) async {
// This is a regression test for https://github.com/flutter/flutter/issues/58665
final Key key = UniqueKey();
await tester.pumpWidget(
MaterialApp(
home: Center(
child: AppBar(
title: const Text('Abc'),
actions: <Widget>[
IconButton(
key: key,
icon: const Icon(Icons.add_circle),
tooltip: 'First button',
onPressed: () {},
),
],
flexibleSpace: DecoratedBox(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: const Alignment(0.0, -1.0),
end: const Alignment(-0.04, 1.0),
colors: <Color>[Colors.blue.shade500, Colors.blue.shade800],
),
),
),
),
),
),
);
final RenderObject painter = tester.renderObject(
find.descendant(
of: find.descendant(
of: find.byType(AppBar),
matching: find.byType(Stack),
),
matching: find.byType(Material)
)
);
await tester.tap(find.byKey(key));
expect(painter, paints..save()..translate()..save()..translate()..circle(x: 24.0, y: 28.0));
});
testWidgets('AppBar handles loose children 0', (WidgetTester tester) async { testWidgets('AppBar handles loose children 0', (WidgetTester tester) async {
final GlobalKey key = GlobalKey(); final GlobalKey key = GlobalKey();
await tester.pumpWidget( await tester.pumpWidget(
......
...@@ -219,6 +219,35 @@ void main() { ...@@ -219,6 +219,35 @@ void main() {
expect(modelE.shadowColor, equals(const Color(0xFFFF0000))); expect(modelE.shadowColor, equals(const Color(0xFFFF0000)));
}); });
testWidgets('Transparent material widget does not absorb hit test', (WidgetTester tester) async {
// This is a regression test for https://github.com/flutter/flutter/issues/58665.
bool pressed = false;
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: Stack(
children: <Widget>[
RaisedButton(
onPressed: () {
pressed = true;
},
),
Material(
type: MaterialType.transparency,
child: Container(
width: 400.0,
height: 500.0,
),
),
],
),
),
),
);
await tester.tap(find.byType(RaisedButton));
expect(pressed, isTrue);
});
group('Elevation Overlay', () { group('Elevation Overlay', () {
testWidgets('applyElevationOverlayColor set to false does not change surface color', (WidgetTester tester) async { testWidgets('applyElevationOverlayColor set to false does not change surface color', (WidgetTester tester) async {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment