如何使 ExpansionTile 尾随图标旋转?

Posted

技术标签:

【中文标题】如何使 ExpansionTile 尾随图标旋转?【英文标题】:How to make an ExpansionTile trailing Icon spin? 【发布时间】:2021-12-09 07:03:12 【问题描述】:

我创建了一个扩展图块,并将原来的尾随图标更改为我自定义的 svg 图标。每当我单击扩展磁贴时...一切正常,但新的 svg 尾随图标不会像原来的尾随图标那样旋转。请问如何解决这个问题?

代码如下

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';

class ExpansionTileCard extends StatelessWidget 
  final String toptitle;
  final List<Widget> children;
  const ExpansionTileCard(Key key, this.toptitle, this.children)
      : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Container(
      child: new Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          new Container(
            decoration: new BoxDecoration(
                border:
                    new Border(bottom: new BorderSide(color: Colors.green))),
            child: new Row(
              children: [
                new Expanded(
                  flex: 9,
                  child: new Container(
                    child: new Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        ExpansionTile(
                          title: Text(
                            toptitle,
                            style: TextStyle(
                                color: Colors.black,
                                letterSpacing: -1,
                                fontSize: 19,
                                fontWeight: FontWeight.bold),
                          ),
                          children: children,
                          childrenPadding: EdgeInsets.fromLTRB(0, 0, 0, 20),
                          iconColor: Colors.green,
                          trailing: SvgPicture.asset(
                            'assets/icons/textmessage.svg',
                            height: 30,
                          ),
                        ),
                      ],
                    ),
                  ),
                )
              ],
            ),
          ),
        ],
      ),
    );
  


【问题讨论】:

能否包含会重现相同错误的 code-sn-p/resource? 我已经在我的原始帖子中添加了我的扩展文件类的代码。请查阅。笔记;代码功能齐全,svg 资源不会像原来的扩展磁贴图标那样旋转 【参考方案1】:

虽然我们没有在 ExpansionTile 上提供 trailing,但它使用它的默认行为。

我们将一个小部件传递给trailing,我们需要控制它。为此,我们需要检查ExpansionTile 是否扩展,onExpansionChanged 回调将提供此值。为了处理动画,我们可以使用许多小部件,如 TransformRotatedBoxAnimatedRotation... 在这个 ExpansionTileCard 小部件将扩展自 StatefulWidget

步骤

    转换为StatefulWidget 在状态类中创建一个布尔值来检查扩展状态。 bool _isExpanded = false; 更改onExpansionChanged 上的值
     onExpansionChanged: (value) 
                           setState(() 
                             _isExpanded = value;
                           );
                         ,

    通过包装动画小部件将您的小部件分配给trailing,或者只检查状态返回两个小部件

    _isExpanded? ExpandedWidget:NormalViewWidget()
       trailing: AnimatedRotation(  /// you can use different widget for animation
                         turns: _isExpanded ? .5 : 0,
                         duration: Duration(seconds: 1),
                         child: CustomWidget()// your svgImage here
                       ),
    
    
    
    
    

小部件状态


class _ExpansionTileCardState extends State<ExpansionTileCard> 
  bool _isExpanded = false;
  @override
  Widget build(BuildContext context) 
    return Container(
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Container(
            decoration: const BoxDecoration(
                border: Border(bottom: BorderSide(color: Colors.green))),
            child: Row(
              children: [
                Expanded(
                  flex: 9,
                  child: Container(
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        ExpansionTile(
                          onExpansionChanged: (value) 
                            setState(() 
                              _isExpanded = value;
                            );
                          ,
                          title: Text(
                            widget.toptitle,
                            style: TextStyle(
                                color: Colors.black,
                                letterSpacing: -1,
                                fontSize: 19,
                                fontWeight: FontWeight.bold),
                          ),
                          children: widget.children,
                          childrenPadding: EdgeInsets.fromLTRB(0, 0, 0, 20),
                          iconColor: Colors.green,
                          trailing: AnimatedRotation(
                            turns: _isExpanded ? .5 : 0,
                            duration: Duration(seconds: 1),
                            child:  SvgPicture.asset(
                           'assets/icons/textmessage.svg',
                            height: 30,
                          ),
                        ),
                      ],
                    ),
                  ),
                )
              ],
            ),
          ),
        ],
      ),
    );
  


【讨论】:

以上是关于如何使 ExpansionTile 尾随图标旋转?的主要内容,如果未能解决你的问题,请参考以下文章

如何使图像在悬停css上旋转

如何制作一个图标在一个圆圈中旋转的菜单?

Flutter之ExpansionTile组件

如何在设备旋转后重新计算约束

使 UIImageview 根据另一个 UIImageview 旋转而旋转

在 ListTile 中放置两个尾随图标