FlatButton 翻译后 Flutter onPressed 不起作用

2023-12-27

我在使用时遇到了一些事件处理问题ScrollView and Transform。布局结构是这样的,ScrollView and Transform存在于里面Stack.

我想要ScrollView滚动到范围之外时滚动FlatButton in Container(Colors.cyan),事件可以渗透到ScrollView中。

Click FlatButton按一下即可工作。事实上,点击后FlatButton两次后,无论点击初始位置还是当前位置,它都不再移动。这FlatButton控件在尺寸范围内远离初始位置,不再检测到单击事件,但我不明白。代码如下:

class EventListener extends StatefulWidget {
  @override
  _EventListenerState createState() => _EventListenerState();
}

class _EventListenerState extends State<EventListener> {

  Offset offset = Offset(0, 0);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("EventListener"),
      ),
      body: Stack(
        children: <Widget>[
          SingleChildScrollView(
            child: Column(
              children: <Widget>[
                Container(
                  color: Colors.red,
                  height: 200,
                ),
                Container(
                  color: Colors.teal,
                  height: 300,
                ),
                Container(
                  color: Colors.orange,
                  height: 400,
                )
              ],
            ),
          ),
          Container(
            color: Colors.cyan,
            width: double.infinity,
            height: 400,
            alignment: Alignment.center,
            child: SizedBox(
              width: 100,
              height: 100,
              child: Transform.translate(
                offset: offset,
                child: FlatButton(
                  color: Colors.orange,
                  onPressed: () {
                    setState(() {
                      offset += Offset(50, 50);
                    });
                    print('click !');
                  },
                  child: Text("translate"),
                ),
              ),
            ),
          )
        ],
      ),
    );
  }
}

这是按钮和堆栈的一个已知困难,我建议任何有此类问题的人看看Github 上的讨论 https://github.com/flutter/flutter/issues/27587.

TL;DR:

翻译小部件时,您可以点击的区域由两部分组成:

  1. 父控件的区域
  2. 子项的区域(此处为 Flatbutton)

见下图:

通常的解决方案:

扩大父级的大小。

这给了我们这样的东西:

Container( 
  width: double.infinity,
  height: 400,
  child: Transform.translate(
    offset: offset,
    child: SizedBox(
      width: 100,
      height: 100,
      child: FlatButton(
        onPressed: () => print('tap button'),
        child: Text("translate"),
      ),
    ),
  ),
),

在这里您可以点击父容器中的任意位置。

为您提供解决方案

你实际上想要一些不同的东西:除了按钮之外的任何东西都是可点击的。为此,您需要:

  1. GestureDetector 是可点击区域的父级
  2. 带有 onPressed 方法但不执行任何操作的 FlatButton

如果我们只希望蓝色容器可点击,那么这里是最终代码:

import 'package:flutter/material.dart';

main() => runApp(MaterialApp(
  home: EventListener(),
));

class EventListener extends StatefulWidget {
  @override
  _EventListenerState createState() => _EventListenerState();
}

class _EventListenerState extends State<EventListener> {
  Offset offset = Offset(0, 0);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("EventListener"),
      ),
      body: Stack(
        children: <Widget>[
          SingleChildScrollView(
            child: Column(
              children: <Widget>[
                Container(
                  color: Colors.red,
                  height: 200,
                ),
                Container(
                  color: Colors.teal,
                  height: 300,
                ),
                Container(
                  color: Colors.orange,
                  height: 400,
                )
              ],
            ),
          ),
          GestureDetector(
            onTap: () {
              setState(() {
                offset += Offset(50, 50);
              });
            },
            child: Container(
              width: double.infinity,
              height: 400,
              color: Colors.cyan,
              alignment: Alignment.center,
              child: Transform.translate(
                offset: offset,
                child: SizedBox(
                  width: 100,
                  height: 100,
                  child: FlatButton(
                    color: Colors.orange,
                    onPressed: () {},
                    child: Text("translate"),
                  ),
                ),
              ),
            ),
          )
        ],
      ),
    );
  }
}

为什么这有效

如前所述,父级是青色容器,该容器中的任何区域都将使按钮可单击。

此外,在此容器顶部添加一个 GestureDetector 使我们能够捕获此容器内的任何点击。

最后,当您单击时,会发生以下情况:

  1. 在青色容器之外,什么也没有发生。
  2. Inside the cyan Container
    1. 在按钮外部,GestureController 捕获轻击并使按钮移动
    2. 在按钮内部,Button 捕获点击,不执行任何操作(空方法),并将此点击标记为已处理这导致它不会在树上冒泡因此 GestureController 什么也得不到,也什么也没有发生。

希望这可以帮助您和其他人理解所有这些工作的棘手方式。一旦你拥抱它,它就会变得很美丽;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FlatButton 翻译后 Flutter onPressed 不起作用 的相关文章

随机推荐

  • 如何使用python删除目录中所有pdf文件的密码?

    我的目录中有一些 pdf 文件 其中一些受密码保护 另一些则不受密码保护 我知道每个受密码保护的文件的密码 如何自动执行从每个 pdf 文件中删除密码的过程 我在想这样的事情 获取受密码保护的文件 尝试从我制作的单词列表中给出的密码 打印出
  • 异步模式 - 在从方法返回某些值之前等待事件

    免责声明 这段代码被简化 很多 以便于阅读 我知道它不符合正常的代码标准 我的问题可以在下面的代码中看到 基本上我有一个解析对象的调用者 我必须等到子组件完成 由事件发出信号 然后才能返回基于子组件上的某些值的值 问题是 对于这种情况 首选
  • 如何使用 FFMPEG 捕获浏览器的选项卡内容

    我正在开发一个项目 需要录制将在不同浏览器选项卡中播放的 HTML5 动画 所以我读了一点 显然可以使用 FFMPEG 来完成 也许使用 gdigrab 设备 https www ffmpeg org ffmpeg devices html
  • 将函数应用于任意长的参数列表

    我想创建一个函数 apply 它接受具有任意数量参数的函数以及整数列表 并返回函数的结果 其中列表中的每个整数都是按顺序排列的参数 我在想这样的事情 apply Int gt Int gt Int gt Int apply f x xs a
  • 使任务栏上的应用程序图标具有透明背景(UWA)

    我正在制作一个通用 Windows 应用程序 我希望任务栏上的应用程序图标具有透明背景 因此它不在彩色框中 很多微软自己的库存应用程序都是这样的 邮件 照片 Xbox 等 我知道它可以做到 因为我是偶然做到的 但我使用的图标太大 当我使用正
  • 使用 Terraform 的 Google Cloud 凭据

    这是一个新手问题 但我刚刚开始使用 Terraform Terragrunt 进行 GCP 配置 并且我发现获取 GCP 凭据的工作流程非常混乱 我以前只使用过 AWS 获取凭证并在 AWS CLI 中配置它们非常简单 基本上 Google
  • 将数据从 edittext 发送到 listview

    我创建了两个Activities MainActivity ListActivity 并在MainActivity 我有一个EditText和一个保存按钮 In ListActivity 我有一个ListView 我想保存写入的值 数据 字
  • 在 Sql Server 中存储 UInt32 的最佳方法

    我正在开发一个使用第三方组件的应用程序 该组件返回一个 UInt32 类型的值 我需要将此 UInt32 存储在 Sql Server 表中 我正在考虑只使用一个简单的 int 列并插入如下值 int value int cs int Ma
  • 阻止用户与底层视图的交互

    在我的应用程序中 我有一个覆盖视图 当发生某些处理和网络时会显示该视图 它只是一个半透明视图 UIView 的子类 上面有一个加载指示器 填充整个屏幕 我想阻止任何底层视图接收用户交互 例如 不应滚动底层表视图 不应按下按钮 我可以从叠加视
  • Zuul转发错误,负载均衡器没有可供客户端使用的服务器

    我正在尝试遵循本教程 Spring Boot 微服务与 Eureka 和 Zuul 代理与 Feign 客户端 https medium com iroshan du spring boot micro services with eure
  • css网格儿童比例过渡/动画

    我试图在点击 CSS 网格时缩放子元素的大小 但没有成功 问题是我实际上没有缩放它 我只是更改了列和行位置以填充所有网格 div width 100 height 140px display grid grid template colum
  • Kotlin Android:属性委托必须具有“getValue(DashViewModel, KProperty*>)”方法

    我正在尝试遵循 Kotlin 中 ViewModels 的官方 Android 指南 我直接复制粘贴最简单的官方示例 https developer android com topic libraries architecture view
  • SQLServerException:与主机的 TCP/IP 连接失败

    当我运行 Web 应用程序时 收到错误消息 与主机端口 1433 的 TCP IP 连接失败 错误 连接超时 验证连接属性 检查是否存在 SQL Server 实例正在主机上运行并接受 TCP IP 端口上的连接 并且没有防火墙阻止 TCP
  • 使 CSS 网格行高灵活

    我正在构建 CSS 网格布局 但不知怎的 我无法获得 自动 值来调整行高的大小 这些项目的最小高度保持为 1fr 即使它们的内容小到足以让它们收缩 这是一个解释问题的代码示例 您也可以在https codepen io 16kbit pen
  • Jenkins Slave - 如何添加或更新环境变量

    有没有人尝试过使用 Jenkins Rest API 或任何其他方式在 Jenkins 从配置中添加或更新环境变量 使用 Jenkins Swarm 插件 我创建了一个从站 它使用 JLNP 连接到 Jenkins 主站 但有环境变量 复选
  • CentOS 中尾部多个文件

    我想在 CentOS 中跟踪多个文件 并跟踪它们 我已经尝试过 tail f 文件1 文件2 文件3 但输出却很不友好 我也看过 multitail 但找不到 CentOS 版本 我还有什么其他选择 Multitail 可在 rpmforg
  • 使用方法后的 Java 结果不符合预期

    我有以下代码片段 class Phone String phoneNumber 123456789 void setNumber String phoneNumber phoneNumber 987654321 class TestPhon
  • 在我向 tabControl1 添加自定义背景色后,我的 tabControl1 将不会显示其 DrawImage

    我不太确定我哪里出了问题 但在我将自定义背景色添加到 tabControl1 之前 一切正常 我看到其他选项卡上的 X 和添加选项卡的 添加此代码源后 我添加的选项卡不在那里 但 按钮功能以及其他选项卡功能也让我认为 backColor 只
  • C#中使用DataContractJsonSerializer反序列化JSON对象

    我确信这个问题已经被问了一遍又一遍 但由于某种原因 我仍然无法让它发挥作用 我想反序列化包含单个成员的 JSON 对象 字符串数组 idTercero cod Tercero 这是我试图反序列化的类 DataContract public
  • FlatButton 翻译后 Flutter onPressed 不起作用

    我在使用时遇到了一些事件处理问题ScrollView and Transform 布局结构是这样的 ScrollView and Transform存在于里面Stack 我想要ScrollView滚动到范围之外时滚动FlatButton i