Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在点击时设置调整ListView项目大小的动画_Flutter_Dart - Fatal编程技术网

Flutter 在点击时设置调整ListView项目大小的动画

Flutter 在点击时设置调整ListView项目大小的动画,flutter,dart,Flutter,Dart,我在ListView项中有一个多行文本()。 默认情况下,我只想显示一行。当用户点击此项时,我希望它显示所有行。我通过将文本小部件的maxLines属性动态设置为1或null来实现这一点。 这很好,但是调整大小会立即发生,但是我想设置这个转换的动画 下面是一些示例代码: class ListPage extends StatelessWidget { const ListPage({Key key}) : super(key: key); @override Widget build

我在ListView项中有一个多行文本()。 默认情况下,我只想显示一行。当用户点击此项时,我希望它显示所有行。我通过将文本小部件的maxLines属性动态设置为1或null来实现这一点。 这很好,但是调整大小会立即发生,但是我想设置这个转换的动画

下面是一些示例代码:

class ListPage extends StatelessWidget {
  const ListPage({Key key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('List Example'),
      ),
      body: ListView.separated(
        itemBuilder: (context, index) {
          return ListItem();
        },
        itemCount: 3,
        separatorBuilder: (_, int index) => Divider(),
      ),
    );
  }
}

class ListItem extends StatefulWidget {
  ListItem({Key key}) : super(key: key);

  @override
  _ListItemState createState() => _ListItemState();
}

class _ListItemState extends State<ListItem> {
  bool _expanded;

  @override
  void initState() {
    _expanded = false;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        setState(() {
          _expanded = !_expanded;
        });
      },
      child: Text(
        'Line1\nLine2\nLine3',
        maxLines: _expanded ? null : 1,
        softWrap: true,
        style: const TextStyle(fontSize: 22),
      ),
    );    
  }
}
class ListPage扩展了无状态小部件{
const ListPage({Key}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“列表示例”),
),
正文:ListView.com(
itemBuilder:(上下文,索引){
返回ListItem();
},
物品计数:3,
separatorBuilder:(z,int index)=>Divider(),
),
);
}
}
类ListItem扩展StatefulWidget{
ListItem({Key}):超级(Key:Key);
@凌驾
_ListItemState createState()=>\u ListItemState();
}
类_ListItemState扩展状态{
布尔乌扩张;
@凌驾
void initState(){
_扩展=假;
super.initState();
}
@凌驾
小部件构建(构建上下文){
回墨槽(
onTap:(){
设置状态(){
_扩展=!\u扩展;
});
},
子:文本(
“Line1\nLine2\nLine3”,
maxLines:_已展开?空值:1,
软包装:是的,
样式:常量文本样式(字体大小:22),
),
);    
}
}
我还尝试过使用动画切换器,如下所示:

class ListPage extends StatelessWidget {
  const ListPage({Key key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('List Example'),
      ),
      body: ListView.separated(
        itemBuilder: (context, index) {
          return ListItem();
        },
        itemCount: 3,
        separatorBuilder: (_, int index) => Divider(),
      ),
    );
  }
}

class ListItem extends StatefulWidget {
  ListItem({Key key}) : super(key: key);

  @override
  _ListItemState createState() => _ListItemState();
}

class _ListItemState extends State<ListItem> {
  bool _expanded;
  Widget _myAnimatedWidget;

  @override
  void initState() {
    _expanded = false;
    _myAnimatedWidget = ExpandableText(key: UniqueKey(), expanded: _expanded);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () {
        setState(() {
          _expanded = !_expanded;
          _myAnimatedWidget =
              ExpandableText(key: UniqueKey(), expanded: _expanded);
        });
      },
      child: AnimatedSwitcher(
        duration: Duration(milliseconds: 2000),
        child: _myAnimatedWidget,
      ),
    );
  }
}

class ExpandableText extends StatelessWidget {
  const ExpandableText({Key key, this.expanded}) : super(key: key);
  final expanded;

  @override
  Widget build(BuildContext context) {
    return Text(
      'Line1\nLine2\nLine3',
      maxLines: expanded ? null : 1,
      softWrap: true,
      style: const TextStyle(fontSize: 22),
    );
  }
}
class ListPage扩展了无状态小部件{
const ListPage({Key}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“列表示例”),
),
正文:ListView.com(
itemBuilder:(上下文,索引){
返回ListItem();
},
物品计数:3,
separatorBuilder:(z,int index)=>Divider(),
),
);
}
}
类ListItem扩展StatefulWidget{
ListItem({Key}):超级(Key:Key);
@凌驾
_ListItemState createState()=>\u ListItemState();
}
类_ListItemState扩展状态{
布尔乌扩张;
Widget _myAnimatedWidget;
@凌驾
void initState(){
_扩展=假;
_myAnimatedWidget=ExpandableText(键:UniqueKey(),展开:_展开);
super.initState();
}
@凌驾
小部件构建(构建上下文){
回墨槽(
onTap:(){
设置状态(){
_扩展=!\u扩展;
_myAnimatedWidget=
可展开文本(键:UniqueKey(),展开:_展开);
});
},
孩子:动画切换器(
持续时间:持续时间(毫秒:2000),
孩子:_myAnimatedWidget,
),
);
}
}
类ExpandableText扩展了无状态小部件{
const ExpandableText({Key-Key,this.expanded}):super(Key:Key);
最终扩大;
@凌驾
小部件构建(构建上下文){
返回文本(
“Line1\nLine2\nLine3”,
maxLines:扩展?空值:1,
软包装:是的,
样式:常量文本样式(字体大小:22),
);
}
}
这会设置文本小部件的动画,但ListView行仍会立即调整大小

我犯了什么错?对于我的问题,设置maxLines属性的方法可能是错误的吗

谢谢你的帮助


祝你今天愉快

多亏了乔的评论,我找到了正确的答案:


我只需要将我的小部件包装在AnimatedSize()小部件中。仅此而已:)

您是否尝试过用动画容器包围整个小部件,并用用户的相同点击改变其高度?@Joãosares非常感谢!你的回答使我走上了正确的轨道。使用AnimatedContainer,动画效果很好,但由于我有动态内容,所以我无法判断它应该是多大。但我刚刚找到了动画大小,这正是我需要的!非常感谢您的回答!我很高兴能帮上忙。祝你的应用程序好运!