如何查看是否有小吃店显示?

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(); 已弃用。