events - 在ListView中垂直方向拖动GestureDetector时,无法触发GestureDetector onPanUpdate事件

标签 events flutter dart

在ListView中垂直拖动GestureDetector时,无法触发GestureDetector的onPanUpdate事件。

I made a gif .

GestureDetector onPanUpdate 事件只能通过水平方向拖动来触发。

我知道Flutter有GestureArenaManager,但是如何让GestureDetector在竞技场中获胜?

我想在拖动GestureDetector时,可以

代码是这样的。

import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
      title: 'hi',
      home: DemoWidget(),
    ));

class DemoWidget extends StatelessWidget {
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('GestureDetector in ListView')),
      body: ListView(children: <Widget>[
        Card(
          child: Container(
            height: 500,
            child: Stack(
              children: <Widget>[
                Drag(),
              ],
            ),
          ),
        ),
        Card(
          child: Container(
            height: 1000,
          ),
        ),
      ]),
    );
  }
}

class Drag extends StatefulWidget {
  @override
  DragState createState() => DragState();
}

class DragState extends State<Drag> {
  double x = 0, y = 0;

  @override
  Widget build(BuildContext context) {
    return Positioned(
      left: x,
      top: y,
      child: GestureDetector(
        behavior: HitTestBehavior.opaque,
        dragStartBehavior: DragStartBehavior.down,
        child: Container(
          width: 100,
          height: 100,
          color: Colors.lightBlue,
          child: Icon(
            Icons.games,
            color: Colors.white,
            size: 30,
          ),
        ),
        onPanUpdate: (details) {
          x += details.delta.dx;
          y += details.delta.dy;
          setState(() {});
        },
      ),
    );
  }
}

最佳答案

看看这个:Receive “onVerticalDragUpdate” on nested “GestureDetectors” in Flutter

在您的情况下,您还可以进行水平拖动,因此您可以执行以下操作:

class DragState extends State<Drag> {
  double x = 0, y = 0;

  @override
  Widget build(BuildContext context) {
    return Positioned(
      left: x,
      top: y,
      child: RawGestureDetector(
        gestures: {
          AllowMultipleHorizontalDragGestureRecognizer:
          GestureRecognizerFactoryWithHandlers<
              AllowMultipleHorizontalDragGestureRecognizer>(
                () => AllowMultipleHorizontalDragGestureRecognizer(),
                (AllowMultipleHorizontalDragGestureRecognizer instance) {
              instance
                ..onUpdate = (details) {
                  x += details.delta.dx;
                  setState(() {});
                };
            },
          )
        },
        child: RawGestureDetector(
          gestures: {
            AllowMultipleVerticalDragGestureRecognizer:
            GestureRecognizerFactoryWithHandlers<
                AllowMultipleVerticalDragGestureRecognizer>(
                  () => AllowMultipleVerticalDragGestureRecognizer(),
                  (AllowMultipleVerticalDragGestureRecognizer instance) {
                instance
                  ..onUpdate = (details) {
                    y += details.delta.dy;
                    setState(() {});
                  };
              },
            )
          },
          child: Container(
            width: 100,
            height: 100,
            color: Colors.lightBlue,
            child: Icon(
              Icons.games,
              color: Colors.white,
              size: 30,
            ),
          ),
        ),
      ),
    );
  }
}

class AllowMultipleVerticalDragGestureRecognizer extends VerticalDragGestureRecognizer {
  @override
  void rejectGesture(int pointer) {
    acceptGesture(pointer);
  }
}

class AllowMultipleHorizontalDragGestureRecognizer extends HorizontalDragGestureRecognizer {
  @override
  void rejectGesture(int pointer) {
    acceptGesture(pointer);
  }
}

关于events - 在ListView中垂直方向拖动GestureDetector时,无法触发GestureDetector onPanUpdate事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58464952/

相关文章:

c# - 如何在目标线程上运行事件处理程序

javascript - 哪个规范定义了就绪事件?

android-studio - 在 Android Studio 中为 Dart 启用 Rainbow Brackets

javascript - 为什么这个 event.target.previousElementSibling 不起作用?

c# - 如何处理显式接口(interface)事件?

java - 当我运行 Flutter 项目时,我的 Ubuntu 系统出现此错误

android - Flutter async/await 在 forEach 中不起作用

flutter - 如何下载pdf到移动设备flutter

dart - 如何在 Dart 中获取选定的文本或内部 html

listview - 如何将索引从 Listview.builder 传递到项目小部件?