如何检查是不是有小吃店显示?

Posted

技术标签:

【中文标题】如何检查是不是有小吃店显示?【英文标题】:How to check if there is a snack bar showing?如何检查是否有小吃店显示? 【发布时间】:2019-12-04 05:32:45 【问题描述】:

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

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

提前致谢。

【问题讨论】:

【参考方案1】:

只需致电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】:

您可以使用 .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。此外,根据您的要求,您可以检查当前小吃店上的文字,以查看预期的小吃店和当前的小吃店是否相同。

【讨论】:

【参考方案3】:

补充@Sukhi 提到的内容

//设置这个状态 ...

bool _isSnackbarActive = false;

...

。 . .

//如果你想在按钮按下时显示snackBar

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

使用ScaffoldMessenger.of(context).removeCurrentSnackBar();,因为Scaffold.of(context).removeCurrentSnackBar(); 已被弃用。

【讨论】:

以上是关于如何检查是不是有小吃店显示?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建显示在所有屏幕上的小吃店?

如何检查当前是不是正在显示 UIViewController?

如何检查列表中的任何一个元素是不是显示在量角器中

如何检查单词是不是以给定字符开头?

有没有办法实现 Flutter ***小吃店?

SnackBar 在 HTTPInterceptor 中使用时不显示