首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单击另一张卡时如何关闭ExpansionTileCard

单击另一张卡时如何关闭ExpansionTileCard
EN

Stack Overflow用户
提问于 2022-07-20 11:41:09
回答 1查看 112关注 0票数 0

我有ListView和ExpansionTileCard。所有内容都正常显示,但是有一个问题,当我单击ExpansionTileCard小部件时,会打开其他信息,而当我单击另一张卡时,前面的卡片不会关闭。我想打一些卡,以便只有它是开放的。这是我的代码:

代码语言:javascript
运行
复制
  Widget _buildList(OrdersEntity ordersEntity) {
    return ListView.separated(
      itemCount: ordersEntity.length,
      itemBuilder: (BuildContext context, int position) {
        return _withButton(ordersEntity, position);
      },
      separatorBuilder: (BuildContext context, int index) {
        return const Divider(
          height: 0,
        );
      },
    );
  }

  Widget _withButton(OrdersEntity ordersEntity, int position) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: [
        _getRow(
            name: ordersEntity.itemAtPositionName(position),
            date: ordersEntity.itemAtPositionDate(position),
            status: ordersEntity.itemAtPositionStatus(position),
            id: ordersEntity.idAtPosition(position),
            cost: ordersEntity.itemAtPositionCost(position),
            warranty: ordersEntity.itemAtPositionWarranty(position),
            master: ordersEntity.itemAtPositionMasterName(position),
            bonus: '122',
            onTap: (regionId) {
            }),
      ],
    );
  }

  Widget _getRow({
    required String name,
    required String date,
    required String status,
    required String cost,
    required String warranty,
    required String master,
    required String bonus,
    required String id,
    required ValueChanged<String> onTap,
  }) {
    return Material(
      color: Colorz.white,
      child: InkWell(

        splashColor: Colorz.selectedListItemBG2,
        child: BlocBuilder<OrderHistoryBloc, OrderHistoryState>(
            buildWhen: (previous, current) =>
            current is OrdersRemoveItemState,
            builder: (context, state) {
              bool progress;
              if (state is OrdersRemoveItemState && id == state.nameId) {
                progress = state.isProgress;
              } else {
                progress = false;
              }
              return Stack(
                children: [
                  progress
                      ? Center(
                    child: Container(
                        color: Colorz.transparent30,
                        child: const PlatformProgressIndicator()),
                  )
                      : const EmptyWidget(),
                  _listItemColumn(
                      name: name,
                      date: date,
                      status: status,
                      cost: cost,
                      warranty: warranty,
                      bonus: bonus,
                      master: master,
                      id: id
                  )
                ],
              );
            }),
        onTap: () {},
      ),
    );
  }

  _listItemColumn({
    required String name,
    required String date,
    required String status,
    required String master,
    required String bonus,
    required String cost,
    required String warranty,
    required String id,
  }) {

    return Column(children: [
      Padding(
          padding: EdgeInsets.all(10),
          child: Container(
            padding: EdgeInsets.only(top: 5), //control green
            decoration: BoxDecoration(
              color: _colorStatus(status),
              borderRadius: const BorderRadius.only(
                topLeft: Radius.circular(24),
                topRight: Radius.circular(24),
              ),
            ),
            child: Container(
              decoration: const BoxDecoration(
                color: Colors.white,
                borderRadius:BorderRadius.only(
                  topLeft: Radius.circular(24),
                  topRight: Radius.circular(24),
                ),
              ),

              child: ExpansionTileCard(
               initiallyExpanded: false,
                title: Text(name),
                subtitle: Text(date),
                trailing: Wrap(
                  spacing: 12, // space between two icons
                  children: <Widget>[
                    Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      crossAxisAlignment: CrossAxisAlignment.end,
                      children: [
                        Material(
                          color: Colorz.transparents,
                          child: InkWrapper(
                            splashColor: Colorz.lighterGray,
                            child: IconButton(
                                alignment: Alignment.center,
                                icon: SvgPicture.asset(
                                  Img.listItemMenu,
                                ),
                                onPressed: null
                            ),
                            onTap: () {
                            },
                          ),
                        ),
                        Text(
                          status,
                          textAlign: TextAlign.left,
                          maxLines: 1,
                          style: TextStyle(
                            color: _colorStatus(status),
                            overflow: TextOverflow.ellipsis,
                            fontSize: FontSize.tiny,
                          ),
                        ),
                      ],
                    )
                  ],
                ),
                children: [
                  _buildTextLine(
                    Titles.orderMaster,
                    null,
                    master,
                  ),
                  Container(
                    height: Margins.tiny,
                  )

                ],
              ),
            ),
          )
      ),
    ]
    );

  }
}

EN

回答 1

Stack Overflow用户

发布于 2022-07-20 12:09:14

我认为在这种情况下最好使用ExpansionPanelList。保持状态的int。

代码语言:javascript
运行
复制
 int? _selectedIndex;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: ExpansionPanelList(
          expansionCallback: (i, b) {
          if (_selectedIndex == i)
            _selectedIndex = null;
          else
            _selectedIndex = i;
          setState(() {});
          },
          children: List.generate(
            23,
            (index) => ExpansionPanel(
              canTapOnHeader: true,
              isExpanded: index == _selectedIndex,
              headerBuilder: (context, isExpanded) {
                return Text("header $index");
              },
              body: Column(
                children: [
                  Text("body $index"),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73050987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档