如何为列表内的容器设置动画

Noa*_*oam 4 dart flutter flutter-layout flutter-animation

我有一个容器列表,我想为容器设置动画。

比如改变他的高度/宽度,改变容器的内容。

到目前为止我所做的是:

containerHeight =  MediaQuery.of(context).size.height * 0.20;
body: Container(
            child: ListView.builder(
              itemCount: data.length,
              itemBuilder: (BuildContext context, int index) {
                return Padding(
          padding: const EdgeInsets.all(15.0),
          child: Container(
            color: Colors.black,
            height: containerHeight,
            child: IconButton(
              icon: Icon(Icons.list),
              color: Colors.white,
              onPressed: () {
                setState(() {
                 containerHeight =  MediaQuery.of(context).size.height * 0.35;
                });
              },
            ),
          ),
        );
              },
            ),
Run Code Online (Sandbox Code Playgroud)

我打算使用AnimatedContainer,但即使在使用它之前,如果我按下按钮什么也没有发生

Aji*_* O. 5

这就是我让它工作的方式。我只是用动画容器替换了容器

class _HomePageState extends State<HomePage> {
  List<String> dataList = ['Andrew', 'Test', 'Data', 'Random'];
  double containerHeight;
  bool expanded = false;

  @override
  Widget build(BuildContext context) {
    containerHeight = expanded
        ? MediaQuery.of(context).size.height * 0.20
        : MediaQuery.of(context).size.height * 0.30;
    return Scaffold(
      appBar: AppBar(
        title: Text('Test App'),
      ),
      body: ListView.builder(
        itemCount: dataList.length,
        itemBuilder: (context, index) {
          return AnimatedContainer(
            curve: Curves.easeOut,
            duration: Duration(milliseconds: 400),
            color: Colors.red,
            height: containerHeight,
            margin: EdgeInsets.all(8),
            child: Center(
              child: Text(
                dataList.elementAt(index),
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(onPressed: () {
        setState(() {
          expanded = !expanded;
        });
      }),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

输出

在此处输入图片说明

编辑

如果您只想折叠您正在点击的元素,最好创建一个可以保存容器当前状态的类。

class DataModel {
  String title;
  bool expanded;

  DataModel(this.title) {
    expanded = false;
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里,扩展将跟踪容器是大还是小。

现在稍微重构一下之前的代码

class _HomePageState extends State<HomePage> {


  // Initialize DATA MODEL list with some random values.
  List<DataModel> dataList = ['Andrew', 'Test', 'Data', 'Random']
      .map<DataModel>((s) => DataModel(s))
      .toList();

  double containerHeight;

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text('Test App'),
      ),
      body: ListView.builder(
        itemCount: dataList.length,
        itemBuilder: (context, index) {

          DataModel item = dataList.elementAt(index);

          // Check if the item is expanded or not and set size accordingly
          containerHeight = item.expanded
              ? MediaQuery.of(context).size.height * 0.20
              : MediaQuery.of(context).size.height * 0.30;

          return GestureDetector(
            onTap: (){
              // On tap reverse the expanded state of the data which will resize
              // the widget as setState is being called
              setState(() {
                item.expanded = !item.expanded;
              });
            },
            child: AnimatedContainer(
              curve: Curves.easeOut,
              duration: Duration(milliseconds: 400),
              color: Colors.red,
              height: containerHeight,
              margin: EdgeInsets.all(8),
              child: Center(
                child: Text(
                  dataList.elementAt(index).title,
                  style: TextStyle(
                    color: Colors.white,
                  ),
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答,正是我想要的。顺便说一句 - 这不是我的问题的一部分,但是如果我用 GestureDetector 包装我的容器并且我希望动画只会影响点击的容器,我在哪里传递索引? (2认同)