Re-land Expose height and width factor in AnimatedAlign (#61136)
This commit is contained in:
parent
54f99d642d
commit
e24cdab517
@ -882,10 +882,14 @@ class AnimatedAlign extends ImplicitlyAnimatedWidget {
|
|||||||
Key key,
|
Key key,
|
||||||
@required this.alignment,
|
@required this.alignment,
|
||||||
this.child,
|
this.child,
|
||||||
|
this.heightFactor,
|
||||||
|
this.widthFactor,
|
||||||
Curve curve = Curves.linear,
|
Curve curve = Curves.linear,
|
||||||
@required Duration duration,
|
@required Duration duration,
|
||||||
VoidCallback onEnd,
|
VoidCallback onEnd,
|
||||||
}) : assert(alignment != null),
|
}) : assert(alignment != null),
|
||||||
|
assert(widthFactor == null || widthFactor >= 0.0),
|
||||||
|
assert(heightFactor == null || heightFactor >= 0.0),
|
||||||
super(key: key, curve: curve, duration: duration, onEnd: onEnd);
|
super(key: key, curve: curve, duration: duration, onEnd: onEnd);
|
||||||
|
|
||||||
/// How to align the child.
|
/// How to align the child.
|
||||||
@ -911,6 +915,16 @@ class AnimatedAlign extends ImplicitlyAnimatedWidget {
|
|||||||
/// {@macro flutter.widgets.child}
|
/// {@macro flutter.widgets.child}
|
||||||
final Widget child;
|
final Widget child;
|
||||||
|
|
||||||
|
/// If non-null, sets its height to the child's height multiplied by this factor.
|
||||||
|
///
|
||||||
|
/// Must be greater than or equal to 0.0, defaults to null.
|
||||||
|
final double heightFactor;
|
||||||
|
|
||||||
|
/// If non-null, sets its width to the child's width multiplied by this factor.
|
||||||
|
///
|
||||||
|
/// Must be greater than or equal to 0.0, defaults to null.
|
||||||
|
final double widthFactor;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_AnimatedAlignState createState() => _AnimatedAlignState();
|
_AnimatedAlignState createState() => _AnimatedAlignState();
|
||||||
|
|
||||||
@ -923,16 +937,26 @@ class AnimatedAlign extends ImplicitlyAnimatedWidget {
|
|||||||
|
|
||||||
class _AnimatedAlignState extends AnimatedWidgetBaseState<AnimatedAlign> {
|
class _AnimatedAlignState extends AnimatedWidgetBaseState<AnimatedAlign> {
|
||||||
AlignmentGeometryTween _alignment;
|
AlignmentGeometryTween _alignment;
|
||||||
|
Tween<double> _heightFactorTween;
|
||||||
|
Tween<double> _widthFactorTween;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void forEachTween(TweenVisitor<dynamic> visitor) {
|
void forEachTween(TweenVisitor<dynamic> visitor) {
|
||||||
_alignment = visitor(_alignment, widget.alignment, (dynamic value) => AlignmentGeometryTween(begin: value as AlignmentGeometry)) as AlignmentGeometryTween;
|
_alignment = visitor(_alignment, widget.alignment, (dynamic value) => AlignmentGeometryTween(begin: value as AlignmentGeometry)) as AlignmentGeometryTween;
|
||||||
|
if(widget.heightFactor != null) {
|
||||||
|
_heightFactorTween = visitor(_heightFactorTween, widget.heightFactor, (dynamic value) => Tween<double>(begin: value as double)) as Tween<double>;
|
||||||
|
}
|
||||||
|
if(widget.widthFactor != null) {
|
||||||
|
_widthFactorTween = visitor(_widthFactorTween, widget.widthFactor, (dynamic value) => Tween<double>(begin: value as double)) as Tween<double>;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Align(
|
return Align(
|
||||||
alignment: _alignment.evaluate(animation),
|
alignment: _alignment.evaluate(animation),
|
||||||
|
heightFactor: _heightFactorTween?.evaluate(animation),
|
||||||
|
widthFactor: _widthFactorTween?.evaluate(animation),
|
||||||
child: widget.child,
|
child: widget.child,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -941,6 +965,8 @@ class _AnimatedAlignState extends AnimatedWidgetBaseState<AnimatedAlign> {
|
|||||||
void debugFillProperties(DiagnosticPropertiesBuilder description) {
|
void debugFillProperties(DiagnosticPropertiesBuilder description) {
|
||||||
super.debugFillProperties(description);
|
super.debugFillProperties(description);
|
||||||
description.add(DiagnosticsProperty<AlignmentGeometryTween>('alignment', _alignment, defaultValue: null));
|
description.add(DiagnosticsProperty<AlignmentGeometryTween>('alignment', _alignment, defaultValue: null));
|
||||||
|
description.add(DiagnosticsProperty<Tween<double>>('widthFactor', _widthFactorTween, defaultValue: null));
|
||||||
|
description.add(DiagnosticsProperty<Tween<double>>('heightFactor', _heightFactorTween, defaultValue: null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,4 +112,51 @@ void main() {
|
|||||||
expect(size.width, equals(800.0));
|
expect(size.width, equals(800.0));
|
||||||
expect(size.height, equals(10.0));
|
expect(size.height, equals(10.0));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('Align widthFactor', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
Align(
|
||||||
|
widthFactor: 0.5,
|
||||||
|
child: Container(
|
||||||
|
height: 100.0,
|
||||||
|
width: 100.0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
final RenderBox box = tester.renderObject<RenderBox>(find.byType(Align));
|
||||||
|
expect(box.size.width, equals(50.0));
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('Align heightFactor', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: <Widget>[
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
heightFactor: 0.5,
|
||||||
|
child: Container(
|
||||||
|
height: 100.0,
|
||||||
|
width: 100.0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
final RenderBox box = tester.renderObject<RenderBox>(find.byType(Align));
|
||||||
|
expect(box.size.height, equals(50.0));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -59,4 +59,104 @@ void main() {
|
|||||||
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
|
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
|
||||||
expect(tester.getTopRight(find.byKey(target)), const Offset(800.0, 400.0));
|
expect(tester.getTopRight(find.byKey(target)), const Offset(800.0, 400.0));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('AnimatedAlign widthFactor', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: <Widget>[
|
||||||
|
AnimatedAlign(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
curve: Curves.ease,
|
||||||
|
widthFactor: 0.5,
|
||||||
|
duration: const Duration(milliseconds: 200),
|
||||||
|
child: Container(
|
||||||
|
height: 100.0,
|
||||||
|
width: 100.0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
final RenderBox box = tester.renderObject<RenderBox>(find.byType(AnimatedAlign));
|
||||||
|
expect(box.size.width, equals(50.0));
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('AnimatedAlign heightFactor', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
AnimatedAlign(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
curve: Curves.ease,
|
||||||
|
heightFactor: 0.5,
|
||||||
|
duration: const Duration(milliseconds: 200),
|
||||||
|
child: Container(
|
||||||
|
height: 100.0,
|
||||||
|
width: 100.0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
final RenderBox box = tester.renderObject<RenderBox>(find.byType(AnimatedAlign));
|
||||||
|
expect(box.size.height, equals( 50.0));
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('AnimatedAlign null height factor', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
AnimatedAlign(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
curve: Curves.ease,
|
||||||
|
duration: const Duration(milliseconds: 200),
|
||||||
|
child: Container(
|
||||||
|
height: 100.0,
|
||||||
|
width: 100.0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
final RenderBox box = tester.renderObject<RenderBox>(find.byType(Container));
|
||||||
|
expect(box.size, equals(const Size(100.0, 100)));
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('AnimatedAlign null widthFactor', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: SizedBox.shrink(
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: <Widget>[
|
||||||
|
AnimatedAlign(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
curve: Curves.ease,
|
||||||
|
duration: const Duration(milliseconds: 200),
|
||||||
|
child: Container(
|
||||||
|
height: 100.0,
|
||||||
|
width: 100.0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
final RenderBox box = tester.renderObject<RenderBox>(find.byType(Container));
|
||||||
|
expect(box.size, equals(const Size(100.0, 100)));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user