请检查以下代码。不管我怎么做,sizeTransition并不是水平居中的。我试图将列包装在一个容器中,然后提供无限的宽度。我试着把sizetransition包在一个中心。我试图将sizetransition包装在具有中心对齐属性的容器中。我想把它叠起来。我试着给集装箱孩子以对齐中心属性等…但它们都不起作用…
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: AnimatedBox(),
);
}
}
class AnimatedBox extends StatefulWidget {
@override
createState() => _AnimatedBoxState();
}
class _AnimatedBoxState extends State<AnimatedBox> with SingleTickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(milliseconds: 400),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
RaisedButton(
child: Text('animate forward'),
onPressed: () {_controller.forward();},
),
RaisedButton(
child: Text('animate reverse'),
onPressed: () {_controller.reverse();},
),
const SizedBox(height: 100.0,),
SizeTransition(
child: Container(
width: 200.0,
height: 200.0,
color: Colors.blue,
),
sizeFactor: CurvedAnimation(
curve: Curves.fastOutSlowIn,
parent: _controller,
),
),
],
);
}
}
例如,以下代码不适用于
SizeTransition
,但适用于ScaleTransition
。我不知道SizeTransition
出了什么问题。return Container(
width: double.infinity,
child: Column(
最佳答案
尽管我以前的答案在某种程度上解决了这个问题,但我还想说明小部件有多有限以及如何解决这个问题。
sizeTransition提供“展开”其内容的效果,通过重写对齐设置以水平或垂直轴运行动画。
为了在不破坏对齐规则的情况下实现相同的效果,同时避免使用SizeTransition
小部件,因为我们需要“展开/显示”动画而不是“放大”-我建议:
@override
Widget build(BuildContext context) {
final _animation = CurvedAnimation(parent: _controller, curve: Curves.fastOutSlowIn);
return Column(
children: <Widget>[
// ...,
AnimatedBuilder(
animation: _animation,
builder: (_, child) => ClipRect(
child: Align(
alignment: Alignment.center,
heightFactor: _animation.value,
widthFactor: null,
child: child,
),
),
child: Container(
width: 200.0,
height: 200.0,
color: Colors.blue,
child: Text("test"),
),
)
]
);
}
这基本上是一个
ScaleTransition
小部件,与AnimatedBuilder
中使用的小部件相同,只是它只将对齐限制在一个轴上。如果希望动画同时在水平和垂直轴上运行-请将相同的
ClipRect
指定给Align
属性:Align(
alignment: Alignment.center,
heightFactor: _animation.value,
widthFactor: _animation.value,
child: child,
),
这将帮助您在不缩放小部件内容的情况下实现“从中心显示”效果。
关于flutter - 为什么我不能将SizeTransition水平居中于Flutter中的列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56315392/