onTapDown 和 GestureDetector() 的其他回调被延迟

Rob*_*ter 4 dart flutter

我目前正在使用 aGestureDetector()创建一个带有AnimatedContainer().

目标是在用户按下并释放按钮时获得某种动画比例、颜色、阴影或其他任何内容。

我现在的问题是回调onTapDown()有延迟。也许是因为这个按钮实际上是SliverList导致延迟的一个项目。但是,如果我点击 GestureDetector 而不滚动,则需要几百毫秒才能onTapDown触发回调。为什么?

我确实理解 flutter 和基本上任何其他 UI 框架都需要对列表中的对象进行某种延迟触摸。它必须确定用户想要滚动还是按下按钮。

但是您有什么想法如何在用户按下此容器后显示漂亮的比例动画吗?

这是SliverList包含RecipeMetaItem(然后对触摸输入做出反应)。

SliverList(
   delegate: SliverChildBuilderDelegate((BuildContext context, int index) {
          MetaItem metaItem = state.metaItems[index];
          return RecipeMetaItem(metaItem: metaItem, height: 178);
      },
      childCount: state.metaItems.length,
   ),
)
Run Code Online (Sandbox Code Playgroud)

这是RecipeMetaItem()


class RecipeMetaItem extends StatefulWidget {
  final double height;
  final MetaItem metaItem;

  const RecipeMetaItem({Key key, this.metaItem, this.height = 200}) : super(key: key);

  @override
  RecipeMetaItemState createState() {
    return new RecipeMetaItemState();
  }
}

class RecipeMetaItemState extends State<RecipeMetaItem> {
  double offset;


  @override
  void initState() {
    super.initState();
    offset = 0.0;
  }

  @override
  Widget build(BuildContext context) {

    return Padding(
      padding: const EdgeInsets.only(left: 10.0, right: 10.0, bottom: 20.0),
      child: GestureDetector(
        onTapDown: (details) {
          setState(() {
            offset = -10;
          });
        },
        onTapUp: (details) {
          setState(() {
            offset = 0;
          });
        },
        child: AnimatedContainer(
          duration: Duration(milliseconds: 60),
          curve: Curves.easeOut,
          transform: Matrix4.translationValues(0, offset, 0),
          child: Column(
            children: <Widget>[
              Container(
                height: widget.height,
                decoration: new BoxDecoration(
                  boxShadow: [
                    BoxShadow(
                      color: Colors.black.withAlpha(40),
                      blurRadius: 12.5,
                      spreadRadius: 0.0,
                    )
                  ],
                  borderRadius: BorderRadius.all(Radius.circular(10)),
                ),
                child: ClipRRect(
                  borderRadius: BorderRadius.all(Radius.circular(10)),
                  child: Stack(
                    children: [
                      CachedNetworkImage(
                        fit: BoxFit.cover,
                        imageUrl: widget.metaItem.imageUrl,
                        fadeInDuration: Duration(milliseconds: 50),
                        errorWidget: (context, url, error) => new Icon(Icons.error),
                      ),
                    ],
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.only(top: 8.0, left: 4.0, right: 4.0),
                child: Row(
                  children: <Widget>[
                    Expanded(
                      child: Text(
                        widget.metaItem.title,
                        textAlign: TextAlign.left,
                        style: TextStyle(fontWeight: FontWeight.w700, fontSize: 17.0),
                      ),
                    ),
                  ],
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

Run Code Online (Sandbox Code Playgroud)

谢谢!

Tri*_*ett 5

不确定你是否解决了这个问题,但我在这里发现了一个类似的问题,我认为相同的解决方案可能适合你!

尝试将 GestureDetector 切换为侦听器并替换:

onTapDown: (details) {
  setState(() {
    offset = -10;
  });
},
onTapUp: (details) {
  setState(() {
    offset = 0;
  });
},
Run Code Online (Sandbox Code Playgroud)

和:

onPointerDown: (PointerDownEvent event) {
  setState(() {
    offset = -10;
  });
},
onPointerUp: (PointerUpEvent event) {
  setState(() {
    offset = 0;
  });
},
Run Code Online (Sandbox Code Playgroud)

希望这能解决这个问题,在这种情况下,问题将是 GestureDetector,而不是子窗口小部件。