Flutter:App级别组件 - MaterialApp、Scaffold、AppBar、Drawer、BottomNavigationBar、SnackBar

2023-11-03

参考

老孟App级别组件

MaterialApp

Flutter中的MaterialApp是一个基于Material Design风格的顶层Widget,它提供了许多常用的Material Design风格的组件和样式,例如AppBar、BottomNavigationBar、Drawer等。在一个Flutter应用中,通常只需要一个MaterialApp,它是整个应用的根Widget,包含了整个应用的主题、路由、导航等。

这里只简单介绍,详细的等后面学到了会整理

MaterialApp的常用属性包括:

  • title:应用的标题,通常会显示在AppBar中。
  • theme:应用的主题,包括颜色、字体、形状等。
  • home:应用的首页,通常是一个Scaffold
  • routes:应用的路由表,用于管理应用的各个页面。
  • initialRoute:应用的初始路由。
  • onGenerateRoute:路由生成函数,用于动态生成路由。
  • navigatorObservers:导航观察器,用于监听路由的变化。
//使用箭头函数简写
main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  //创建widget的唯一标识
  const MyApp({Key? key}) : super(key: key);

  //重写build方法
  @override
  Widget build(BuildContext context) {
    //返回一个material类型的app
    return  MaterialApp(
      // 设置区域
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: const [
        Locale('zh', 'CN'),
        Locale('en', 'US'),
      ],
      //标题
      title: "MaterialApp",
      // 主题,可以使用提供的默认主题,也可以自定义
      theme: ThemeData.light(),
      // 默认会在右上角显示一个debugger的标识,下面的代码可以去掉
      debugShowCheckedModeBanner: false,
      //主页面
      home:  Scaffold(
          appBar: AppBar(
            title: const Text("AppBar"),
          ),
      ),
    );
  }
}

在这里插入图片描述

Scaffold

Scaffold是一个Material Design风格的基本布局组件,它提供了一个标准的应用程序布局结构,包括应用栏、抽屉菜单、底部导航栏、浮动操作按钮等。Scaffold通常作为应用程序的顶层组件,它可以帮助我们快速构建一个具有标准布局的应用程序。

Scaffold的主要属性包括:

  • appBar:应用栏,通常包括标题、操作按钮等。
  • body:主体内容,通常是一个Widget。
  • floatingActionButton:浮动操作按钮,通常用于执行主要操作。
  • drawer:抽屉菜单,通常用于显示应用程序的导航菜单。
  • bottomNavigationBar:底部导航栏,通常用于切换不同的页面或功能。
Scaffold(
      //导航条
      appBar: AppBar(
        title: const Text("AppBar组件", style: TextStyle(color: Colors.white)),
      ),
      //页面主题内容
      body: const YcHomeBody(),
      //  浮动按钮
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        child: const Icon(Icons.add),
      ),
      //  左抽屉
      drawer: const Drawer(
        width: 150,
        backgroundColor: Color(0x43ad7f7f),
        child: Center(
          child: Text("左抽屉"),
        ),
      ),
      //  右抽屉
      endDrawer: const Drawer(
        width: 150,
        backgroundColor: Color(0x43ad7f7f),
        child: Center(
          child: Text("右抽屉"),
        ),
      ),
      //  底部导航栏
      bottomNavigationBar: BottomNavigationBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(label: '首页', icon: Icon(Icons.home)),
          BottomNavigationBarItem(label: '书籍', icon: Icon(Icons.book)),
          BottomNavigationBarItem(label: '我的', icon: Icon(Icons.perm_identity)),
        ],
      ),
    );

在这里插入图片描述

AppBar

AppBar是一个Material Design风格的顶部导航栏,通常用于展示页面的标题、操作按钮和返回按钮等。AppBar可以通过Scaffold组件来使用,也可以单独使用。

AppBar有以下常用属性:

  • title:AppBar的标题,通常是一个Text组件。
  • actions:AppBar右侧的操作按钮,是一个Widget的数组。
  • leading:AppBar左侧的返回按钮,通常是一个IconButton。
  • backgroundColor:AppBar的背景颜色。
  • elevation:AppBar的阴影高度。
AppBar(
     // 标题
     title: const Text("AppBar组件", style: TextStyle(color: Colors.white)),
     // 右侧操作区
     actions: const [Icon(Icons.calendar_month)],
     // 左侧操作区
     leading: const Icon(Icons.arrow_back),
     //  背景色
     backgroundColor: Colors.orange,
     //  阴影
     elevation: 2,
   ),

在这里插入图片描述

Drawer

Drawer是一个抽屉导航组件,导航一般使用底部导航BottomNavigationBar或者抽屉导航。Drawer一般和Scaffold组合使用。

默认图标
如果设置了AppBar,而没有设置AppBar的leading属性,在AppBar的左侧默认出现抽屉的图标

Scaffold(
	appBar: AppBar(),
	drawer: Drawer(),
)

在这里插入图片描述
可以通过点击按钮,或者滑动来打开(关闭)抽屉。

代码控制抽屉

  • 打开
ElevatedButton(
    onPressed: () {
      // 通过代码打开抽屉,需要获取Scaffold状态
      Scaffold.of(context).openDrawer();
    },
    child: const Text("打开抽屉"),
  )
  • 取消
Navigator.of(context).pop();

常见用法
Drawer里面可以放置任何组件,但是一般使用ListView,分为DrawerHeaderListTiles
DrawerHeader的高度默认为160像素,如果你想改变DrawerHeader的高度,可以使用SizedBoxContainer来包装DrawerHeader,并设置自定义的高度。

Drawer(
        width: 200,
        child: ListView(
          children: const <Widget>[
            DrawerHeader(
              child: Text("抽屉头部"),
            ),
            ListTile(
              title: Text("头像"),
            ),
            ListTile(
              title: Text("昵称"),
            ),
          ],
        ),
      ),

在这里插入图片描述

BottomNavigationBar

底部导航条

Scaffold(
      //导航条
      appBar: AppBar(
        // 标题
        title: const Text("AppBar和Drawer组件",
            style: TextStyle(color: Colors.white)),
      ),
      //页面主题内容
      body: const Text("主页"),
      //  底部导航
      bottomNavigationBar: BottomNavigationBar(
        items: const [
          BottomNavigationBarItem(label: '首页', icon: Icon(Icons.home)),
          BottomNavigationBarItem(label: '书籍', icon: Icon(Icons.book)),
          BottomNavigationBarItem(label: '我的', icon: Icon(Icons.perm_identity)),
        ],
        // 当前默认激活像
        currentIndex: _currentIndex,
        onTap: (int index) {
          setState(() {
            _currentIndex = index;
          });
        },
      ),
    );

在这里插入图片描述

SnackBar

SnackBar是一种轻量级的提示组件,用于向用户显示短暂的消息。SnackBar通常会在屏幕的底部显示,并在一定时间后自动消失。SnackBar可以包含文本、图标或操作按钮等内容,可以通过设置持续时间、背景颜色、字体样式等属性来自定义SnackBar的外观和行为。

通常用于在用户执行某些操作后向用户提供反馈信息,例如:表单提交成功、网络请求失败等。

Center(
        child: ElevatedButton(
      child: const Text('提示'),
      onPressed: () {
        // 移除掉旧的消息,避免快速点击后,每隔4秒弹出一个消息
        ScaffoldMessenger.of(context).removeCurrentSnackBar();
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          // 提示的内容
          content: const Text("这是一条提示"),
          //   阴影
          elevation: 8,
          //持续时间,默认4秒
          duration: const Duration(seconds: 4),
          //颜色
          backgroundColor: Colors.orange,
          //  形状
          shape: const RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(20.0)),
          ),
          //  行为
          action: SnackBarAction(
              label: "确定",
              textColor: Colors.blue,
              onPressed: () {
                print("确定");
              }),
        ));
      },
    ));

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:App级别组件 - MaterialApp、Scaffold、AppBar、Drawer、BottomNavigationBar、SnackBar 的相关文章

  • 更改语言 Flutter 的按钮

    我正在 Flutter 中构建一个应用程序 到目前为止 我正在使用 JSON 国际化 其中应用程序的语言基于用户手机中默认的语言 它工作得很好 但我想给用户有机会在不更改手机系统语言设置的情况下更改语言 只需单击按钮 然后应用程序即可更改语
  • ListView 和快照 - 错误 - 错误状态:DocumentSnapshotPlatform 中不存在字段[重复]

    这个问题在这里已经有答案了 我对快照和 ListView 有一个小问题 到目前为止 它运行得很好 但自从我更新了 flutter 和 Dart 后 我 收到了一个错误 构建 StreamBuilder gt 时抛出以下 StateError
  • 打开键盘会导致有状态小部件重新初始化

    我在 Stable 分支中使用 Flutter 1 2 1 为了说明我的问题 假设我有页面 A 和 B A 使用以下命令导航到 BNavigator pushB 使用以下命令导航回 ANavigator pop 两者都是有状态的小部件 当我
  • 没有脚手架的 DefaultTabController?

    我正在尝试使用DefaultTabController在一些小部件的中间 所以我的TabBar不能在AppBar并且必须关闭一些小部件 所以我的问题是当我使用时TabBarView它崩溃了 这是一个 Flutter 示例的示例 但没有找到如
  • 如何在flutter中绕过SSL证书验证?

    如何在flutter中绕过SSL证书验证 错误 握手异常 客户端中的握手错误 操作系统错误 CERTIFICATE VERIFY FAILED 自签名证书 handshake cc 345 您需要配置 HttpService 以使用自签名
  • Flutter - 构建失败并出现异常

    当我启动我的应用程序时 我收到此错误消息 自上次运行以来我没有进行任何更改 当时一切都很好 有人知道如何解决这个问题吗 谢谢 FAILURE Build failed with an exception 什么地方出了错 无法确定任务 app
  • Flutter编译错误:必须返回非空值,因为返回类型“String”不允许为空 - displayString

    我的测试无法在我的 Flutter 项目引用的仅 Dart 项目中编译和运行 我收到以下错误消息 Failed to precompile test test pub cache hosted pub dartlang org analyz
  • Flutter如何在BottomNavigationBar中添加边距或填充

    我正在尝试制作底部导航栏 但在屏幕上左右填充 现在 我用容器包裹 BottomNavigationBar 并在其中添加填充 问题是 BottomNavigationBar 默认背景仍然包裹所有图层 所以我们可以删除那里的背景颜色吗 Goal
  • 使用 Flutter 基础类型而不使用 Flutter

    我需要在没有 Flutter 的环境中使用 lib package flutter foundation dart 中存在三种类型 他们是 ByteData ReadBuffer and WriteBuffer 是否可以在不依赖整个 Flu
  • Flutter 中的 AndroidManifest 中缺少默认通知通道元数据

    我在用firebase messaging 5 0 1软件包来实现推送通知 在 IOS 中一切正常 而在 Android 中 当我的移动应用程序在后台运行时 我收到通知 但它没有导航到相应的屏幕 它只是打开默认屏幕 如何实现到该特定屏幕的导
  • Dart 从 UInt8List 获取扩展

    我正在使用该包图像选择器 https pub dev packages image picker接受来自用户的图像 这会产生 PickedFile 和字节数组 由于图像随后被上传 我想知道如何从字节数组中猜测 mime 类型 PickedF
  • 颤振轮播图像滑块在点击事件期间打开单独的页面被调用

    我是新来的 我想问一个关于我的代码的问题 我查看了 youtube 和一些关于这个 inkwell 的 google 教程 以及点击功能来在 flutter 上打开新的类活动 但结果是 当点击图像时 它会打开不同的图像屏幕 但它们共享相同的
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • Cloud Functions,删除Firestore SubCollections,是否需要AdminToken?

    我正在尝试构建可调用的云函数 当用户删除帖子时 它也会尝试删除评论 这是帖子的子集合 所以我看到了这个例子并像文档示例一样实现 const admin require firebase admin const firebase tools
  • Flutter 中的自动关闭对话框

    我想在打开后几秒钟自动关闭对话框 我找到的解决方案是调用Navigator of context pop 延迟并且有效 但如果我在执行 Navigator pop 命令之前手动关闭它 通过单击外部 就会出现问题 然后 Navigator p
  • 如何仅添加一个BottomNavigationBarItem

    我有一个 BottomNavigationBar 我只需要在其中添加一个集中按钮 但我收到此错误 package flutter src material bottom navigation bar dart 断言失败 第 191 行 po
  • 如何让flutter应用程序在android导航栏后面绘制并使导航栏完全透明?

    我想让我的 Flutter 应用程序占据 Android 中的整个屏幕 同时仍然显示状态栏和导航栏 并且两者都是透明的 以实现全屏 如下所示iOS https codelabs developers google com codelabs
  • Flutter 和 Openlayers - 包括 flutter 中的 js 库

    来自基于 js cordova 的跨平台领域 我最近正在深入研究 flutter 所以我想知道直接使用 flutter 中的各种 js 库的选项 更具体地说 我有兴趣在 flutter 中使用 openlayers 库来创建具有各种绘图和编
  • Flutter 中声明式编程和命令式编程有什么区别?

    最近 我正在寻找一种方法来增强 Flutter 应用程序中屏幕之间的导航 我发现了新的编程概念 陈述性的 and 至关重要的编程 我需要了解更多关于陈述性的 and 至关重要的范例以及 Flutter 中的示例 声明式路由意味着您的应用程序
  • 期待活页夹但得到空

    尽管一切正常 但我在日志中收到此消息 W Parcel Expecting binder but got null 有人遇到过这样的问题吗 如何解决 重现步骤 只需创建一个新的 Flutter 项目并在模拟器 仿真器上运行它 查看日志 您将

随机推荐

  • 【JavaScript】怎样判断一个变量是不是数组

    var arr 1 2 3 1 Array isArray console log Array isArray arr 2 instanceOf console log arr instanceof Array 3 constuctor c
  • 谷歌全球大裁员,涉及1.2万人

    Datawhale干货 方向 就业信息 来源 机器之心 最近几天科技领域的流行词不是某一项新技术 而是裁员 1 月 20 日 谷歌母公司 Alphabet 在一份员工备忘录中表示 由于面临 变化的经济现状 该公司将裁员约 1 2 万人 加大
  • unity 烘焙场景的创建、保存和使用(附demo项目)

    这是一个入门教程 demo项目 practice4 unitypackagehttps pan baidu com s 1tnDv3sDUzMlk1YnSmJV29w 密码 1234 1 打开Unity 新建一个场景 2 打开Light窗口
  • 深度linux win7分区,怎么安装Win7深度操作系统?

    安装前准备 一 为Deepin留出硬盘空间以便安装 1 打开磁盘管理 Windows徽标上右键单击 选择磁盘管理 2 选中一个分区 空闲空间大于30G 我选择的是C盘 因为是固态硬盘所以安装启动会快很多 磁盘1的200G分区是我上次安装使用
  • css锚点定位被顶部固定导航栏遮住的解决方案

    标题 css锚点定位被顶部固定导航栏遮住的解决方案 很多网站都有一个固定在上方的导航栏 方便用户搜索和跳转到其他页面 同时为了方便用户浏览长文档 都会加上目录 点击段落标题跳转到段落所在的位置 如图所示 如果使用锚点实现目录的跳转会遇到 f
  • camera理论基础和工作原理

    写在前面的话 本文是因为工作中需要编写摄像头程序 因为之前没有做过这类产品 所以网上搜索的资料 先整理如下 主要参考文章如下 如果有侵权 请联系我 另外 转载请注明出处 本文不一定全部正确 如果发现错误请指正 如果有新的理解 会继续整理 h
  • 西门子1513CPU冗余组态

    西门子1513R冗余配置 1 打开博图16软件 新建项目 添加新设备 在弹出的控制器目录下找到CPU 1513R 1 PN硬件 然后系统自动生成PLC 1和PLC 2 2 打开设备组态中的网络视图 添加接口模块 3 在硬件目录 分布式I O
  • 内存保护linux指令,Linux内存管理之MMU的过程

    之前写过一篇 CPU是如何访问内存的 的文章 简单介绍了cpu访问内存的过程 有了之前的感性认识 这篇站在arm的角度再深度讲解一下 看完你会发现不理解arm原理就直接撸内核代码简直是耍流氓 ARMv8中的访问内存流程 我喜欢用图的方式来说
  • Flutter组件之圆形进度条(CircularProgressIndicator)

    圆形进度条 可以在外面包一层SizedBox 间接改变进度条的大小 const CircularProgressIndicator Key key double value 0 1的浮点数 用来表示进度多少 如果 value 为 null
  • python为什么要使用if __name__ == “__main__”:

    python为什么要使用if name main 本文为wangluoshenghuo com原创 转载请注明出处 要说明这个问题 首先要了解 name 和 main 这两个符号是什么意思 name 是一个变量 是当前包的名称 而 main
  • Qt Creator中一些常用小技巧(总结)

    参考博客 https blog csdn net luoyayun361 article details 105431913 以下代码摘抄以上大神博客 1 代码注释 常用双斜杠 是单行注释 可以多行注释 其实在Qt creator里面还有一
  • Qt — xml读写及常用操作示例

    文章目录 1 QXML类概述 2 XML示例 2 1 示例1 3 XML节点说明 3 1QDomNode 3 2 QDomDocument 3 3 QDomElement 3 4 QDomAttr 3 5 QDomText 4 使用示例 4
  • TypeScript 接口继承

    TypeScript 接口继承 和类一样 接口也可以通过关键字 extents 相互继承 接口继承 分为 单继承和多继承 即继承多个接口 另外 接口也可以继承类 它会继承类的成员 但不包括具体的实现 只会把类的成员作为一种声明 本文主要总结
  • 7-项目成本管理

    高项第一阶段 日签 这世上没有毫不后悔的选择 生活也是没有正确答案的 只要坚信选择的道路就是正确答案 并把它变成正确答案就可以了 导图 一个过程记录
  • 第四课 小程序列表渲染特性 条件渲染特性

    小程序 列表渲染特性 1 block标签是包装元素 不是Ui现实元素 渲染后不会被显示出来 2 wx key 属性 重排序保证唯一值 提高整体渲染效率 条件渲染特性 wx if和hidden有什么区别 1 都有显示和隐藏的作用 2 if条件
  • 为什么上线要做防御?

    导语 随着5G时代到来和ipv6的普及 攻击者手段层出不穷 从一开始简单的DDOS分布式拒绝服务 后到蔓延ACK 从不同协议通讯层面发起的攻击 现在CC请求类型攻击 已经可以绕过域名验证 以及模拟正常用户访问 1 黑客勒索 2021年 8月
  • Pycaret详细介绍该库用法及案例(分类方法案例胎儿状态分类指南)

    Pycaret 基本流程一般包含 读取数据 gt 建模 对比模型 gt 模型预测 gt 绘图分析 gt 模型导出 安装pycaret见此篇博文 gt 安装pycaret遇到的问题 使用此命令 pip default timeout 100
  • 字符检测识别机器视觉系统方案设计——东莞康耐德

    字符识别机器视觉系统概述 系统功能 可以自动搜索定位视野中的字符位置 可以自动识别出其中的字符值 可以自动校验字符是否正确并且标记出不正确的字符位置 可以进行在线检测 系统稳定 高效 成本低 应用现状 根据被测产品 字符 测量要求 需要对其
  • UAT测试和SIT测试的区别

    区别如下 1 UAT 终端用户集成测试 主要是要求用户参与进测试流程 并得到用户对软件的认可 鼓励用户自己进行测试设计和进行破坏性测试 充分暴露系统的设计和功能问题 显然 用户的认可和破坏性测试是难点 因为测试人员并不了解用户用什么样的手段
  • Flutter:App级别组件 - MaterialApp、Scaffold、AppBar、Drawer、BottomNavigationBar、SnackBar

    参考 老孟App级别组件 MaterialApp Flutter中的MaterialApp是一个基于Material Design风格的顶层Widget 它提供了许多常用的Material Design风格的组件和样式 例如AppBar B