我目前正在使用 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)
谢谢!
不确定你是否解决了这个问题,但我在这里发现了一个类似的问题,我认为相同的解决方案可能适合你!
尝试将 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,而不是子窗口小部件。
| 归档时间: |
|
| 查看次数: |
2175 次 |
| 最近记录: |