Flutter 如何正确显示SnackBar

 更新时间:2021年05月14日 10:58:51   作者:岛上码农  
Snackbar是Android支持库中用于显示简单消息并且提供和用户的一个简单操作的一种弹出式提醒。当使用Snackbar时,提示会出现在消息最底部,通常含有一段信息和一个可点击的按钮。本文主要介绍了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的资料请关注脚本之家其它相关文章!

相关文章

  • android自定义view实现数字进度条

    android自定义view实现数字进度条

    这篇文章主要为大家详细介绍了android自定义view实现数字进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Android 轻松获取CPU型号的方法

    Android 轻松获取CPU型号的方法

    这篇文章主要介绍了在Android设备上获取CPU型号是一项常见的任务的相关资料,需要的朋友可以参考下
    2023-10-10
  • flutter监听app进入前后台状态的实现

    flutter监听app进入前后台状态的实现

    在开发app的过程中,我们经常需要知道app处于前后台的状态,本文主要介绍了flutter监听app进入前后台状态的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Android自制精彩弹幕效果

    Android自制精彩弹幕效果

    这篇文章主要为大家详细介绍了Android自制精彩弹幕效果,弹幕垂直方向可固定随机,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 详解Android中Activity运行时屏幕方向与显示方式

    详解Android中Activity运行时屏幕方向与显示方式

    本文主要对如何控制Android中Activity运行时屏幕方向与显示方式进行详细全面的实例讲解。具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • Android 开发延时调用的几种方法

    Android 开发延时调用的几种方法

    本篇文章主要介绍Android 延迟, 在Android 程序开发过程中经常会遇到程序推迟时间执行,这里整理了几种方法,以便Android 开发的朋友参考
    2016-07-07
  • Android实现截图分享qq 微信功能

    Android实现截图分享qq 微信功能

    在日常生活中,经常用到qq,微信截图分享功能,今天小编通过本文给大家介绍Android实现截图分享qq 微信功能,具体实现代码大家参考下本文
    2017-12-12
  • Android定时器和Handler用法实例分析

    Android定时器和Handler用法实例分析

    这篇文章主要介绍了Android定时器和Handler用法,实例分析了Android中的定时器与Handler相关使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • android实现定时拍照功能

    android实现定时拍照功能

    这篇文章主要为大家详细介绍了android实现定时拍照功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Kotlin自定义菜单控件

    Kotlin自定义菜单控件

    这篇文章主要为大家详细介绍了Kotlin自定义菜单控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论