如何制作可扩展卡?

Posted

技术标签:

【中文标题】如何制作可扩展卡?【英文标题】:How to make Expandable card? 【发布时间】:2019-07-25 22:44:41 【问题描述】:

我是 Flutter 的新手,我想做一个这样的卡片列表。

我试图理解原来的Project,但我无法弄清楚。

我只是想做一张没有背景gif/视频效果的可扩展卡片

谢谢...

【问题讨论】:

您可以通过使用变量设置项目的高度然后使用 setState 更新它来做到这一点,这样当小部件被重建时高度已经改变。 你可以看看这个答案***.com/a/50533285/8954451 卡片背景的动画是怎么实现的? 【参考方案1】:

尝试在Card 中添加ExpansionTile,这将在您展开ExpansionTile 时展开Card

Card(
  child: Padding(
   padding: EdgeInsets.only(
      top: 36.0, left: 6.0, right: 6.0, bottom: 6.0),
      child: ExpansionTile(
      title: Text('Birth of Universe'),
        children: <Widget>[
         Text('Big Bang'),
         Text('Birth of the Sun'),
         Text('Earth is Born'),
      ],
    ),
  ),
)

【讨论】:

看起来不错,但是有什么方法可以关闭卡片,点击扩展后出现的额外区域。 我没明白你的意思? 我的意思是当卡片处于展开状态时,如果我们点击展开区域,有没有办法关闭卡片。【参考方案2】:

如果您不想使用ExpansionTile,那么最简单的方法之一就是关注

class ExpandableCardContainer extends StatefulWidget 
  final bool isExpanded;
  final Widget collapsedChild;
  final Widget expandedChild;

  const ExpandableCardContainer(
      Key key, this.isExpanded, this.collapsedChild, this.expandedChild)
      : super(key: key);

  @override
  _ExpandableCardContainerState createState() =>
      _ExpandableCardContainerState();


class _ExpandableCardContainerState extends State<ExpandableCardContainer> 
  @override
  Widget build(BuildContext context) 
    return new AnimatedContainer(
      duration: new Duration(milliseconds: 200),
      curve: Curves.easeInOut,
      child: widget.isExpanded ? widget.expandedChild : widget.collapsedChild,
    );
  


使用此小部件并传递折叠的子项和展开的子项,并在单击按钮或文本时更改 isExpanded 的值。

 ExpandableCardContainer(
      expandedChild: createExpandedColumn(context),
      collapsedChild: createCollapsedColumn(context),
      isExpanded: widget.model.isExpanded,
 )

现在在点击图标/文本时更改isExpanded 的值

GestureDetector(
  child: Icon(
    widget.model.isExpanded
        ? EvaIcons.chevronDownOutline
        : EvaIcons.chevronUpOutline,
    color: Colors.grey,
    size: 20,
  ),
  onTap: () 
    setState(() 
      widget.model.isExpanded =
          !widget.model.isExpanded;
    );
  ,
 ),
)

【讨论】:

我正在尝试将其用于项目,但在 widget.model.isExpanded 中出现错误,无法识别模型。有什么想法吗? model 只不过是在小部件类中定义的一个对象,它具有 isExpanded 布尔变量。【参考方案3】:

这是我在 cmets 中就您的问题所说的一个示例:

它包含一个Card和一个包含高度的Container,由于InkWell的onTap事件,点击卡片时高度会更新,onTap调用setState()函数来更新小部件,具有卡片的新高度。

   class MyApp extends StatefulWidget 
      double oldheight = 100.0;
      double newheight = 200.0;
      double height = 200.0;

      @override
      Widget build(BuildContext context) 
        final title = 'Basic List';

        return MaterialApp(
          title: title,
          home: Scaffold(
            appBar: AppBar(
              title: Text(title),
            ),
            body: ListView(
              children: <Widget>[
                InkWell(
                  onTap: () 
                    setState(() 
                      if (height == oldheight) 
                        height = newheight;
                      
                      else
                        height = oldheight;
                      
                    );
                  ,
                  child: Card(
                    child:Container(height: height,),
                  ),
                ),
              ],
            ),
          ),
        );
      

这还没有测试...

【讨论】:

我不知道为什么人们投反对票可能是因为你使用了 StatefulWidget 并且点击一张卡片也会影响其他卡片。 这无关紧要,因为投反对票将其标记为无用并且可能有用。

以上是关于如何制作可扩展卡?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作可扩展的导航栏

如何制作可扩展的 UITableView 标头?

如何制作可扩展的 Eloquent 模型?

如何在 ngFor 循环 [Angular] 中制作可扩展的表格行?

如何在可扩展的表格视图单元中制作动态集合视图

Angular 的可扩展卡