Flutter 颤振-在隐藏一个列子项时设置高度变化的动画
我在Flutter 颤振-在隐藏一个列子项时设置高度变化的动画,flutter,flutter-animation,Flutter,Flutter Animation,我在列小部件中有两个孩子,第一个是简单的容器,第二个是扩展的小部件。 用户可以隐藏/显示第一个容器。在这种情况下,我需要在两个小部件上应用动画,因此第一个容器的高度应该自动降低,第二个小部件应该逐渐增加,直到填满整个空间 我测试了使用AnimatedContainer,但它需要指定前后的高度,我不知道这一点 有什么建议吗 class ViewerPage extends StatefulWidget { @override _ViewerPageState createState() =
列
小部件中有两个孩子,第一个是简单的容器
,第二个是扩展的
小部件。
用户可以隐藏/显示第一个容器
。在这种情况下,我需要在两个小部件上应用动画,因此第一个容器的高度应该自动降低,第二个小部件应该逐渐增加,直到填满整个空间
我测试了使用AnimatedContainer
,但它需要指定前后的高度,我不知道这一点
有什么建议吗
class ViewerPage extends StatefulWidget {
@override
_ViewerPageState createState() => _ViewerPageState();
}
class _ViewerPageState extends State<ViewerPage> {
bool visible = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Example"),
),
bottomNavigationBar: BottomAppBar(
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
IconButton(
icon: Icon(Icons.show_chart),
onPressed: () {
setState(() {
visible = !visible;
});
},
),
],
),
),
body: Container(
child: Column(
children: <Widget>[
Visibility(
visible: visible,
child: Container(
child: Text("This Container can be visible or hidden"),
color: Colors.red),
),
Expanded(
child: ListView.builder(
itemBuilder: (context, index) => Text("Item ..."),
itemCount: 20,
),
),
],
),
),
);
}
}
class ViewerPage扩展StatefulWidget{
@凌驾
_ViewerPageState createState()=>\u ViewerPageState();
}
类_ViewerPageState扩展状态{
布尔可见=真;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“示例”),
),
bottomNavigationBar:BottomAppBar(
孩子:排(
mainAxisSize:mainAxisSize.max,
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
图标按钮(
图标:图标(图标。显示图表),
已按下:(){
设置状态(){
可见=!可见;
});
},
),
],
),
),
主体:容器(
子:列(
儿童:[
可见度(
可见的,可见的,
子:容器(
子项:文本(“此容器可以可见或隐藏”),
颜色:颜色。红色),
),
扩大(
子项:ListView.builder(
itemBuilder:(上下文,索引)=>文本(“项…”),
物品计数:20,
),
),
],
),
),
);
}
}
简单,使用AnimatedSize并移除可见性。AnimatedSize自行计算高度。所以你不需要知道前后的尺寸
在这里,我对你的代码做了一些修改。现在很好用
import 'package:flutter/material.dart';
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> with SingleTickerProviderStateMixin{
bool visible = true;
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Example"),
),
bottomNavigationBar: BottomAppBar(
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
IconButton(
icon: Icon(Icons.show_chart),
onPressed: () {
setState(() {
visible = !visible;
});
},
),
],
),
),
body: Container(
child: Column(
children: <Widget>[
AnimatedSize(
duration: Duration(seconds: 1),
child: Container(
height: visible? null : 0.0,
child: Text("This Container can be visible or hidden"),
color: Colors.red
),
vsync: this,
),
Expanded(
child: ListView.builder(
itemBuilder: (context, index) => Text("Item ..."),
itemCount: 20,
),
),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
类测试扩展了StatefulWidget{
@凌驾
_TestState createState();
}
类_TestState使用SingleTickerProviderStateMixin扩展状态{
布尔可见=真;
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“示例”),
),
bottomNavigationBar:BottomAppBar(
孩子:排(
mainAxisSize:mainAxisSize.max,
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
图标按钮(
图标:图标(图标。显示图表),
已按下:(){
设置状态(){
可见=!可见;
});
},
),
],
),
),
主体:容器(
子:列(
儿童:[
动画大小(
持续时间:持续时间(秒数:1),
子:容器(
高度:可见?空值:0.0,
子项:文本(“此容器可以可见或隐藏”),
颜色:颜色。红色
),
vsync:这个,,
),
扩大(
子项:ListView.builder(
itemBuilder:(上下文,索引)=>文本(“项…”),
物品计数:20,
),
),
],
),
),
);
}
}