Flutter 如何将颤振中的ontap事件委托给堆栈中的底部小部件?

Flutter 如何将颤振中的ontap事件委托给堆栈中的底部小部件?,flutter,flutter-layout,Flutter,Flutter Layout,若两个容器在堆栈中完全重叠,那个么当单击顶部的小部件时,我们如何检测底部的onTap事件 用例: 我的顶部容器是透明的。我使用这个透明容器点击来设置顶部小部件的动画,这个顶部小部件粘贴在sceen的底部。点击后,我想在这个位置设置相同底部元素的动画 另外,我实现了自定义手势,但我没有看到手势冲突。只有当元素的位置使一个元素为父元素,第二个元素为子元素时,才会检测到此竞技场冲突 import 'package:flutter/material.dart'; void main() { run

若两个容器在堆栈中完全重叠,那个么当单击顶部的小部件时,我们如何检测底部的onTap事件

用例:

我的顶部容器是透明的。我使用这个透明容器点击来设置顶部小部件的动画,这个顶部小部件粘贴在sceen的底部。点击后,我想在这个位置设置相同底部元素的动画

另外,我实现了自定义手势,但我没有看到手势冲突。只有当元素的位置使一个元素为父元素,第二个元素为子元素时,才会检测到此竞技场冲突

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Stack(children: <Widget>[
        GestureDetector(
          onTap: () {
            print('green clicked.');
          },
          child: Container(
            color: Colors.green,
            width: 400,
            height: 400,
          ),
        ),
        GestureDetector(
          onTap: () {
            print('red clicked.');
          },
          child: Container(
            color: Colors.red,
            width: 200,
            height: 200,
          ),
        ),
      ]),
    );
  }
}
在上面的示例中,当我单击红色容器时,它将打印红色,但绿色容器的某些部分也存在。我想知道这两个事件是否都可以调用


谢谢。

AFAIK,没有直接的方法知道用户是否点击了一个底层小部件。然而,我运行了您的红色和绿色容器代码,并通过onTapDown事件实现了它

不带onTapDown的最简单解决方案::

增加了以下功能:

void onGreenClick()
  {
    print("Green clicked");
  }
将Green的onTap处理程序更改为:

onTap: onGreenClick,
并在Red的onTap中添加了onGreenClick作为:

onTap: () {
            print('red clicked.');
            onGreenClick();
          },
但是,正如您所猜测的,只有当小部件完全重叠时,这才有效。在这种情况下,有一些区域存在红色的容器,但不是绿色的,那么上述区域将失败。要实现这一点,请按如下方式使用onTapDown:

将onTapDown处理程序添加到GestureDetector下的红色和绿色,如下所示:

onTapDown: (TapDownDetails details) => onTapDown(context, details),
其中,处理函数为:

void onTapDown(BuildContext context, TapDownDetails details) {
    print('${details.globalPosition}');
    final RenderBox box = context.findRenderObject();
    final Offset localOffset = box.globalToLocal(details.globalPosition);
    setState(() {
      posx = localOffset.dx;
      posy = localOffset.dy;
    });
    if (posx < 100.0 && posy < 100.0) onGreenClick();
  }
现在,如果你看到最后一行,我们称之为ongreen,只点击特定的x,y坐标

因此,最终结果是,即使单击红色,您也会在调试输出窗口中获得绿色单击


整个代码都是可用的

AFAIK,没有直接的方法可以知道是否有用户点击的底层小部件。然而,我运行了您的红色和绿色容器代码,并通过onTapDown事件实现了它

不带onTapDown的最简单解决方案::

增加了以下功能:

void onGreenClick()
  {
    print("Green clicked");
  }
将Green的onTap处理程序更改为:

onTap: onGreenClick,
并在Red的onTap中添加了onGreenClick作为:

onTap: () {
            print('red clicked.');
            onGreenClick();
          },
但是,正如您所猜测的,只有当小部件完全重叠时,这才有效。在这种情况下,有一些区域存在红色的容器,但不是绿色的,那么上述区域将失败。要实现这一点,请按如下方式使用onTapDown:

将onTapDown处理程序添加到GestureDetector下的红色和绿色,如下所示:

onTapDown: (TapDownDetails details) => onTapDown(context, details),
其中,处理函数为:

void onTapDown(BuildContext context, TapDownDetails details) {
    print('${details.globalPosition}');
    final RenderBox box = context.findRenderObject();
    final Offset localOffset = box.globalToLocal(details.globalPosition);
    setState(() {
      posx = localOffset.dx;
      posy = localOffset.dy;
    });
    if (posx < 100.0 && posy < 100.0) onGreenClick();
  }
现在,如果你看到最后一行,我们称之为ongreen,只点击特定的x,y坐标

因此,最终结果是,即使单击红色,您也会在调试输出窗口中获得绿色单击


整个代码都可用

请尝试更改顶部的hitTestBehaviorwidget@Pavel那是我做的第一件事。但并没有起作用。若你们想得到底部容器项目的压力,你们必须使上部容器的颜色为透明。有时这取决于,就像上面的容器包含文本,下面的容器包含一些图像一样,如果文本字体区域中有任何事件,则可以按下文本;除此之外,如果保持文本背景色透明,则可以按下下面的图像事件。@SanketVekariya我的顶部容器是透明的。我使用这个透明容器点击来设置顶部小部件的动画。此外,点击我想动画相同的底部元素。我还实现了自定义手势,但我没有看到手势竞技场冲突,因此无法了解发生了什么。我做了一些变通,但想知道这是否可能。你能给我们分享一个可运行代码的例子吗?要了解更多,我们可以帮助尝试更改top的hitTestBehaviorwidget@Pavel那是我做的第一件事。但并没有起作用。若你们想得到底部容器项目的压力,你们必须使上部容器的颜色为透明。有时这取决于,就像上面的容器包含文本,下面的容器包含一些图像一样,如果文本字体区域中有任何事件,则可以按下文本;除此之外,如果保持文本背景色透明,则可以按下下面的图像事件。@SanketVekariya我的顶部容器是透明的。我使用这个透明容器点击来设置顶部小部件的动画。此外,点击我想动画相同的底部元素。我还实现了自定义手势,但我没有看到手势竞技场冲突,因此无法了解发生了什么。我做了一些变通,但想知道这是否可能。你能给我们分享一个可运行代码的例子吗?为了了解更多,我们可以帮助我尝试这个解决方法。这里是录音的问题,我必须用录音做很多圈来弄清楚它是否只是录音或拖动,以及任何其他可以触发录音的事件。如果你长时间按下,它仍然是一个点击,等等…在我的应用程序中,绿色和红色容器有双胞胎,所以红色点击都需要设置动画。我还有其他的g
estures也喜欢长按、双击、轻扫,我也使用轻拍进行边缘点击等等。。。。。如果你知道任何简单的方法来实现这一切,这也会有很大的帮助。我想我明白了,除了-如果在红色的水龙头都需要动画,那么你不需要ONTAPTDOWN;你为什么不直接从上面提到的onRedClicked调用onGreenClicked“最简单的解决方案”?是的。这是目前的做法。我有一个共享类,其中所有事件都被重定向并发出调用。我只是想知道是否有其他方法可以做到这一点。我有很多小部件做类似的事情。从昨天开始我就考虑过了。在我看来,这种当前/已回答的方法更好。因为A。它很简单。B.灵活,但易于维护,更重要的是C.您将始终处于完全控制状态,D.未来证明,即如果明天需求发生变化,例如在所有情况下都不打电话,则很容易采用。。。。只要我的两分钱-我试过这个方法。这里是录音的问题,我必须用录音做很多圈来弄清楚它是否只是录音或拖动,以及任何其他可以触发录音的事件。如果你长时间按下,它仍然是一个点击,等等…在我的应用程序中,绿色和红色容器有双胞胎,所以红色点击都需要设置动画。此外,我还有其他手势,如长按、双击、轻扫,我还使用轻按进行边缘单击等等。。。。。如果你知道任何简单的方法来实现这一切,这也会有很大的帮助。我想我明白了,除了-如果在红色的水龙头都需要动画,那么你不需要ONTAPTDOWN;你为什么不直接从上面提到的onRedClicked调用onGreenClicked“最简单的解决方案”?是的。这是目前的做法。我有一个共享类,其中所有事件都被重定向并发出调用。我只是想知道是否有其他方法可以做到这一点。我有很多小部件做类似的事情。从昨天开始我就考虑过了。在我看来,这种当前/已回答的方法更好。因为A。它很简单。B.灵活,但易于维护,更重要的是C.您将始终处于完全控制状态,D.未来证明,即如果明天需求发生变化,例如在所有情况下都不打电话,则很容易采用。。。。只要我的两分钱-