【问题标题】: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
  }

提前致谢。

【问题讨论】:

    标签: flutter snackbar


    【解决方案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(); 已被弃用。

          【讨论】:

            猜你喜欢
            • 2016-04-01
            • 2022-10-08
            • 2018-05-04
            • 1970-01-01
            • 2022-12-17
            • 2021-07-10
            • 2020-05-18
            • 2016-03-13
            • 2019-12-17
            相关资源
            最近更新 更多