颤振:在GridView的平铺中使用手势检测器点击延迟

颤振:在GridView的平铺中使用手势检测器点击延迟,gridview,dart,flutter,gesturedetector,Gridview,Dart,Flutter,Gesturedetector,通常,以下行为本质上是快速的。但是,在GridView(或者我假设的任何ScrollView(也尝试了ListView))中,性能似乎非常差。当我点击屏幕时,容器的不透明度会增加,但会延迟一段时间。知道我错过了什么吗 import "package:flutter/material.dart"; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build

通常,以下行为本质上是快速的。但是,在GridView(或者我假设的任何ScrollView(也尝试了ListView))中,性能似乎非常差。当我点击屏幕时,容器的不透明度会增加,但会延迟一段时间。知道我错过了什么吗

import "package:flutter/material.dart";
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
    Widget build(BuildContext context) {
      return MaterialApp(
        home: Scaffold(
          body: MyWidget()
        )
      );
    }
}
class MyWidgetState extends State<MyWidget> {
  double opacity = 0.2;
  @override
    Widget build(BuildContext context) {
      return GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 3
        ),
        itemBuilder: (context, index) {
          return GestureDetector(
            onTap: () {
              setState(() {
                opacity = 0.2;                
              });
            },
            onTapDown: (details) {
              setState(() {
                opacity = 1.0;                
              });
            },
            child: Container(
              color: Colors.red.withAlpha((255 * opacity).toInt())
            )
          );
        },
      );
    }
}
class MyWidget extends StatefulWidget {
  @override
    State<StatefulWidget> createState() {
      return MyWidgetState();
    }
}
导入“包装:颤振/材料.省道”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回材料PP( 家:脚手架( 正文:MyWidget() ) ); } } 类MyWidgetState扩展了状态{ 双不透明度=0.2; @凌驾 小部件构建(构建上下文){ 返回GridView.builder( gridDelegate:SliverGridDelegateWithFixedCrossAxisCount( 交叉轴计数:3 ), itemBuilder:(上下文,索引){ 返回手势检测器( onTap:(){ 设置状态(){ 不透明度=0.2; }); }, onTapDown:(详细信息){ 设置状态(){ 不透明度=1.0; }); }, 子:容器( 颜色:Colors.red.withAlpha((255*不透明度).toInt()) ) ); }, ); } } 类MyWidget扩展了StatefulWidget{ @凌驾 状态createState(){ 返回MyWidgetState(); } }
在您的情况下,
监听器
可能会更快

Listener(
      onPointerDown: (PointerDownEvent event) {
        setState(() {
          opacity = 1.0;
        });
      },
      onPointerUp: (PointerUpEvent event) {
        setState(() {
          opacity = 0.2;
        });
      },
      child: Container(
          color: Colors.red.withAlpha((255 * opacity).toInt())
      ),
    )

试过了,效果很好。谢谢你的快速回复!不客气。如果这是解决方案,您会标记答案吗?)实际上,在我的测试中,我仍然用一列替换了GridView。因此,现在我尝试了您的方法,虽然它缩短了延迟,但性能仍然比使用列稍差。知道为什么吗?我会记下你的答案。它确实提高了性能。您是否尝试了
GridView.count
而不是
GridView.builder
?它会改变延迟吗?如果你检查日志,你会发现所有的水龙头都能工作。但你们点击的速度真的很快——
onPointerUp
会将不透明度恢复到上一个级别,所以你们无法捕捉到变化的瞬间——它变得如此之快
GestureDecector
也可以工作,而
Listener
只需要稍微快一点。我认为构建
GridView.builder