【问题标题】:onTapDown and other callbacks from GestureDetector() are delayed来自 GestureDetector() 的 onTapDown 和其他回调被延迟
【发布时间】:2023-03-26 13:42:01
【问题描述】:

我目前正在使用GestureDetector() 创建一个带有AnimatedContainer() 的自定义按钮。

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

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

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

但是你有什么想法我可以在用户按下这个容器后显示一个漂亮的缩放动画吗?

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

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

这是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),
                      ),
                    ),
                  ],
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

谢谢!

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    不确定你是否解决了这个问题,但我在 S.O. 上发现了一个类似的问题。我认为同样的解决方案可能对你有用!

    尝试将 GestureDetector 切换为 Listener 并替换:

    onTapDown: (details) {
      setState(() {
        offset = -10;
      });
    },
    onTapUp: (details) {
      setState(() {
        offset = 0;
      });
    },
    

    与:

    onPointerDown: (PointerDownEvent event) {
      setState(() {
        offset = -10;
      });
    },
    onPointerUp: (PointerUpEvent event) {
      setState(() {
        offset = 0;
      });
    },
    

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

    【讨论】:

    • 我刚刚注意到,Listener 没有适用于触摸屏的“onPointerCancel”功能。所以,虽然它有助于提高动画的速度,但它引入了另一个问题......我会尝试进一步研究它。如果您找到了更好的解决方案,请告诉我!
    • 不完全正确@Tristan Bennett。您可以在这里简单地调用具有相同效果的 onPointerUp
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多