|
11 | 11 | import 'package:flutter/cupertino.dart'; |
12 | 12 | import 'package:flutter/foundation.dart'; |
13 | 13 | import 'package:flutter/material.dart'; |
| 14 | +import 'package:flutter/rendering.dart'; |
14 | 15 | import 'package:flutter/services.dart'; |
15 | 16 | import 'package:flutter_test/flutter_test.dart'; |
16 | 17 |
|
@@ -1265,6 +1266,83 @@ void main() { |
1265 | 1266 | expect(find.byType(GlowingOverscrollIndicator), findsNothing); |
1266 | 1267 | }, variant: TargetPlatformVariant.only(TargetPlatform.android)); |
1267 | 1268 |
|
| 1269 | + testWidgets( |
| 1270 | + 'ListView clip behavior updates overscroll indicator clip behavior', (WidgetTester tester) async { |
| 1271 | + Widget buildFrame(Clip clipBehavior) { |
| 1272 | + return MaterialApp( |
| 1273 | + theme: ThemeData(useMaterial3: true), |
| 1274 | + home: Column( |
| 1275 | + children: <Widget>[ |
| 1276 | + SizedBox( |
| 1277 | + height: 300, |
| 1278 | + child: ListView.builder( |
| 1279 | + itemCount: 20, |
| 1280 | + clipBehavior: clipBehavior, |
| 1281 | + itemBuilder: (BuildContext context, int index){ |
| 1282 | + return Padding( |
| 1283 | + padding: const EdgeInsets.all(10.0), |
| 1284 | + child: Text('Index $index'), |
| 1285 | + ); |
| 1286 | + }, |
| 1287 | + ), |
| 1288 | + ), |
| 1289 | + Opacity( |
| 1290 | + opacity: 0.5, |
| 1291 | + child: Container( |
| 1292 | + color: const Color(0xD0FF0000), |
| 1293 | + height: 100, |
| 1294 | + ), |
| 1295 | + ), |
| 1296 | + ], |
| 1297 | + ), |
| 1298 | + ); |
| 1299 | + } |
| 1300 | + |
| 1301 | + // Test default clip behavior. |
| 1302 | + await tester.pumpWidget(buildFrame(Clip.hardEdge)); |
| 1303 | + |
| 1304 | + expect(find.byType(StretchingOverscrollIndicator), findsOneWidget); |
| 1305 | + expect(find.byType(GlowingOverscrollIndicator), findsNothing); |
| 1306 | + expect(find.text('Index 1'), findsOneWidget); |
| 1307 | + |
| 1308 | + RenderClipRect renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first; |
| 1309 | + // Currently not clipping |
| 1310 | + expect(renderClip.clipBehavior, equals(Clip.none)); |
| 1311 | + |
| 1312 | + TestGesture gesture = await tester.startGesture(tester.getCenter(find.text('Index 1'))); |
| 1313 | + // Overscroll the start. |
| 1314 | + await gesture.moveBy(const Offset(0.0, 200.0)); |
| 1315 | + await tester.pumpAndSettle(); |
| 1316 | + expect(find.text('Index 1'), findsOneWidget); |
| 1317 | + expect(tester.getCenter(find.text('Index 1')).dy, greaterThan(0)); |
| 1318 | + renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first; |
| 1319 | + // Now clipping |
| 1320 | + expect(renderClip.clipBehavior, equals(Clip.hardEdge)); |
| 1321 | + |
| 1322 | + await gesture.up(); |
| 1323 | + await tester.pumpAndSettle(); |
| 1324 | + |
| 1325 | + // Test custom clip behavior. |
| 1326 | + await tester.pumpWidget(buildFrame(Clip.none)); |
| 1327 | + |
| 1328 | + renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first; |
| 1329 | + // Currently not clipping |
| 1330 | + expect(renderClip.clipBehavior, equals(Clip.none)); |
| 1331 | + |
| 1332 | + gesture = await tester.startGesture(tester.getCenter(find.text('Index 1'))); |
| 1333 | + // Overscroll the start. |
| 1334 | + await gesture.moveBy(const Offset(0.0, 200.0)); |
| 1335 | + await tester.pumpAndSettle(); |
| 1336 | + expect(find.text('Index 1'), findsOneWidget); |
| 1337 | + expect(tester.getCenter(find.text('Index 1')).dy, greaterThan(0)); |
| 1338 | + renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first; |
| 1339 | + // Now clipping |
| 1340 | + expect(renderClip.clipBehavior, equals(Clip.none)); |
| 1341 | + |
| 1342 | + await gesture.up(); |
| 1343 | + await tester.pumpAndSettle(); |
| 1344 | + }, variant: TargetPlatformVariant.only(TargetPlatform.android)); |
| 1345 | + |
1268 | 1346 | testWidgets('When `useInheritedMediaQuery` is true an existing MediaQuery is used if one is available', (WidgetTester tester) async { |
1269 | 1347 | late BuildContext capturedContext; |
1270 | 1348 | final UniqueKey uniqueKey = UniqueKey(); |
|
0 commit comments