How to make Expandable card?

前端 未结 3 996
攒了一身酷
攒了一身酷 2021-01-04 20:50

I am new to flutter and I want to make a list of cards like this.

I tried to Understand the original Project but I am not able to figure out.

I just

相关标签:
3条回答
  • 2021-01-04 21:12

    If you don't want to use ExpansionTile then one of the easiest way of doing it is following

    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,
        );
      }
    }
    
    

    Use this widget and pass the collapsed child and expanded child and change the value of isExpanded on click of button or text.

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

    Now change the value of isExpanded on click of icon/text

    GestureDetector(
      child: Icon(
        widget.model.isExpanded
            ? EvaIcons.chevronDownOutline
            : EvaIcons.chevronUpOutline,
        color: Colors.grey,
        size: 20,
      ),
      onTap: () {
        setState(() {
          widget.model.isExpanded =
              !widget.model.isExpanded;
        });
      },
     ),
    )
    
    0 讨论(0)
  • 2021-01-04 21:24

    Here is an example of what I said in the comments on your question:

    It contains a Card with a Container which contains a height, the height is updated when the Card is tapped because of the InkWell's onTap event, the onTap calls the setState() function to update the widgets, with the new height of the Card.

       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,),
                      ),
                    ),
                  ],
                ),
              ),
            );
          }
    

    This isn't tested yet...

    0 讨论(0)
  • 2021-01-04 21:27

    try to add an ExpansionTile inside a Card, this will expand the Card when you expand the ExpansionTile

    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'),
          ],
        ),
      ),
    )
    
    0 讨论(0)
提交回复
热议问题