如何查看是否有小吃店显示?
How to check if there is a snack bar showing?
我正在尝试获取当前的小吃店(显示一个)以确定它是否与我尝试显示的是同一种小吃;换句话说,我不想复制点心,但我买不到。
我已经尝试 google 了,但没有任何显示,真正让我生气的是,当我多次调用 Scaffold.of(context).showSnackBar(sb);
时,他们会一次显示一个,直到他们结束.
import 'package:flutter/material.dart';
const sb = SnackBar(
content: Text('the snack bar'),
);
void main() => runApp(MaterialApp(
title: 'Snack bar test',
home: Scaffold(
appBar: AppBar(
title: Text('snack bar demo'),
),
body: Center(
child: MyApp(),
),
),
));
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text('push to test'),
onPressed: () {
// Scaffold.of(context).
Scaffold.of(context).showSnackBar(sb);
},
);
}
}
我想要实现的是这样的:-
if (sb.isShowing()){
//hide or remove it
}
提前致谢。
只需调用 removeCurrentSnackBar()
即可删除当前的快餐栏。
import 'package:flutter/material.dart';
const sb = SnackBar(
content: Text('the snack bar'),
);
void main() => runApp(MaterialApp(
title: 'Snack bar test',
home: Scaffold(
appBar: AppBar(
title: Text('snack bar demo'),
),
body: Center(
child: MyApp(),
),
),
));
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: Text('push to test'),
onPressed: () {
// Scaffold.of(context).
Scaffold.of(context).showSnackBar(sb);
},
),
RaisedButton(
child: Text('Remove snackbar'),
onPressed: () {
// Scaffold.of(context).
Scaffold.of(context).removeCurrentSnackBar();
},
),
],
);
}
}
您可以使用.close() 事件。它指定小吃店的关闭方式。详细信息 here 和示例代码如下:
bool _isSnackbarActive = false ;
...
...
_isSnackbarActive = true ;
Scaffold.of(context)
.showSnackBar(SnackBar(content: Text("Title")))
.closed
.then((SnackBarClosedReason reason) {
// snackbar is now closed.
_isSnackbarActive = false ;
});
当snackBar显示时变量_isSnackbarActive为true,关闭时设置为false。在您的 onPressed 事件中,只需检查 snackbar 的状态并决定是否显示新的 snackbar。此外,根据您的要求,您可以检查当前小吃店上的文字,看看预期的小吃店是否与当前小吃店相同。
添加@Sukhi 提到的内容
//设置这个状态
...
bool _isSnackbarActive = false;
...
。
.
.
//如果你想在按下按钮时显示snackBar
onPressed: () {
if (!_isSnackbarActive) {
showSnack();
}
//这是showSnack()。调用时,它会将 _isSnackbarActive 设置为 true,现在即使您多次单击该按钮,因为它是 true,也不会显示新的 snackBar。当前的 snackBar 关闭后,它会将 _isSnackbarActive 设置为 false,然后可以再次调用它。
showSnack() {
setState(() {
_isSnackbarActive = true;
});
return ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("Posts updated!")))
.closed
.then((SnackBarClosedReason reason) {
// snackbar is now closed.
setState(() {
_isSnackbarActive = false;
});
});
}
对我来说这很好用,不需要外部变量来控制可见性状态。也许对其他人有帮助。
我认为这不是最好的方法,因为它不会阻止新的 SnackBar,它只会在关闭时清理“队列”。
ScaffoldMessenger.of(context)
.showSnackBar(_snackBar)
.closed
.then((value) => ScaffoldMessenger.of(context).clearSnackBars());
使用 ScaffoldMessenger.of(context).removeCurrentSnackBar();
,因为 Scaffold.of(context).removeCurrentSnackBar();
已弃用。
我正在尝试获取当前的小吃店(显示一个)以确定它是否与我尝试显示的是同一种小吃;换句话说,我不想复制点心,但我买不到。
我已经尝试 google 了,但没有任何显示,真正让我生气的是,当我多次调用 Scaffold.of(context).showSnackBar(sb);
时,他们会一次显示一个,直到他们结束.
import 'package:flutter/material.dart';
const sb = SnackBar(
content: Text('the snack bar'),
);
void main() => runApp(MaterialApp(
title: 'Snack bar test',
home: Scaffold(
appBar: AppBar(
title: Text('snack bar demo'),
),
body: Center(
child: MyApp(),
),
),
));
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text('push to test'),
onPressed: () {
// Scaffold.of(context).
Scaffold.of(context).showSnackBar(sb);
},
);
}
}
我想要实现的是这样的:-
if (sb.isShowing()){
//hide or remove it
}
提前致谢。
只需调用 removeCurrentSnackBar()
即可删除当前的快餐栏。
import 'package:flutter/material.dart';
const sb = SnackBar(
content: Text('the snack bar'),
);
void main() => runApp(MaterialApp(
title: 'Snack bar test',
home: Scaffold(
appBar: AppBar(
title: Text('snack bar demo'),
),
body: Center(
child: MyApp(),
),
),
));
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: Text('push to test'),
onPressed: () {
// Scaffold.of(context).
Scaffold.of(context).showSnackBar(sb);
},
),
RaisedButton(
child: Text('Remove snackbar'),
onPressed: () {
// Scaffold.of(context).
Scaffold.of(context).removeCurrentSnackBar();
},
),
],
);
}
}
您可以使用.close() 事件。它指定小吃店的关闭方式。详细信息 here 和示例代码如下:
bool _isSnackbarActive = false ;
...
...
_isSnackbarActive = true ;
Scaffold.of(context)
.showSnackBar(SnackBar(content: Text("Title")))
.closed
.then((SnackBarClosedReason reason) {
// snackbar is now closed.
_isSnackbarActive = false ;
});
当snackBar显示时变量_isSnackbarActive为true,关闭时设置为false。在您的 onPressed 事件中,只需检查 snackbar 的状态并决定是否显示新的 snackbar。此外,根据您的要求,您可以检查当前小吃店上的文字,看看预期的小吃店是否与当前小吃店相同。
添加@Sukhi 提到的内容
//设置这个状态 ...
bool _isSnackbarActive = false;
...
。 . .
//如果你想在按下按钮时显示snackBar
onPressed: () {
if (!_isSnackbarActive) {
showSnack();
}
//这是showSnack()。调用时,它会将 _isSnackbarActive 设置为 true,现在即使您多次单击该按钮,因为它是 true,也不会显示新的 snackBar。当前的 snackBar 关闭后,它会将 _isSnackbarActive 设置为 false,然后可以再次调用它。
showSnack() {
setState(() {
_isSnackbarActive = true;
});
return ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("Posts updated!")))
.closed
.then((SnackBarClosedReason reason) {
// snackbar is now closed.
setState(() {
_isSnackbarActive = false;
});
});
}
对我来说这很好用,不需要外部变量来控制可见性状态。也许对其他人有帮助。
我认为这不是最好的方法,因为它不会阻止新的 SnackBar,它只会在关闭时清理“队列”。
ScaffoldMessenger.of(context)
.showSnackBar(_snackBar)
.closed
.then((value) => ScaffoldMessenger.of(context).clearSnackBars());
使用 ScaffoldMessenger.of(context).removeCurrentSnackBar();
,因为 Scaffold.of(context).removeCurrentSnackBar();
已弃用。