| // 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/src/rendering/sliver.dart'; |
| import 'package:flutter/src/widgets/basic.dart'; |
| import 'package:flutter/src/widgets/framework.dart'; |
| import 'package:flutter/src/widgets/layout_builder.dart'; |
| import 'package:flutter/src/widgets/scroll_view.dart'; |
| import 'package:flutter/src/widgets/sliver_layout_builder.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| class Wrapper extends StatelessWidget { |
| const Wrapper({ |
| Key? key, |
| required this.child, |
| }) : assert(child != null), |
| super(key: key); |
| |
| final Widget child; |
| |
| @override |
| Widget build(BuildContext context) => child; |
| } |
| |
| void main() { |
| testWidgets('Moving a global key from another LayoutBuilder at layout time', (WidgetTester tester) async { |
| final GlobalKey victimKey = GlobalKey(); |
| |
| await tester.pumpWidget(Row( |
| textDirection: TextDirection.ltr, |
| children: <Widget>[ |
| Wrapper( |
| child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { |
| return const SizedBox(); |
| }), |
| ), |
| Wrapper( |
| child: Wrapper( |
| child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { |
| return Wrapper( |
| child: SizedBox(key: victimKey), |
| ); |
| }), |
| ), |
| ), |
| ], |
| )); |
| |
| await tester.pumpWidget(Row( |
| textDirection: TextDirection.ltr, |
| children: <Widget>[ |
| Wrapper( |
| child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { |
| return Wrapper( |
| child: SizedBox(key: victimKey), |
| ); |
| }), |
| ), |
| Wrapper( |
| child: Wrapper( |
| child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { |
| return const SizedBox(); |
| }), |
| ), |
| ), |
| ], |
| )); |
| |
| expect(tester.takeException(), null); |
| }); |
| |
| testWidgets('Moving a global key from another SliverLayoutBuilder at layout time', (WidgetTester tester) async { |
| final GlobalKey victimKey1 = GlobalKey(); |
| final GlobalKey victimKey2 = GlobalKey(); |
| |
| await tester.pumpWidget( |
| Directionality( |
| textDirection: TextDirection.ltr, |
| child: CustomScrollView( |
| slivers: <Widget>[ |
| SliverLayoutBuilder( |
| builder: (BuildContext context, SliverConstraints constraint) { |
| return SliverPadding(key: victimKey1, padding: const EdgeInsets.fromLTRB(1, 2, 3, 4)); |
| }, |
| ), |
| SliverLayoutBuilder( |
| builder: (BuildContext context, SliverConstraints constraint) { |
| return SliverPadding(key: victimKey2, padding: const EdgeInsets.fromLTRB(5, 7, 11, 13)); |
| }, |
| ), |
| SliverLayoutBuilder( |
| builder: (BuildContext context, SliverConstraints constraint) { |
| return const SliverPadding(padding: EdgeInsets.fromLTRB(5, 7, 11, 13)); |
| }, |
| ), |
| ], |
| ), |
| ), |
| ); |
| |
| await tester.pumpWidget( |
| Directionality( |
| textDirection: TextDirection.ltr, |
| child: CustomScrollView( |
| slivers: <Widget>[ |
| SliverLayoutBuilder( |
| builder: (BuildContext context, SliverConstraints constraint) { |
| return SliverPadding(key: victimKey2, padding: const EdgeInsets.fromLTRB(1, 2, 3, 4)); |
| }, |
| ), |
| SliverLayoutBuilder( |
| builder: (BuildContext context, SliverConstraints constraint) { |
| return const SliverPadding(padding: EdgeInsets.fromLTRB(5, 7, 11, 13)); |
| }, |
| ), |
| SliverLayoutBuilder( |
| builder: (BuildContext context, SliverConstraints constraint) { |
| return SliverPadding(key: victimKey1, padding: const EdgeInsets.fromLTRB(5, 7, 11, 13)); |
| }, |
| ), |
| ], |
| ), |
| ), |
| ); |
| |
| expect(tester.takeException(), null); |
| }); |
| } |