blob: 8c53331e7af86dbd9a49b4aa1306804d09688f04 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/gestures.dart' show kPressTimeout;
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
bool confirmCalled = false;
bool cancelCalled = false;
class TestInkSplash extends InkSplash {
TestInkSplash({
required MaterialInkController controller,
required RenderBox referenceBox,
Offset? position,
required Color color,
bool containedInkWell = false,
RectCallback? rectCallback,
BorderRadius? borderRadius,
ShapeBorder? customBorder,
double? radius,
VoidCallback? onRemoved,
required TextDirection textDirection,
}) : super(
controller: controller,
referenceBox: referenceBox,
position: position,
color: color,
containedInkWell: containedInkWell,
rectCallback: rectCallback,
borderRadius: borderRadius,
customBorder: customBorder,
radius: radius,
onRemoved: onRemoved,
textDirection: textDirection,
);
@override
void confirm() {
confirmCalled = true;
super.confirm();
}
@override
void cancel() {
cancelCalled = true;
super.cancel();
}
}
class TestInkSplashFactory extends InteractiveInkFeatureFactory {
const TestInkSplashFactory();
@override
InteractiveInkFeature create({
required MaterialInkController controller,
required RenderBox referenceBox,
Offset? position,
required Color color,
bool containedInkWell = false,
RectCallback? rectCallback,
BorderRadius? borderRadius,
ShapeBorder? customBorder,
double? radius,
VoidCallback? onRemoved,
required TextDirection textDirection,
}) {
return TestInkSplash(
controller: controller,
referenceBox: referenceBox,
position: position,
color: color,
containedInkWell: containedInkWell,
rectCallback: rectCallback,
borderRadius: borderRadius,
customBorder: customBorder,
radius: radius,
onRemoved: onRemoved,
textDirection: textDirection,
);
}
}
void main() {
setUp(() {
confirmCalled = false;
cancelCalled = false;
});
testWidgets('Tapping should never cause a splash', (WidgetTester tester) async {
final Key textField1 = UniqueKey();
final Key textField2 = UniqueKey();
await tester.pumpWidget(
MaterialApp(
home: Theme(
data: ThemeData.light().copyWith(splashFactory: const TestInkSplashFactory()),
child: Material(
child: Container(
alignment: Alignment.topLeft,
child: Column(
children: <Widget>[
TextField(
key: textField1,
decoration: const InputDecoration(
labelText: 'label',
),
),
TextField(
key: textField2,
decoration: const InputDecoration(
labelText: 'label',
),
),
],
),
),
),
),
),
);
await tester.tap(find.byKey(textField1));
await tester.pumpAndSettle();
expect(confirmCalled, isFalse);
expect(cancelCalled, isFalse);
await tester.tap(find.byKey(textField1));
await tester.pumpAndSettle();
expect(confirmCalled, isFalse);
expect(cancelCalled, isFalse);
await tester.tap(find.byKey(textField2));
await tester.pumpAndSettle();
expect(confirmCalled, isFalse);
expect(cancelCalled, isFalse);
await tester.tapAt(tester.getTopLeft(find.byKey(textField1)));
await tester.pumpAndSettle();
expect(confirmCalled, isFalse);
expect(cancelCalled, isFalse);
await tester.tap(find.byKey(textField2));
await tester.pumpAndSettle();
expect(confirmCalled, isFalse);
expect(cancelCalled, isFalse);
});
testWidgets('Splash should never be created or canceled', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
home: Theme(
data: ThemeData.light().copyWith(splashFactory: const TestInkSplashFactory()),
child: Material(
child: ListView(
children: <Widget>[
const TextField(
decoration: InputDecoration(
labelText: 'label1',
),
),
const TextField(
decoration: InputDecoration(
labelText: 'label2',
),
),
Container(
height: 1000.0,
color: const Color(0xFF00FF00),
),
],
),
),
),
),
);
// If there were a splash, this would cancel the splash.
final TestGesture gesture1 = await tester.startGesture(tester.getCenter(find.text('label1')));
await tester.pump(kPressTimeout);
await gesture1.moveTo(const Offset(400.0, 300.0));
await gesture1.up();
expect(confirmCalled, isFalse);
expect(cancelCalled, isFalse);
// Pointer is dragged upwards causing a scroll, splash would be canceled.
final TestGesture gesture2 = await tester.startGesture(tester.getCenter(find.text('label2')));
await tester.pump(kPressTimeout);
await gesture2.moveBy(const Offset(0.0, -200.0));
await gesture2.up();
expect(confirmCalled, isFalse);
expect(cancelCalled, isFalse);
});
}