我正在使用一个在小吃栏中显示提示的按钮。现在,如果我快速按下按钮(例如 50 次),小吃栏会出现几秒钟,然后再按一次,然后再按一次,直到显示 50 次。我怎样才能防止这种情况发生?
这是我的代码-
actions: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: RaisedButton(
elevation: 7,
color: Colors.black26,
child: Text('Button'),
onPressed: () {
_scaffoldKey.currentState
.showSnackBar(SnackBar(content: Text("Welcome")));
},
),
),
],
您可以使用 tap_debouncer 包来解决您的问题。只需使用冷却功能在有限的时间内禁用按钮按下,以防止多次点击。该软件包还提供了许多其他功能,可以用来解决您的问题。
解决这个问题有不同的方法。一是,您可以轻松地暂时防止多次点击。
bool _enabled = true;
onPressed: !_enabled
? null
: () {
setState(() => _enabled = false);
_scaffoldKey.currentState
.showSnackBar(SnackBar(content: Text("Welcome")));
// Enable it after 1s.
Timer(Duration(seconds: 1), () => setState(() => _enabled = true));
},
对于这种特殊情况,您可以使用本机 ScaffoldMessenger 方法
removeCurrentSnackBar()
。
您可以在调用
showSnackBar()
之前调用它来删除正在显示的任何 SnackBar,然后继续渲染新的 SnackBar。
在你的情况下,它看起来像这样:
onPressed: () {
ScaffoldMessenger.of(context).removeCurrentSnackBar();
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Welcome")));
},
请注意,
_scaffoldKey.currentState.showSnackBar()
已被弃用,因此需要使用ScaffoldMessenger.of(context)
来代替。
请参阅文档了解
removeCurrentSnackBar()
:
Removes the current [SnackBar] (if any) immediately from registered [Scaffold]s.
The removed snack bar does not run its normal exit animation.
If there are any queued snack bars, they begin their entrance animation immediately.