如何检查是否显示小吃店?

时间:2019-07-25 21:36:39

标签: flutter snackbar

我正在尝试获取当前的小吃店(显示一个),以确定它是否与尝试显示的小吃相同;换句话说,我不想复制零食,但我无法得到它。

我试图用谷歌搜索它,但没有任何显示,真正让我烦恼的是,当我多次致电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
  }

并提前致谢。

5 个答案:

答案 0 :(得分:1)

您可以使用.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 ;

});

当便餐条显示时,变量_isSnackbarActive设置为true,而当它关闭时将其设置为false。在您的onPressed事件中,只需检查小吃栏的状态,然后决定是否显示新的小吃栏。另外,根据您的要求,您可以检查当前小吃店上的文本,以查看预期的小吃店和当前小吃店是否相同。

答案 1 :(得分:0)

只需调用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();
          },
        ),
      ],
    );
  }
}

答案 2 :(得分:0)

添加@Sukhi 提到的内容

//设置这个状态 ...

bool _isSnackbarActive = false;

...

。 . .

//如果你想在按钮上显示snackBar,请按

onPressed: () {
        if (!_isSnackbarActive) {
          showSnack();
        }

//这是showSnack()。调用时,它会将 _isSnackbarActive 设置为 true,现在即使您多次单击该按钮,因为它是 true,也不会显示新的小吃店。当前的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;
      });
    });
  }

答案 3 :(得分:0)

就像你说的,多次点击都触发了同一个showSnackBar()方法,反过来又累积了点心;每个人也都在等待另一个人完全消失......

但是,如果一次只有一个小吃店导致问题,为什么不通过 ScaffoldMessengerState 本身清除其所有实例 - 或者只是隐藏当前实例?!

ElevatedButton(
  onPressed: () {
    final messenger = ScaffoldMessenger.of(context);

    messenger.clearSnackBars(); // Clean 'em all!

    messenger.showSnackBar(
      // ...
    );
  },
  child: const Text('Test'),
)

注意:-想将此添加为评论,但目前还不允许!

答案 4 :(得分:0)

对我来说这很好用,不需要外部变量来控制可见性状态。也许对其他人有帮助。

也许这不是最好的方法,因为它不会阻止新的 SnackBars,它只会在关闭时清理“队列”。

ScaffoldMessenger.of(context)
    .showSnackBar(_snackBar)
    .closed
    .then((value) => ScaffoldMessenger.of(context).clearSnackBars());