简体   繁体   English

Flutter 带有 CustomPaint 的 GestureDetector 不起作用

[英]Flutter GestureDetector with CustomPaint not working

I am trying to create some custom widgets using CustomPaint and GestureDetector.我正在尝试使用 CustomPaint 和 GestureDetector 创建一些自定义小部件。 However, I am unable to properly interact with the drawn shapes using the GestureDetector.但是,我无法使用 GestureDetector 正确地与绘制的形状进行交互。 I can detect onTap for only one shape if the container is screen width and height, or none at all.如果容器是屏幕宽度和高度,或者根本没有,我只能检测一种形状的 onTap。

Please note that I have tried all HitTestBehavior types.请注意,我已经尝试了所有HitTestBehavior类型。

Here is the code whilst it's not detecting anything onTap:这是代码,但它没有检测到任何 onTap:

class CanvasObject {
  Color color = Colors.green[800];
  double strokeWidth = 10.0;
  PaintingStyle style = PaintingStyle.stroke;
}

class CanvasNodeObject extends CanvasObject {
  double x;
  double y;
  double radius = 20;
  PaintingStyle style = PaintingStyle.fill;
  CanvasNodeObject({@required this.x, @required this.y});
}
class CanvasNodePainter extends CustomPainter {
  CanvasNodeObject node;
  CanvasNodePainter({this.node});

  @override
  void paint(Canvas canvas, Size size) {
    Path path;
    Paint nodePaint = Paint()
      ..color = node.color
      ..style = node.style;

    path = Path();
    path.moveTo(0, 0);
    path.addOval(
        Rect.fromCircle(center: Offset(0, 0), radius: node.radius));
    canvas.drawPath(path, nodePaint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

class TestLineDrawing extends StatefulWidget {
  CanvasNodeObject startNode;
  CanvasNodeObject endNode;
  CanvasLineObject line;
  TestLineDrawing({List<double> x, List<double> y})
      : assert(x.length == 2),
        assert(y.length == 2) {
    startNode = CanvasNodeObject(x: x[0], y: y[0]);
    endNode = CanvasNodeObject(x: x[1], y: y[1]);
    line = CanvasLineObject(x: x, y: y);
  }

  @override
  _TestLineDrawingState createState() => _TestLineDrawingState();
}

class _TestLineDrawingState extends State<TestLineDrawing> {
  List<Widget> line() {
    return [
      Positioned(
        top: widget.endNode.x,
        left: widget.endNode.y,
        child:
      GestureDetector(
        behavior: HitTestBehavior.opaque,
        child:
        Container(
          height: widget.endNode.radius,
            width: widget.endNode.radius,
            child: CustomPaint(painter: CanvasNodePainter(node: widget.endNode))),
        onTap: () {
          setState(() {
            Random random = Random();
            widget.endNode.color = Color.fromARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));
            debugPrint("EndNodeOnPress " + widget.endNode.color.toString());
          });
        },
      )),
    ];
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Stack(
      children: line(),
    ));
  }

On screen it is:在屏幕上是: 在此处输入图像描述

I resolved this issue by doing the following:我通过执行以下操作解决了这个问题:

  1. Adding all paths to a top level path called path using Path::addPath使用Path::addPath将所有路径添加到名为path的顶级路径
  2. Overriding hitTest and using Path::contains覆盖hitTest并使用Path::contains
  @override
  bool hitTest(Offset position) {
    bool hit = path.contains(position);
    return hit;
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM