如何在容器底部显示 Snackbar 而不是屏幕颤动

Posted

技术标签:

【中文标题】如何在容器底部显示 Snackbar 而不是屏幕颤动【英文标题】:How to show Snackbar at the bottom of container and not screen flutter 【发布时间】:2021-03-19 13:29:10 【问题描述】:

我有下面的屏幕来实现,我遇到的问题是我不知道如何在容器底部显示小吃栏。它在屏幕底部显示小吃栏,但我希望它如下所示:

注意:图片中的 Snackbar 显示有文字“Whoray, Right Answer”。

添加代码:

SingleChildScrollView(
      child: BlocBuilder<QuizControllerCubit, QuizControllerState>(
        builder: (context, state) 
          if (state is OnWrongAnswerGiven) 
            SnackBarCustomWidget.showSnackBar(
              context,
              SnackBarWidget.getSnackBar(context, state.message),
            );
           else if (state is OnRightAnswerGiven) 
            SnackBarCustomWidget.showSnackBar(
              context,
              SnackBarWidget.getSnackBar(context, state.message),
            );
          
          return SnackBarCustomWidget(
            child: Builder(
              builder: (context) => Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  QuizTitleWidget(title: question.name),
                  Container(
                    constraints: BoxConstraints(
                      minHeight: MediaQueryUtils(context).height * 0.5,
                      maxHeight: MediaQue

【问题讨论】:

我在您上传的图片中没有看到任何 Snackbar。能详细点吗? @RaviSinghLodhi 我已经更新了我的答案。它与文本“Whoray 正确答案”一起显示。 【参考方案1】:

让我给你一个小部件



class MySnackBarStack extends StatefulWidget 
  final Widget child;

  const MySnackBarStack(Key key, this.child) : super(key: key);
  @override
  _MySnackBarStackState createState() => _MySnackBarStackState();

  static void showSnackBar(BuildContext context,SnackBar snackBar)
    context.findAncestorStateOfType<_MySnackBarStackState>()._showSnackBar(snackBar);
  

  static void hideSnackBar(BuildContext context)
    context.findAncestorStateOfType<_MySnackBarStackState>()._hideSnackBar();
  


class _MySnackBarStackState extends State<MySnackBarStack> 
  Widget snackBar = SizedBox();

  void _showSnackBar(SnackBar snackBar)
    setState(() 
      this.snackBar = snackBar;
    );
  

  void _hideSnackBar()
    setState(() 
      snackBar = SizedBox();
    );
  

  @override
  Widget build(BuildContext context) 
    return Stack(
      children: [
        widget.child,
        snackBar,
      ],
    );
  


现在在任何构建方法中都像这样使用它

//you cannot access MySnackBarStack here and up
MySnackBarStack(
    child: Builder(
      //you can only access MySnackBarStack here and down
      builder: (newContext)
        return MyContainer(
          onTap:()
            MySnackBarStack.showSnackBar(newContext, snackBar);
          
        );
      ,
    ),
  )

【讨论】:

在调用 showSnackBar 时显示错误,说明 MySnackBarStack 在 null 上被调用。我已经包装了我需要在 MySnackBarStack 中显示的小部件。 BuilderMySnackBarStack 的孩子引入一个新的context,使用更新编辑问题 你能上传一个示例代码吗? 我已将名称更改为 SnackBarCustomWidget 已经更新了答案,错误仍然存​​在?

以上是关于如何在容器底部显示 Snackbar 而不是屏幕颤动的主要内容,如果未能解决你的问题,请参考以下文章

Android - 我的 Snackbar 出现在底部导航栏的前面而不是它的上方,如何解决?

制作“从底部滑动”按钮(类似于snackbar)(Android)

如何在底部栏上方显示 Snackbar?

如何在对话框覆盖的底部添加 SnackBar

Android KitKat:Snackbar 不在屏幕底部

flutter SnackBar 底部消息提示