Revert "Add CompositedTransformFollower.{followerAnchor, leaderAnchor… (#65878)
Revert "Add CompositedTransformFollower.{followerAnchor, leaderAnchor} for custom anchoring (#64930)" (#65871)
diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart
index 507198a..83d789b 100644
--- a/packages/flutter/lib/src/rendering/layer.dart
+++ b/packages/flutter/lib/src/rendering/layer.dart
@@ -3,6 +3,7 @@
// found in the LICENSE file.
import 'dart:async';
+import 'dart:collection';
import 'dart:ui' as ui;
import 'package:flutter/foundation.dart';
@@ -2027,14 +2028,6 @@
LeaderLayer? get leader => _leader;
LeaderLayer? _leader;
- /// The total size of [leader]'s contents.
- ///
- /// Generally this should be set by the [RenderObject] that paints on the
- /// registered [leader] layer (for instance a [RenderLeaderLayer] that shares
- /// this link with its followers). This size may be outdated before and during
- /// layout.
- Size? leaderSize;
-
@override
String toString() => '${describeIdentity(this)}(${ _leader != null ? "<linked>" : "<dangling>" })';
}
@@ -2273,91 +2266,59 @@
/// treated as the child of the second, and so forth. The first layer in the
/// list won't have [applyTransform] called on it. The first layer may be
/// null.
- static Matrix4 _collectTransformForLayerChain(List<ContainerLayer?> layers) {
+ Matrix4 _collectTransformForLayerChain(List<ContainerLayer?> layers) {
// Initialize our result matrix.
final Matrix4 result = Matrix4.identity();
// Apply each layer to the matrix in turn, starting from the last layer,
// and providing the previous layer as the child.
for (int index = layers.length - 1; index > 0; index -= 1)
- layers[index]?.applyTransform(layers[index - 1], result);
+ layers[index]!.applyTransform(layers[index - 1], result);
return result;
}
- /// Find the common ancestor of two layers [a] and [b] by searching towards
- /// the root of the tree, and append each ancestor of [a] or [b] visited along
- /// the path to [ancestorsA] and [ancestorsB] respectively.
- ///
- /// Returns null if [a] [b] do not share a common ancestor, in which case the
- /// results in [ancestorsA] and [ancestorsB] are undefined.
- static Layer? _pathsToCommonAncestor(
- Layer? a, Layer? b,
- List<ContainerLayer?> ancestorsA, List<ContainerLayer?> ancestorsB,
- ) {
- // No common ancestor found.
- if (a == null || b == null)
- return null;
-
- if (identical(a, b))
- return a;
-
- if (a.depth < b.depth) {
- ancestorsB.add(b.parent);
- return _pathsToCommonAncestor(a, b.parent, ancestorsA, ancestorsB);
- } else if (a.depth > b.depth){
- ancestorsA.add(a.parent);
- return _pathsToCommonAncestor(a.parent, b, ancestorsA, ancestorsB);
- }
-
- ancestorsA.add(a.parent);
- ancestorsB.add(b.parent);
- return _pathsToCommonAncestor(a.parent, b.parent, ancestorsA, ancestorsB);
- }
-
/// Populate [_lastTransform] given the current state of the tree.
void _establishTransform() {
assert(link != null);
_lastTransform = null;
- final LeaderLayer? leader = link.leader;
// Check to see if we are linked.
- if (leader == null)
+ if (link.leader == null)
return;
// If we're linked, check the link is valid.
- assert(
- leader.owner == owner,
- 'Linked LeaderLayer anchor is not in the same layer tree as the FollowerLayer.',
- );
- assert(
- leader._lastOffset != null,
- 'LeaderLayer anchor must come before FollowerLayer in paint order, but the reverse was true.',
- );
-
- // Stores [leader, ..., commonAncestor] after calling _pathsToCommonAncestor.
- final List<ContainerLayer?> forwardLayers = <ContainerLayer>[leader];
- // Stores [this (follower), ..., commonAncestor] after calling
- // _pathsToCommonAncestor.
- final List<ContainerLayer?> inverseLayers = <ContainerLayer>[this];
-
- final Layer? ancestor = _pathsToCommonAncestor(
- leader, this,
- forwardLayers, inverseLayers,
- );
- assert(ancestor != null);
-
+ assert(link.leader!.owner == owner, 'Linked LeaderLayer anchor is not in the same layer tree as the FollowerLayer.');
+ assert(link.leader!._lastOffset != null, 'LeaderLayer anchor must come before FollowerLayer in paint order, but the reverse was true.');
+ // Collect all our ancestors into a Set so we can recognize them.
+ final Set<Layer> ancestors = HashSet<Layer>();
+ Layer? ancestor = parent;
+ while (ancestor != null) {
+ ancestors.add(ancestor);
+ ancestor = ancestor.parent;
+ }
+ // Collect all the layers from a hypothetical child (null) of the target
+ // layer up to the common ancestor layer.
+ ContainerLayer? layer = link.leader;
+ final List<ContainerLayer?> forwardLayers = <ContainerLayer?>[null, layer];
+ do {
+ layer = layer!.parent;
+ forwardLayers.add(layer);
+ } while (!ancestors.contains(layer)); // ignore: iterable_contains_unrelated_type
+ ancestor = layer;
+ // Collect all the layers from this layer up to the common ancestor layer.
+ layer = this;
+ final List<ContainerLayer> inverseLayers = <ContainerLayer>[layer];
+ do {
+ layer = layer!.parent;
+ inverseLayers.add(layer!);
+ } while (layer != ancestor);
+ // Establish the forward and backward matrices given these lists of layers.
final Matrix4 forwardTransform = _collectTransformForLayerChain(forwardLayers);
- // Further transforms the coordinate system to a hypothetical child (null)
- // of the leader layer, to account for the leader's additional paint offset
- // and layer offset (LeaderLayer._lastOffset).
- leader.applyTransform(null, forwardTransform);
- forwardTransform.translate(linkedOffset!.dx, linkedOffset!.dy);
-
final Matrix4 inverseTransform = _collectTransformForLayerChain(inverseLayers);
-
if (inverseTransform.invert() == 0.0) {
// We are in a degenerate transform, so there's not much we can do.
return;
}
// Combine the matrices and store the result.
inverseTransform.multiply(forwardTransform);
+ inverseTransform.translate(linkedOffset!.dx, linkedOffset!.dy);
_lastTransform = inverseTransform;
_inverseDirty = true;
}
diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart
index 63211d4..950c656 100644
--- a/packages/flutter/lib/src/rendering/proxy_box.dart
+++ b/packages/flutter/lib/src/rendering/proxy_box.dart
@@ -4826,25 +4826,22 @@
required LayerLink link,
RenderBox? child,
}) : assert(link != null),
- _link = link,
- super(child);
+ super(child) {
+ this.link = link;
+ }
/// The link object that connects this [RenderLeaderLayer] with one or more
/// [RenderFollowerLayer]s.
///
/// This property must not be null. The object must not be associated with
/// another [RenderLeaderLayer] that is also being painted.
- LayerLink get link => _link;
- LayerLink _link;
+ LayerLink get link => _link!;
+ LayerLink? _link;
set link(LayerLink value) {
assert(value != null);
if (_link == value)
return;
- _link.leaderSize = null;
_link = value;
- if (hasSize) {
- _link.leaderSize = size;
- }
markNeedsPaint();
}
@@ -4852,12 +4849,6 @@
bool get alwaysNeedsCompositing => true;
@override
- void performLayout() {
- super.performLayout();
- link.leaderSize = size;
- }
-
- @override
void paint(PaintingContext context, Offset offset) {
if (layer == null) {
layer = LeaderLayer(link: link, offset: offset);
@@ -4899,8 +4890,6 @@
required LayerLink link,
bool showWhenUnlinked = true,
Offset offset = Offset.zero,
- Alignment leaderAnchor = Alignment.topLeft,
- Alignment followerAnchor = Alignment.topLeft,
RenderBox? child,
}) : assert(link != null),
assert(showWhenUnlinked != null),
@@ -4908,8 +4897,6 @@
_link = link,
_showWhenUnlinked = showWhenUnlinked,
_offset = offset,
- _leaderAnchor = leaderAnchor,
- _followerAnchor = followerAnchor,
super(child);
/// The link object that connects this [RenderFollowerLayer] with a
@@ -4955,46 +4942,6 @@
markNeedsPaint();
}
- /// The anchor point on the linked [RenderLeaderLayer] that [followerAnchor]
- /// will line up with.
- ///
- /// {@template flutter.rendering.followerLayer.anchor}
- /// For example, when [leaderAnchor] and [followerAnchor] are both
- /// [Alignment.topLeft], this [RenderFollowerLayer] will be top left aligned
- /// with the linked [RenderLeaderLayer]. When [leaderAnchor] is
- /// [Alignment.bottomLeft] and [followerAnchor] is [Alignment.topLeft], this
- /// [RenderFollowerLayer] will be left aligned with the linked
- /// [RenderLeaderLayer], and its top edge will line up with the
- /// [RenderLeaderLayer]'s bottom edge.
- /// {@endtemplate}
- ///
- /// Defaults to [Alignment.topLeft].
- Alignment get leaderAnchor => _leaderAnchor;
- Alignment _leaderAnchor;
- set leaderAnchor(Alignment value) {
- assert(value != null);
- if (_leaderAnchor == value)
- return;
- _leaderAnchor = value;
- markNeedsPaint();
- }
-
- /// The anchor point on this [RenderFollowerLayer] that will line up with
- /// [followerAnchor] on the linked [RenderLeaderLayer].
- ///
- /// {@macro flutter.rendering.followerLayer.anchor}
- ///
- /// Defaults to [Alignment.topLeft].
- Alignment get followerAnchor => _followerAnchor;
- Alignment _followerAnchor;
- set followerAnchor(Alignment value) {
- assert(value != null);
- if (_followerAnchor == value)
- return;
- _followerAnchor = value;
- markNeedsPaint();
- }
-
@override
void detach() {
layer = null;
@@ -5043,29 +4990,19 @@
@override
void paint(PaintingContext context, Offset offset) {
- final Size? leaderSize = link.leaderSize;
- assert(
- link.leaderSize != null || (link.leader == null || leaderAnchor == Alignment.topLeft),
- '$link: layer is linked to ${link.leader} but a valid leaderSize is not set. '
- 'leaderSize is required when leaderAnchor is not Alignment.topLeft'
- '(current value is $leaderAnchor).',
- );
- final Offset effectiveLinkedOffset = leaderSize == null
- ? this.offset
- : leaderAnchor.alongSize(leaderSize) - followerAnchor.alongSize(size) + this.offset;
assert(showWhenUnlinked != null);
if (layer == null) {
layer = FollowerLayer(
link: link,
showWhenUnlinked: showWhenUnlinked,
- linkedOffset: effectiveLinkedOffset,
+ linkedOffset: this.offset,
unlinkedOffset: offset,
);
} else {
- layer
- ?..link = link
+ layer!
+ ..link = link
..showWhenUnlinked = showWhenUnlinked
- ..linkedOffset = effectiveLinkedOffset
+ ..linkedOffset = this.offset
..unlinkedOffset = offset;
}
context.pushLayer(
diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart
index 6b1a2d4..d7c2a31 100644
--- a/packages/flutter/lib/src/widgets/basic.dart
+++ b/packages/flutter/lib/src/widgets/basic.dart
@@ -1330,11 +1330,9 @@
///
/// When this widget is composited during the compositing phase (which comes
/// after the paint phase, as described in [WidgetsBinding.drawFrame]), it
-/// applies a transformation that brings [targetAnchor] of the linked
-/// [CompositedTransformTarget] and [followerAnchor] of this widget together.
-/// The two anchor points will have the same global coordinates, unless [offset]
-/// is not [Offset.zero], in which case [followerAnchor] will be offset by
-/// [offset] in the linked [CompositedTransformTarget]'s coordinate space.
+/// applies a transformation that causes it to provide its child with a
+/// coordinate space that matches that of the linked [CompositedTransformTarget]
+/// widget, offset by [offset].
///
/// The [LayerLink] object used as the [link] must be the same object as that
/// provided to the matching [CompositedTransformTarget].
@@ -1366,14 +1364,10 @@
@required this.link,
this.showWhenUnlinked = true,
this.offset = Offset.zero,
- this.targetAnchor = Alignment.topLeft,
- this.followerAnchor = Alignment.topLeft,
Widget child,
}) : assert(link != null),
assert(showWhenUnlinked != null),
assert(offset != null),
- assert(targetAnchor != null),
- assert(followerAnchor != null),
super(key: key, child: child);
/// The link object that connects this [CompositedTransformFollower] with a
@@ -1393,33 +1387,8 @@
/// hidden.
final bool showWhenUnlinked;
- /// The anchor point on the linked [CompositedTransformTarget] that
- /// [followerAnchor] will line up with.
- ///
- /// {@template flutter.widgets.followerLayer.anchor}
- /// For example, when [targetAnchor] and [followerAnchor] are both
- /// [Alignment.topLeft], this widget will be top left aligned with the linked
- /// [CompositedTransformTarget]. When [targetAnchor] is
- /// [Alignment.bottomLeft] and [followerAnchor] is [Alignment.topLeft], this
- /// widget will be left aligned with the linked [CompositedTransformTarget],
- /// and its top edge will line up with the [CompositedTransformTarget]'s
- /// bottom edge.
- /// {@endtemplate}
- ///
- /// Defaults to [Alignment.topLeft].
- final Alignment targetAnchor;
-
- /// The anchor point on this widget that will line up with [followerAnchor] on
- /// the linked [CompositedTransformTarget].
- ///
- /// {@macro flutter.widgets.followerLayer.anchor}
- ///
- /// Defaults to [Alignment.topLeft].
- final Alignment followerAnchor;
-
- /// The additional offset to apply to the [targetAnchor] of the linked
- /// [CompositedTransformTarget] to obtain this widget's [followerAnchor]
- /// position.
+ /// The offset to apply to the origin of the linked
+ /// [CompositedTransformTarget] to obtain this widget's origin.
final Offset offset;
@override
@@ -1428,8 +1397,6 @@
link: link,
showWhenUnlinked: showWhenUnlinked,
offset: offset,
- leaderAnchor: targetAnchor,
- followerAnchor: followerAnchor,
);
}
@@ -1438,9 +1405,7 @@
renderObject
..link = link
..showWhenUnlinked = showWhenUnlinked
- ..offset = offset
- ..leaderAnchor = targetAnchor
- ..followerAnchor = followerAnchor;
+ ..offset = offset;
}
}
diff --git a/packages/flutter/test/widgets/composited_transform_test.dart b/packages/flutter/test/widgets/composited_transform_test.dart
index fb9e388..5e40512 100644
--- a/packages/flutter/test/widgets/composited_transform_test.dart
+++ b/packages/flutter/test/widgets/composited_transform_test.dart
@@ -9,12 +9,11 @@
import 'package:flutter/widgets.dart';
void main() {
- final LayerLink link = LayerLink();
- group('Composited transforms - only offsets', () {
+ testWidgets('Composited transforms - only offsets', (WidgetTester tester) async {
+ final LayerLink link = LayerLink();
final GlobalKey key = GlobalKey();
-
- Widget build({ @required Alignment targetAlignment, @required Alignment followerAlignment }) {
- return Directionality(
+ await tester.pumpWidget(
+ Directionality(
textDirection: TextDirection.ltr,
child: Stack(
children: <Widget>[
@@ -31,41 +30,23 @@
top: 343.0,
child: CompositedTransformFollower(
link: link,
- targetAnchor: targetAlignment,
- followerAnchor: followerAlignment,
- child: Container(key: key, height: 20.0, width: 20.0),
+ child: Container(key: key, height: 10.0, width: 10.0),
),
),
],
),
- );
- }
-
- testWidgets('topLeft', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.topLeft, followerAlignment: Alignment.topLeft));
- final RenderBox box = key.currentContext.findRenderObject() as RenderBox;
- expect(box.localToGlobal(Offset.zero), const Offset(123.0, 456.0));
- });
-
- testWidgets('center', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.center, followerAlignment: Alignment.center));
- final RenderBox box = key.currentContext.findRenderObject() as RenderBox;
- expect(box.localToGlobal(Offset.zero), const Offset(118.0, 451.0));
- });
-
- testWidgets('bottomRight - topRight', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.bottomRight, followerAlignment: Alignment.topRight));
- final RenderBox box = key.currentContext.findRenderObject() as RenderBox;
- expect(box.localToGlobal(Offset.zero), const Offset(113.0, 466.0));
- });
+ ),
+ );
+ final RenderBox box = key.currentContext.findRenderObject() as RenderBox;
+ expect(box.localToGlobal(Offset.zero), const Offset(123.0, 456.0));
});
- group('Composited transforms - with rotations', () {
+ testWidgets('Composited transforms - with rotations', (WidgetTester tester) async {
+ final LayerLink link = LayerLink();
final GlobalKey key1 = GlobalKey();
final GlobalKey key2 = GlobalKey();
-
- Widget build({ @required Alignment targetAlignment, @required Alignment followerAlignment }) {
- return Directionality(
+ await tester.pumpWidget(
+ Directionality(
textDirection: TextDirection.ltr,
child: Stack(
children: <Widget>[
@@ -76,7 +57,7 @@
angle: 1.0, // radians
child: CompositedTransformTarget(
link: link,
- child: Container(key: key1, width: 80.0, height: 10.0),
+ child: Container(key: key1, height: 10.0, width: 10.0),
),
),
),
@@ -87,50 +68,28 @@
angle: -0.3, // radians
child: CompositedTransformFollower(
link: link,
- targetAnchor: targetAlignment,
- followerAnchor: followerAlignment,
- child: Container(key: key2, width: 40.0, height: 20.0),
+ child: Container(key: key2, height: 10.0, width: 10.0),
),
),
),
],
),
- );
- }
- testWidgets('topLeft', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.topLeft, followerAlignment: Alignment.topLeft));
- final RenderBox box1 = key1.currentContext.findRenderObject() as RenderBox;
- final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
- final Offset position1 = box1.localToGlobal(Offset.zero);
- final Offset position2 = box2.localToGlobal(Offset.zero);
- expect(position1, offsetMoreOrLessEquals(position2));
- });
-
- testWidgets('center', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.center, followerAlignment: Alignment.center));
- final RenderBox box1 = key1.currentContext.findRenderObject() as RenderBox;
- final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
- final Offset position1 = box1.localToGlobal(const Offset(40, 5));
- final Offset position2 = box2.localToGlobal(const Offset(20, 10));
- expect(position1, offsetMoreOrLessEquals(position2));
- });
-
- testWidgets('bottomRight - topRight', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.bottomRight, followerAlignment: Alignment.topRight));
- final RenderBox box1 = key1.currentContext.findRenderObject() as RenderBox;
- final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
- final Offset position1 = box1.localToGlobal(const Offset(80, 10));
- final Offset position2 = box2.localToGlobal(const Offset(40, 0));
- expect(position1, offsetMoreOrLessEquals(position2));
- });
+ ),
+ );
+ final RenderBox box1 = key1.currentContext.findRenderObject() as RenderBox;
+ final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
+ final Offset position1 = box1.localToGlobal(Offset.zero);
+ final Offset position2 = box2.localToGlobal(Offset.zero);
+ expect(position1.dx, moreOrLessEquals(position2.dx));
+ expect(position1.dy, moreOrLessEquals(position2.dy));
});
- group('Composited transforms - nested', () {
+ testWidgets('Composited transforms - nested', (WidgetTester tester) async {
+ final LayerLink link = LayerLink();
final GlobalKey key1 = GlobalKey();
final GlobalKey key2 = GlobalKey();
-
- Widget build({ @required Alignment targetAlignment, @required Alignment followerAlignment }) {
- return Directionality(
+ await tester.pumpWidget(
+ Directionality(
textDirection: TextDirection.ltr,
child: Stack(
children: <Widget>[
@@ -141,7 +100,7 @@
angle: 1.0, // radians
child: CompositedTransformTarget(
link: link,
- child: Container(key: key1, width: 80.0, height: 10.0),
+ child: Container(key: key1, height: 10.0, width: 10.0),
),
),
),
@@ -160,9 +119,7 @@
padding: const EdgeInsets.all(20.0),
child: CompositedTransformFollower(
link: link,
- targetAnchor: targetAlignment,
- followerAnchor: followerAlignment,
- child: Container(key: key2, width: 40.0, height: 20.0),
+ child: Container(key: key2, height: 10.0, width: 10.0),
),
),
),
@@ -172,45 +129,24 @@
),
],
),
- );
- }
- testWidgets('topLeft', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.topLeft, followerAlignment: Alignment.topLeft));
- final RenderBox box1 = key1.currentContext.findRenderObject() as RenderBox;
- final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
- final Offset position1 = box1.localToGlobal(Offset.zero);
- final Offset position2 = box2.localToGlobal(Offset.zero);
- expect(position1, offsetMoreOrLessEquals(position2));
- });
-
- testWidgets('center', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.center, followerAlignment: Alignment.center));
- final RenderBox box1 = key1.currentContext.findRenderObject() as RenderBox;
- final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
- final Offset position1 = box1.localToGlobal(Alignment.center.alongSize(const Size(80, 10)));
- final Offset position2 = box2.localToGlobal(Alignment.center.alongSize(const Size(40, 20)));
- expect(position1, offsetMoreOrLessEquals(position2));
- });
-
- testWidgets('bottomRight - topRight', (WidgetTester tester) async {
- await tester.pumpWidget(build(targetAlignment: Alignment.bottomRight, followerAlignment: Alignment.topRight));
- final RenderBox box1 = key1.currentContext.findRenderObject() as RenderBox;
- final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
- final Offset position1 = box1.localToGlobal(Alignment.bottomRight.alongSize(const Size(80, 10)));
- final Offset position2 = box2.localToGlobal(Alignment.topRight.alongSize(const Size(40, 20)));
- expect(position1, offsetMoreOrLessEquals(position2));
- });
+ ),
+ );
+ final RenderBox box1 = key1.currentContext.findRenderObject() as RenderBox;
+ final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
+ final Offset position1 = box1.localToGlobal(Offset.zero);
+ final Offset position2 = box2.localToGlobal(Offset.zero);
+ expect(position1.dx, moreOrLessEquals(position2.dx));
+ expect(position1.dy, moreOrLessEquals(position2.dy));
});
- group('Composited transforms - hit testing', () {
+ testWidgets('Composited transforms - hit testing', (WidgetTester tester) async {
+ final LayerLink link = LayerLink();
final GlobalKey key1 = GlobalKey();
final GlobalKey key2 = GlobalKey();
final GlobalKey key3 = GlobalKey();
-
- bool tapped = false;
-
- Widget build({ @required Alignment targetAlignment, @required Alignment followerAlignment }) {
- return Directionality(
+ bool _tapped = false;
+ await tester.pumpWidget(
+ Directionality(
textDirection: TextDirection.ltr,
child: Stack(
children: <Widget>[
@@ -227,34 +163,18 @@
child: GestureDetector(
key: key2,
behavior: HitTestBehavior.opaque,
- onTap: () { tapped = true; },
- child: Container(key: key3, height: 2.0, width: 2.0),
+ onTap: () { _tapped = true; },
+ child: Container(key: key3, height: 10.0, width: 10.0),
),
),
],
),
- );
- }
-
- const List<Alignment> alignments = <Alignment>[
- Alignment.topLeft, Alignment.topRight,
- Alignment.center,
- Alignment.bottomLeft, Alignment.bottomRight,
- ];
-
- setUp(() { tapped = false; });
-
- for (final Alignment targetAlignment in alignments) {
- for (final Alignment followerAlignment in alignments) {
- testWidgets('$targetAlignment - $followerAlignment', (WidgetTester tester) async{
- await tester.pumpWidget(build(targetAlignment: targetAlignment, followerAlignment: followerAlignment));
- final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
- expect(box2.size, const Size(2.0, 2.0));
- expect(tapped, isFalse);
- await tester.tap(find.byKey(key3));
- expect(tapped, isTrue);
- });
- }
- }
+ ),
+ );
+ final RenderBox box2 = key2.currentContext.findRenderObject() as RenderBox;
+ expect(box2.size, const Size(10.0, 10.0));
+ expect(_tapped, isFalse);
+ await tester.tap(find.byKey(key1));
+ expect(_tapped, isTrue);
});
}