我在屏幕上显示了一个“可关闭”对话框。当它显示时,它会使背景变得模糊,并且向下拖动越远,背景就会变得模糊。这个示例有效,但我的问题是,在 Listener
小部件中,其方法 onPointerMove、onPointerDown、onPointerSignal
仅对用户输入使用react,当我向下拖动一点以关闭它时,我 Handlebars 指从它上面移开,模糊背景到无模糊的转变太突然了。仅当我将模态一直向下拖动时,它才能顺利工作,但是当我将手指从模态上移开时,它只会跟踪我在屏幕上握住手指的最后位置,然后在对话框完全关闭时消除背景模糊.
我这样做是因为我想跟踪模态向下拖动的程度,以便我可以获取百分比并调整 ImageFilter.blur
的值。
我一直在想将key
给予MyDialogModal
中的某个小部件并获取其位置,但问题是我只能在保留我的触发onPointerMove
时将手指放在屏幕上,否则不起作用。
有没有办法添加一些监听器,该监听器将始终监听我的模态并始终返回其位置,以便相应地调整模糊背景?或者也许有人可以建议一个更好的方法来解决这个问题?
@override
Widget build(BuildContext context) {
return Positioned.fill(
child: Container(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 15 * _percentageHeight, sigmaY: 15 * _percentageHeight),
child: Align(
alignment: Alignment.bottomCenter,
child: Listener(
onPointerMove: (PointerMoveEvent event) {
double percentage = 1 - (_initialPosY! - event.position.dy).abs() / _keyMyDialog.currentContext!.size!.height;
setState(() => _percentageHeight = percentage);
},
onPointerDown: (PointerDownEvent event) {
_initialPosY = event.position.dy;
},
onPointerSignal: (PointerSignalEvent event) {},
child: Dismissible(
key: const Key('my-dialog'),
direction: DismissDirection.down,
onDismissed: () {
Navigator.of(context).pop();
},
child: MyDialogModal();
),
),
),
),
),
);
}
最佳答案
当用户停止向下拖动 Dismissible
并且 _percentageHeight
不为 0 时,您可以使用 onPointerUp
,这意味着 Dismissible
尚未完全关闭。
您可以使用Tween从 _percentageHeight
变为 1,以使用自定义持续时间
恢复 100% 的模糊。
在onPointerUp
中,您应该调用_yourTween.animate(_animationController)
,然后监听
其值的变化,调用setState
每次直到它停在 1。
关于向下拉动越远,可关闭小部件的 flutter 就越会减少其背景模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68900159/