Flutter - 如何用动画扩展小部件?

Posted

技术标签:

【中文标题】Flutter - 如何用动画扩展小部件?【英文标题】:Flutter - How to expand a widget with animation? 【发布时间】:2021-08-18 03:32:19 【问题描述】:

所以我有以下代码

Row(
  children: [
    IconButton(), // IconButton1
    Expanded(
      child: Container(
        child: Textfield(),
      ),
    ),
    IconButton(), // IconButton2
  ]
)

当我在文本字段中输入内容时,我希望删除 IconButton1,并且文本字段容器或文本字段本身通过动画展开以占用该 IconButton1 的空间。我可以做到这一点,但我不能用动画做到这一点。

我尝试了 AnimatedContainer 和 AnimatedSwitcher,但它们没有按预期工作。

【问题讨论】:

【参考方案1】:

如果它是一个简单的容器,你应该使用 AnimatedContainer。 否则你应该使用scale transition。

import 'package:flutter/material.dart';

class TestScreen extends StatefulWidget 
  @override
  _TestScreenState createState() => _TestScreenState();


class _TestScreenState extends State<TestScreen> 
  final items = List<int>.generate(20, (i) => i + 1);

  @override
  Widget build(BuildContext context) 
    final title = 'Dismissing Items';

    return MaterialApp(
      title: title,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: ListView.builder(
          itemCount: items.length,
          itemBuilder: (context, index) 
            final item = items[index];
            return Dismissible(
              key: Key(item.toString()),
              onDismissed: (direction) 
                setState(() 
                  items.removeAt(index);
                );

                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                    content: Text('$item dismissed'),
                  ),
                );
              ,
              background: Container(color: Colors.yellow),
              child: AnimatedContainer(
                height: 1200 / items.length,
                width: MediaQuery.of(context).size.width,
                duration: Duration(milliseconds: 300),
                child: Text('$item'),
                color: (items[index] % 2 == 0) ? Colors.green : Colors.red,
              ),
            );
          ,
        ),
      ),
    );
  

【讨论】:

问题是Containerwidth没有在Container里面定义。 Container 被放入 Expanded 小部件中,以便它采用它可以的宽度。现在的事情是,当我删除行中的一个组件时,“扩展”会扩展容器。这是我想要某种动画的地方,因为到目前为止,它只是在没有任何预期的动画的情况下扩展。 检查代码,我已经用代码 sn-p 编辑了我的答案。 谢谢,但这不是我要找的。如果您阅读我的问题,您会看到我想要 2 个 IconButtons、一个文本字段、另外 1 个 IconButton,这 4 个元素连续。当我在文本字段中输入内容时,前 2 个 IconButtons 应该消失,并且文本字段应该水平扩展以占用被删除的那些 2 IconButtons 的空间。您还可以查看我提供的代码,以便您了解我要构建的 Widget 树。

以上是关于Flutter - 如何用动画扩展小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何为可扩展的 Flutter 小部件设置动画以将其滑出屏幕

Flutter - 我可以用 Hero 包装每个小部件来为它们设置动画吗

Flutter:一次多次使用相同的动画小部件

Flutter:同时进行英雄过渡 + 小部件动画?

Flutter-当内容更改时淡入淡出动画文本小部件

Flutter:在从小部件树中删除时或在其生命周期结束时为小部件设置动画?