将 Button 更改为 GestureDetector 后 OnTap 功能不起作用

OnTap Function doesn't work after changing Button to GestureDetector

我尝试修改我的代码,使我的按钮在有状态小部件中使用 GestureDetector 装饰,而不是在无状态小部件中使用简单的 ElevatedButton。 点击按钮后,应调用参数中的 onPressed 函数。但是在修改我的代码之后,onPressed 函数无法正常工作,就像没有任何事情发生而装饰正在工作。 OnTap 函数似乎被触发了,所以它很奇怪。

之前(工作):

style: ElevatedButton.styleFrom(padding: EdgeInsets.all(20)),
onPressed: onPressed,
child: Text(
  text,
  style: TextStyle(fontSize: 20),
));

之后(不工作):

class ButtonWidget extends StatefulWidget {
  final String text;
  final VoidCallback onPressed;

  const ButtonWidget({Key? key, required this.text, required this.onPressed})
      : super(key: key);

  @override
  State<ButtonWidget> createState() => _ButtonWidgetState();
}

class _ButtonWidgetState extends State<ButtonWidget> {
  bool _isElevated = false;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        setState(() {
          _isElevated = !_isElevated; // This works
          widget.onPressed; // This Not work
        });
      },
      child: AnimatedContainer(
        duration: const Duration(milliseconds: 150),
        width: 150,
        height: 60,
        decoration: BoxDecoration(
            color: Colors.grey[300],
            borderRadius: BorderRadius.circular(50),
            boxShadow: _isElevated
                ? [
                    BoxShadow(
                      color: Colors.grey[500]!,
                      offset: const Offset(4, 4),
                      blurRadius: 15,
                      spreadRadius: 1,
                    ),
                    const BoxShadow(
                      color: Colors.white,
                      offset: Offset(4, 4),
                      blurRadius: 15,
                      spreadRadius: 1,
                    )
                  ]
                : null),
        child: Center(child: Text(widget.text)),
      ),
    );

你应该像这样执行 onPressed 回调:

...
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        setState(() {
          _isElevated = !_isElevated;

          widget.onPressed?.call(); // or widget.onPressed();
        });
      },
...