无法通过调用 ScaffoldState().removeCurrentSnackBar() 来移除当前的小吃店

Posted

技术标签:

【中文标题】无法通过调用 ScaffoldState().removeCurrentSnackBar() 来移除当前的小吃店【英文标题】:Cannot remove the current snackbar by calling ScaffoldState().removeCurrentSnackBar() 【发布时间】:2020-06-20 20:24:08 【问题描述】:

由于某种原因,即使我正在调用 ScaffoldState().removeCurrentSnackBar(),我也无法删除当前的小吃店

我没有收到任何错误消息,但由于某种原因,快餐栏不会消失。当用户从 DropdownButton 中选择一个项目时,还有其他方法可以删除小吃吧吗?

我已经尝试过 ScaffoldState().hideCurrentSnackBar() 和所有其他应该删除 SnackBar 的功能。

感谢您的回答。

class MainRoute extends StatefulWidget 
  @override
  _MainRouteState createState() => _MainRouteState();


class _MainRouteState extends State<MainRoute> 
  List<Currency> dropdownItems = [
    Currency(currencyName: "FOO", currencyInUSD: 22.0),
    Currency(currencyName: "BOO", currencyInUSD: 22.0),
    Currency(currencyName: "SOO", currencyInUSD: 22.0),
  ];
  Currency dropdownValue;

  Color color = Colors.green;
  MainModel model = MainModel();

  @override
  void initState() 
    super.initState();
    dropdownValue = dropdownItems[0];
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      ///A Builder has been added so the context contains the Scaffold which
      ///is required to create a SnackBar
      floatingActionButton: Builder(
        builder: (context) 
          return FloatingActionButton(
            child: Icon(
              Icons.add,
              color: kIconColor,
            ),
            onPressed: () 
              print(dropdownItems.map((item) 
                return DropdownMenuItem(
                  value: item,
                  child: Text(item.currencyName),
                );
              ).toList());
              setState(() 
                Scaffold.of(context).showSnackBar(
                  SnackBar(
                    content: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: <Widget>[
                        Text('Which currency do you want to add to your list?'),
                        SizedBox(
                          height: 25.0,
                        ),
                        DropdownButton<Currency>(
                          items: dropdownItems
                              .map<DropdownMenuItem<Currency>>((item) 
                            return DropdownMenuItem(
                              value: item,
                              child: Text(item.currencyName),
                            );
                          ).toList(),
                          value: dropdownValue,
                          onChanged: (value) 
                            setState(() 
                              dropdownValue = value;
                              ScaffoldState().removeCurrentSnackBar(
                                  reason: SnackBarClosedReason.remove);
                              print("SnackBar removed");
                            );
                          ,
                        )
                      ],
                    ),
                    action: SnackBarAction(
                      label: 'Cancel',
                      onPressed: () 
                        print('Cancel');
                      ,
                    ),
                  ),
                );
              );
            ,
          );
        ,
      ),
    );
  
 

【问题讨论】:

试试 ScaffoldState().hideCurrentSnackBar(); 我已经试过了,还是不行 我的下一个猜测是,您应该为这两个操作使用相同的 Scaffold。您正在使用 Scaffold.of(context) 显示它,但将其隐藏在静态 Scaffold (ScaffoldState()) 中。 【参考方案1】:

至于2021,你应该使用

ScaffoldMessenger.of(context).removeCurrentSnackBar()

而不是

Scaffold.of(context).removeCurrentSnackBar();

此功能在 Flutter v1.23.0-14.0.pre 之后被弃用。

【讨论】:

【参考方案2】:

当用户从 DropdownButton 中选择一个项目时,而不是使用以下 onChanged 方法:

onChanged: (value) 
      setState(() 
         dropdownValue = value;
         ScaffoldState().removeCurrentSnackBar(
         reason: SnackBarClosedReason.remove);
         print("SnackBar removed");
      );
   ),

改用这个方法调用来移除snackbar:

onChanged: (value) 
      setState(() 
         dropdownValue = value;
         Scaffold.of(context).removeCurrentSnackBar(
            reason: SnackBarClosedReason.remove,
         );
         print("SnackBar removed");
      );
   ),

【讨论】:

以上是关于无法通过调用 ScaffoldState().removeCurrentSnackBar() 来移除当前的小吃店的主要内容,如果未能解决你的问题,请参考以下文章

python re 模块和基础正则表达式

通过(ajax/javascript)发布到 django 视图打印空查询集

data属性

如何在 Flutter 的 appbar 之外添加 endDrawer?

re模块

re模块