Flutter 如何正确显示SnackBar

简介

官方API文档Scaffold的of方法说明有说明调用Scaffold.of方法是在Scallfold的子组件的Build方法中,也就是不能直接在构建Scaffold的build方法里调用,否则会抛异常。

Typical usage of the Scaffold.of function is to call it from within the build method of a child of a Scaffold.

通常为显示一个SnackBar需要构建一个Builder,通过Builder的context调用(原因是)

Scallfold.of(context).showSnackBar(SnackBar(contenxt: Text('这是一个SnackBar'));

官方示例

显示SnackBar,官方典型示例代码如下所示:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Code Sample for Scaffold.of.',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        body: MyScaffoldBody(),
        appBar: AppBar(title: Text('Scaffold.of Example')),
      ),
      color: Colors.white,
    );
  }
}

// 在Scaffold子组件里的build方法可以调用Scaffold.of方法
class MyScaffoldBody extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: RaisedButton(
        child: Text('SHOW A SNACKBAR'),
        onPressed: () {
          Scaffold.of(context).showSnackBar(
            SnackBar(
              content: Text('Have a snack!'),
            ),
          );
        },
      ),
    );
  }
}

错误示例

但是若直接在构建Scallfold的build方法中调用会报异常:

Scaffold.of() called with a context that does not contain a Scaffold.

错误代码如下所示:

import 'package:flutter/material.dart';

class ScaffoldSnackBarDemo extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          child: Text('SHOW A SNACKBAR'),
          onPressed: () {
            ///直接在Scallfold的build方法里使用会抛异常
            Scaffold.of(context).showSnackBar(
              SnackBar(
                content: Text('Have a snack!'),
              ),
            );
          },
        ),
      ),
      appBar: AppBar(title: Text('Scaffold.of Example')),
    );
  }
}

解决方法一:Scaffold的子组件通过Builder构建

这时候要不就是按官方的,将需要显示SnackBar的代码另外抽离一个自定义子组件,在子组件的build方法再显示SnackBar,要不就是在Scaffold的build方法体对该子组件再包一层Builder,如下所示。

import 'package:flutter/material.dart';

class ScaffoldSnackBarDemo extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return Scaffold(
       ///在子组件外再包一层builder,让context不共用
      body: Builder(builder: (context) {
        return Center(
          child: RaisedButton(
            child: Text('SHOW A SNACKBAR'),
            onPressed: () {
              Scaffold.of(context).showSnackBar(
                SnackBar(
                  content: Text('Have a snack!'),
                ),
              );
            },
          ),
        );
      }),
      appBar: AppBar(title: Text('Scaffold.of Example')),
    );
  }
}

解决方法二:使用GlobalKey存储ScaffoldState

import 'package:flutter/material.dart';

class ScaffoldSnackBarDemo extends StatelessWidget {
  final _scallfoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      ///使用GlobalKey解决
      key: _scallfoldKey,
      body: Center(
        child: RaisedButton(
          child: Text('SHOW A SNACKBAR'),
          onPressed: () {
            _scallfoldKey.currentState.showSnackBar(SnackBar(
              content: Text('Have a snack!'),
            ));
          },
        ),
      ),
      appBar: AppBar(title: Text('Scaffold.of Example')),
    );
  }
}

Flutter学习Github代码仓库

https://github.com/AiguangLi/Flutter

以上就是Flutter 如何正确显示 SnackBar的详细内容,更多关于Flutter 正确显示 SnackBar的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android中Snackbar的使用方法及小技巧

    前言 Snackbar和Toast相似,都是为了给用户提供交互信息,Snackbar是固定在底部的,显示时从下往上滑出 要使用Snackbar,需要在项目的build.gradle中添加依赖 dependencies { compile 'com.android.support:design:23.4.0' } Snackbar的使用方法和Toast很相似 Snackbar.make(mOpenTv, "消息内容", Snackbar.LENGTH_SHORT) .setAction(

  • Android中如何指定SnackBar在屏幕的位置及小问题解决

    Android指定SnackBar在屏幕的位置 Snackbar 常以一个小的弹出框的形式,出现在手机屏幕下方或者桌面左下方,并且是在屏幕所有层的最上方.如果要指定它在屏幕出现的位置,可以把SnackBar放置在android.support.design.widget.CoordinatorLayout内. 在RelativeLayout里添加CoordinatorLayout如下: <android.support.design.widget.CoordinatorLayout androi

  • Android重要控件SnackBar使用方法详解

    SnackBar是DesignSupportLibrary中的一个重要的控件,用于在界面下面提示一些关键信息,跟Toast不同的地方是SnackBar允许用户向右滑动消除它,同时,也允许在SnackBar中设定一个Action,当用户点击了SnackBar里面的按钮的时候,可以进行一些操作,所以,功能绝对是很强大的. SnackBar的构造: // 参数分别是父容器,提示信息,持续时间public static Snackbar make(@NonNull View view, @NonNull

  • Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗

    Dialog和Toast所有人肯定都不会陌生的,这个我们平时用的实在是太多了.而Snackbar是Design Support库中提供的新控件,有些朋友可能已经用过了,有些朋友可能还没去了解.但是你真的知道什么时候应该使用Dialog,什么时候应该使用Toast,什么时候应该使用Snackbar吗?本篇文章中我们就来学习一下这三者使用的时机,另外还会介绍一些额外的技巧. 1. Dialog 首先来介绍一下Dialog的用法吧,其实很简单,相信大多数人都是经常使用的: AlertDialog.Bu

  • Android 开发之Dialog,Toast,Snackbar提醒

    今天给大家带来一篇简单易懂的微技巧文章,并没有什么高深的技术点,但重点是在细节,相信可以给不少朋友带来帮助. Dialog和Toast所有人肯定都不会陌生的,这个我们平时用的实在是太多了.而Snackbar是Design Support库中提供的新控件,有些朋友可能已经用过了,有些朋友可能还没去了解.但是你真的知道什么时候应该使用Dialog,什么时候应该使用Toast,什么时候应该使用Snackbar吗?先看效果图: 1,Dialog 首先来介绍一下Dialog的用法: AlertDialog

  • Flutter 如何正确显示SnackBar

    简介 官方API文档Scaffold的of方法说明有说明调用Scaffold.of方法是在Scallfold的子组件的Build方法中,也就是不能直接在构建Scaffold的build方法里调用,否则会抛异常. Typical usage of the Scaffold.of function is to call it from within the build method of a child of a Scaffold. 通常为显示一个SnackBar需要构建一个Builder,通过Bu

  • python设置 matplotlib 正确显示中文的四种方式

    一.前言 啪地一下点进来,很快呀~~ matplotlib是 Python 优秀的数据可视化第三方库,matplotlib是基于 numpy 的一套 Python 工具包.这个包提供了丰富的数据绘图工具,主要用于绘制一些统计图形. Matplotlib库由各种可视化类构成,内部结构复杂,受 Matlab 启发 matplotlib.pyplot 是绘制各类可视化图形的命令子库,相当于快捷方式. import matplotlib.pyplot as plt 可 matplotlib 并不支持中文

  • vue el-switch初始值(默认值)不能正确显示状态问题及解决

    目录 el-switch 初始值(默认值)不能正确显示状态 使用el-switch显示状态异常 1.问题表述 el-switch 初始值(默认值)不能正确显示状态 先去检查一下接口返回格式 如果是字符串 不需要加冒号 active-value="1" inactive-value="2" 如果是数字 :active-value="1" :inactive-value="2" 使用el-switch显示状态异常 1.问题表述 v

  • 如何正确显示数据库里同时存在的GB码和BIG5码?

    Public Function CheckBIG(strSource As String) As BooleanDim idx As LongDim ByteTemp() As ByteCheckBIG = FalseFor idx = 1 To Len(strSource)    ByteTemp = StrConv(Mid(strSource, idx, 1), vbFromUnicode)    If UBound(ByteTemp) > 0 Then        If (ByteTem

  • img标签中alt和title属性的正确使用

    在的img标签有两个属性分别为alt和title,对于很多初学者而言对这两个属性的正确使用都还抱有迷惑,当然这其中一部分原因也是ie浏览器所导致的.正确的使用这两个属性除了可以提高图片的搜索能力外,在用户体验上也是很有帮助,下面就来说说alt和title的概念与正确使用. alt 此属性的实质作用是图片在无法正确显示的时候起到文本替代的作用,不过在IE6下还起到了title的作用(鼠标放上去后的文字提示),IE的实现方法实际上是错误的.如果想在鼠标滑过时显示提示,应该用title属性.由于错误的

  • jsp中文显示问号问题解决方法

    问题: jsp中想要输出的中文被显示成"?" 解决方法 : 在eclipse-windows- preferences中 搜索jsp , Encoding选项中选择 Chinese . 这样新建的jsp文件将支持中文显示. 对已经存在的jsp文件做如下修改: 将各种编码方式都改成GB18030,如下: 复制代码 代码如下: <%@ page language="java" contentType="text/html; charset=GB18030

  • Extjs TimeField 显示正常时间格式的代码

    如果想正确显示,一般的方法都是改后台代码,使日期时间格式变为string返回,我解决的方法是重写TimeField 的setValue ,具体代码如下: 复制代码 代码如下: Ext.override(Ext.form.TimeField, { getValue: function () { return this.value; }, setValue: function (v) { this.value = v; this.setRawValue(this.formatValue(v)); r

  • aspx 中文汉字显示为乱码

    检查了web.config的配置是正确的: !-- 全球化 此节设置应用程序的全球化设置. --> <globalization fileEncoding="gb2312" requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" uiCulture="zh-CN"/>那问题处在何处?经分析发现:这是文件本身的编码格式

  • Bootstrap3 多个模态对话框无法显示的解决方案

    今天帮同事调了一个代码,他们的项目最近在用Bootstrap做开发,突然间,他遇到了一个奇怪的问题,如果一个页面中,有多个Modal对话框的话,排列在第一个的对话框,能够正确显示,第二个,只能导致页面出现MASK层,却不能显示Dialog. 如果调整顺序,仍然是第一个能显示,第二个只有页面变暗.效果如下: 第一个,正常弹出的Dialog 第二个无法弹出,只是页面变暗的dialog 而两个dialog的代码是完全一致的,具体的代码如下: <div class="modal fade"

  • Python在Console下显示文本进度条的方法

    进度条实现原理 进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果. 进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条? 实现进度条最简单的办法就是,在输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果. 在用Python处理耗时的任务时,往往希望能够

随机推荐