Flutter 手势检测器不';将ListView.builder与Transform一起使用时无法工作
我试图使用Transform将容器放置在屏幕中央,我希望GestureDetector对每个容器都起作用,但是,在这种情况下,当我单击其中一个容器时,它不起作用,就好像上面有什么东西不允许onTap起作用 当我的Matrix4看起来像这个手势检测器时:Flutter 手势检测器不';将ListView.builder与Transform一起使用时无法工作,flutter,Flutter,我试图使用Transform将容器放置在屏幕中央,我希望GestureDetector对每个容器都起作用,但是,在这种情况下,当我单击其中一个容器时,它不起作用,就好像上面有什么东西不允许onTap起作用 当我的Matrix4看起来像这个手势检测器时: Matrix4( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, )..rotateZ(_rotate[index].value), 但当我向Matrix4添加100时,它不起
Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
)..rotateZ(_rotate[index].value),
但当我向Matrix4添加100时,它不起作用:
Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 100, 0, 1,
)..rotateZ(_rotate[index].value),
完整代码:
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
class TransformPage extends StatefulWidget {
@override
_TransformState createState() => _TransformState();
}
class _TransformState extends State<TransformPage>
with TickerProviderStateMixin {
//Variables
AnimationController _animationController;
List<Color> _color = [Colors.red, Colors.blue, Colors.indigo, Colors.green];
List<Animation> _rotate = List<Animation>(4),
_sizeWidth = List<Animation>(4),
_sizeHeight = List<Animation>(4);
Animation _curve;
@override
void initState() {
super.initState();
_animationController =
AnimationController(vsync: this, duration: Duration(seconds: 2));
_curve = CurvedAnimation(parent: _animationController, curve: Curves.ease);
for (int i = 0; i < 4; i++) {
_sizeWidth[i] = Tween<double>(begin: 0, end: 120).animate(_curve);
_sizeHeight[i] = Tween<double>(begin: 0, end: 120).animate(_curve);
_rotate[i] = Tween<double>(begin: 0, end: 2.35).animate(_curve);
}
_animationController.addListener(() {
setState(() {});
});
_animationController.forward();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CupertinoNavigationBar(
middle: Text("Testing"),
backgroundColor: Colors.grey.shade200,
),
body: ListView.builder(
itemCount: 4,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
print(index);
},
behavior: HitTestBehavior.translucent,
child: Stack(
alignment: Alignment.center,
children: [
Transform(
transform:
Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 100, 0, 1,
)..rotateZ(_rotate[index].value),
child: Container(
width: _sizeWidth[index].value,
height: _sizeHeight[index].value,
color: _color[index],
),
alignment: Alignment.center,
),
],
),
);
},
),
);
}
}
导入“包装:颤振/材料.省道”;
进口“包装:颤振/cupertino.dart”;
类TransformPage扩展StatefulWidget{
@凌驾
_TransformState createState();
}
类_TransformState扩展了状态
使用TickerProviderStateMixin{
//变数
AnimationController _AnimationController;
列表颜色=[Colors.red,Colors.blue,Colors.indigo,Colors.green];
列表旋转=列表(4),
_sizeWidth=列表(4),
_尺寸高度=列表(4);
动画曲线;
@凌驾
void initState(){
super.initState();
_动画控制器=
AnimationController(vsync:this,duration:duration(秒数:2));
_曲线=曲线动画(父对象:_animationController,曲线:Curves.ease);
对于(int i=0;i<4;i++){
_sizeWidth[i]=Tween(开始:0,结束:120)。设置动画(_曲线);
_sizeHeight[i]=Tween(开始:0,结束:120)。设置动画(_曲线);
_旋转[i]=二者之间(开始:0,结束:2.35)。设置动画(_曲线);
}
_animationController.addListener((){
setState((){});
});
_animationController.forward();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:cupertinanaviationbar(
中间:文本(“测试”),
背景颜色:Colors.grey.shade200,
),
正文:ListView.builder(
物品计数:4,
itemBuilder:(上下文,索引){
返回手势检测器(
onTap:(){
打印(索引);
},
行为:HitTestBehavior.transparent,
子:堆栈(
对齐:对齐.center,
儿童:[
转化(
转换:
Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 100, 0, 1,
)..rotateZ(_rotate[index].value),
子:容器(
宽度:_sizeWidth[索引]。值,
高度:_sizeHeight[索引]。值,
颜色:_颜色[索引],
),
对齐:对齐.center,
),
],
),
);
},
),
);
}
}
我已经尝试过使用Positioned,但结果是一样的:(Transform小部件,有一种特殊的方式来处理他的
孩子
,它以您希望的方式更改其内容,但其引用仍然保留在主小部件上,我使用Transform.scale
时也有同样的情况
如果希望ListView
小部件远离上边缘,请使用Padding
小部件,
成功了,我将您的代码复制到我的项目中,并显示调试画图,结果如下:
使用此代码:
Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 100, 0, 1,
)..rotateZ(_rotate[index].value),
结果是:
关于该代码:
Matrix4(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
)..rotateZ(_rotate[index].value),
结果是:
使用填充
小部件的结果是:
注:<代码> OntAp<代码>,它实际上在中间方块中起作用。