在 Flutter 中以编程方式扩展 ExpansionTile

2024-03-16

我只是想用ExpansionTile在 Flutter 中,我将示例修改为如下所示:

我想隐藏箭头并使用Switch扩大瓷砖,可以吗?或者我是否需要以编程方式呈现子项的自定义小部件?基本上,我只需要显示/隐藏孩子们

这是我的代码:

import 'package:flutter/material.dart';

void main() {
  runApp(ExpansionTileSample());
}
class ExpansionTileSample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('ExpansionTile'),
        ),
        body: ListView.builder(
          itemBuilder: (BuildContext context, int index) =>
              EntryItem(data[index]),
          itemCount: data.length,
        ),
      ),
    );
  }
}

// One entry in the multilevel list displayed by this app.
class Entry {
  Entry(this.title,[this.question='',this.children = const <Entry>[]]);

  final String title;
  final String question;
  final List<Entry> children;
}

// The entire multilevel list displayed by this app.
final List<Entry> data = <Entry>[
  Entry(
    'Chapter A',
    '',
    <Entry>[
      Entry(
        'Section A0',
        '',
        <Entry>[
          Entry('Item A0.1'),
          Entry('Item A0.2'),
          Entry('Item A0.3'),
        ],
      ),
      Entry('Section A1','text'),
      Entry('Section A2'),
    ],
  ),
  Entry(
    'Chapter B',
    '',
    <Entry>[
      Entry('Section B0'),
      Entry('Section B1'),
    ],
  ),
  Entry(
    'Chapter C',
    '',
    <Entry>[
      Entry('Section C0'),
      Entry('Section C1')
    ],
  ),
];

// Displays one Entry. If the entry has children then it's displayed
// with an ExpansionTile.
class EntryItem extends StatelessWidget {
  const EntryItem(this.entry);

  final Entry entry;

  Widget _buildTiles(Entry root) {
    if (root.children.isEmpty) return  Container(
        child:Padding(
          padding: const EdgeInsets.symmetric(
            vertical: 8.0,
            horizontal: 32.0,
          ),
          child:Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children:[
                  Text(root.title),
                  Divider(height: 10.0,),
                  root.question=='text'?Container(
                      width: 100.0,
                      child:TextField(
                        decoration: const InputDecoration(helperText: "question")
                      ),
                  ):Divider()
              ]
          )
        )
    );
    return ExpansionTile(
      //key: PageStorageKey<Entry>(root),
      title: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children:[
          Text(root.title),
          Switch(
            value:false,
            onChanged: (_){},
          )
        ]
      ),
      children: root.children.map(_buildTiles).toList(),
    );
  }

  @override
  Widget build(BuildContext context) {
    return _buildTiles(entry);
  }
}

@diegovoper 的答案几乎没问题,一个没有涵盖的小问题是:它不会传播点击Switch进一步ExpansionTile,因此,如果您单击外部开关,它就会展开,同时单击Switch什么也没做。将其包裹起来IgnorePointer,并在展开事件时设置 switch 的值。这是一个有点倒退的逻辑,但效果很好。

...
        return ExpansionTile(
          onExpansionChanged: _onExpansionChanged,
          // IgnorePointeer propogates touch down to tile
          trailing: IgnorePointer(
            child: Switch(
                value: isExpanded,
                onChanged: (_) {},
             ),
          ),
          title: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
            Text(root.title),
          ]),
          children: root.children.map((entry) => EntryItem(entry)).toList(),
        );
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Flutter 中以编程方式扩展 ExpansionTile 的相关文章

随机推荐

  • 名称值对已弃用

    由于 Android 22 NameValuePair 已被弃用 The 文档 http developer android com reference org apache http message BasicNameValuePair
  • 监控所有使用网络的应用程序建立的连接的 IP 地址,无需 root Android 手机

    我正在尝试构建一个 Android 应用程序 无需 root 手机 该应用程序从所有应用程序与手机之间的网络连接收集 IP 地址 我负责这个项目 关键点是手机必须保持未root状态 这 据我所知 意味着我不能使用tcpdump或libpca
  • npm 5.4.1 安装/卸载全部失败

    我使用的是 Windows 10 我通过执行以下操作升级了我的 npmnpm i g npm 但是没有软件包正在安装或卸载 安装时它始终挂在安装后 如下所示 PS C Users Mercurius Documents GitHub cat
  • 如何在wpf画布控件中添加动态设计的用户控件时获取高度和宽度?

    您好 我正在开发一个 wpf 应用程序 我正在画布中添加 myUserControl 对象 我需要高度和添加的用户控制 现在的问题是用户控件是动态设计的 我正在创建网格并根据用户配置添加行和列 并且我在高度和宽度上给出自动 所以我在画布中添
  • 如何解决React redux中的数据加载问题

    我试图弄清楚当数据仍在加载时如何管理 显示此组件 我在这种情况下使用react redux 有什么解决这个问题的建议吗 虽然我用延迟加载来包装它 但在这种情况下似乎并没有那么有效 对此有何建议 动作 js export const getC
  • 如何从 Eclipse 中的接口导航到实现类? [复制]

    这个问题在这里已经有答案了 假设我有 interface Foo void doStuff class FooImpl implements Foo public void doStuff stuff 当我看见myFoo doStuff 在
  • 在带有数组的单个函数中多次调用“useVal” - 意外行为

    我打电话给我的useArr在单个函数调用中多次调用函数 每次致电useArr 我正在将新的价值推向现有的arr功能 我用一个令人震惊的每个电话pause功能 而不是渲染字符串abcde以逐步 间隔的方式 它只是覆盖前一个字母 我对引擎盖下的
  • Jenkins Github 插件 - 触发参数化构建

    我有一个 自由式项目 Jenkins 作业 它有一个参数 GIT BRANCH这样我就可以手动或通过 GitHub hook 触发它 问题是 GitHub 插件似乎无法正确识别 设置推送的分支 当我查看 Jenkins 构建上的 GitHu
  • 我可以编写一个 CSS 选择器来选择不具有特定类或属性的元素吗?

    我想编写一个 CSS 选择器规则来选择所有元素don t有一定的班级 例如 给定以下 HTML h1 class printable Example h1
  • React-Native:哪种自动化 CI 工具最好? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 React Native 社区 你们使用什么 CI 工具 我们的团队构建了一个react native ios应用程序 我们还有一个单独的测试团
  • 恢复发送至自部署合约的BNB

    我正在尝试创建 BOT 因此在 BSC 中从 eatamask 创建并部署了一个合约 我向该合约发送了一些 BNB 来检查 但没有成功 我怎样才能拿回BNB 感谢帮助 因为我对此很陌生 除非您在合约中具有允许您提取资金的自定义功能 否则它们
  • 如果 URL 是 https,Python urllib2 会给出“网络无法访问错误”

    我正在尝试使用 urllib2 库获取一些网址 a urllib2 urlopen http www google com ret a read 上面的代码工作正常 并给出了预期的结果 但是当我创建 url https 时 它会给出 网络无
  • 将文本插入活动迷你缓冲区

    我试图在运行外部命令后将文本插入到迷你缓冲区中 例如 call interactively eval expression insert blah 当然 问题是 eval expression 在用户输入之前不会返回 我的最终目标是添加一些
  • Xcode 6:项目导航器中没有 Frameworks 文件夹

    我正在使用 Xcode 6 并遵循 Xcode 版本 4 教程 因此这里和那里的情况有所不同 我的项目导航器中似乎没有 Frameworks 文件夹 因此当我下载一些 framework 文件并在项目编辑器的构建阶段手动添加它们时 我没有
  • HttpUtility.UrlEncoded URL 段的错误请求 400

    因此 如果我的应用程序 MVC url 中存在 url 编码段 则 IIS 会抛出 BAD REQUEST 400 e g http u lasoo com au Offer http u lasoo com au Offer 9289 7
  • json 从遗留属性名称反序列化

    如何设置 Newtonsoft Json 使用旧成员名称反序列化对象 但使用当前成员名称序列化它 编辑 要求是从正在序列化 反序列化的类中删除过时的成员 这是一个需要序列化和反序列化的示例对象 我给了一个属性一个属性 其中包含它过去可能已序
  • 将字典转换为方阵

    我想学习如何将字典转换为方阵 根据我所读到的内容 我可能需要将其转换为 numpy 数组 然后重新调整它的形状 我不想使用 reshape 因为我希望能够根据用户输入的信息来执行此操作 换句话说 我希望代码能够给出一个方阵 无论用户输入了多
  • 必须重新验证此请求的标头错误吗?

    我注意到 Chrome 缓存了一个视频文件 我用服务器上的另一个替换了它 chrome 继续从缓存中提供旧的 使用 JW flash 播放器 5 请求的标头如下所示 joe joe desktop wget O S spider http
  • 为什么这个 MySQL 查询的结果会相互相乘?

    SELECT user id SUM COALESCE point points 0 AS total points SUM CASE WHEN point date gt this month THEN point points ELSE
  • 在 Flutter 中以编程方式扩展 ExpansionTile

    我只是想用ExpansionTile在 Flutter 中 我将示例修改为如下所示 我想隐藏箭头并使用Switch扩大瓷砖 可以吗 或者我是否需要以编程方式呈现子项的自定义小部件 基本上 我只需要显示 隐藏孩子们 这是我的代码 import