将 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();
});
},
...
我尝试修改我的代码,使我的按钮在有状态小部件中使用 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();
});
},
...