热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter控件之Scaffold(包含基本布局结构)

Scaffold实现了基本的布局结构包含titlebarbody侧滑悬浮按钮bottomNavigationBar,基本用到的都会涵盖。下面是一个例子,包含1.PageView+底

Scaffold 实现了基本的布局结构包含titlebar body 侧滑 悬浮按钮 bottomNavigationBar,基本用到的都会涵盖。

下面是一个例子,包含

1. PageView+底部导航栏的联动

2.点击事件

3.标题栏AppBar 菜单项 PopupMenuButton

4.侧滑

5.悬浮按钮

代码如下:

Flutter控件之Scaffold(包含基本布局结构)

 

脚手架 Scaffold

import 'package:flutter/material.dart';

class LearnScaffold extends StatefulWidget{
  @override
  State createState() {
    return new _LearnScaffold();
  }
}
class _LearnScaffold extends State{

  //标题栏
  AppBar getAppBar(){
    return new AppBar(
      backgroundColor: Colors.green,//设置标题栏的背景颜色
      title: new Title(
        child:new Text(
          '这是一个标题',
          style: new TextStyle(
            fontSize: 20.0,
            color: Colors.white,
          ),
        ),
        color: Colors.white,//设置标题栏文字的颜色(new title的时候color不能为null不然会报错一般可以不用new title 直接new text,不过最终的文字里面还是以里面new text的style样式文字颜色为准)
      ),
      centerTitle: true,//设置标题居中
      elevation: 10.0,//设置标题栏下面阴影的高度
      leading: new Builder(
          builder: (BuildContext context){
            return new GestureDetector(//设置事件
              child: new Icon(//设置左边的图标
                Icons.account_circle,//设置图标内容
                color: Colors.white,//设置图标的颜色
              ),
              onTap:(){
                Scaffold.of(context).showSnackBar(
                    new SnackBar(content: new Text('点击'))
                );
              },
              onLongPress: (){
                Scaffold.of(context).showSnackBar(
                    new SnackBar(content: new Text('长按'))
                );
              },
              onDoubleTap: (){
                Scaffold.of(context).showSnackBar(
                    new SnackBar(content: new Text('双击'))
                );
              },
            );
          }
      ),
      brightness:Brightness.light,//设置状态栏的字体颜色(白色/黑色)
      primary: true,//是否设置内容避开状态栏
//        flexibleSpace: ,//伸缩控件
//        automaticallyImplyLeading: true,

      //设置显示在右边的控件
      actions: [
        new Padding(
          child: new Icon(
            Icons.add,
            color: Colors.white
          ),
          padding: EdgeInsets.all(10.0),
        ),
        new Padding(
          child: new Icon(
              Icons.account_box,
              color: Colors.white
          ),
          padding: EdgeInsets.all(10.0),
        ),
        new PopupMenuButton(
          itemBuilder: (BuildContext context){
            return >[
              PopupMenuItem(
                child: new Text("menu item 1"),
                value: "第一个",
              ),
              PopupMenuItem(
                child: new Text("menu item 2"),
                value: "第二个",
              ),
            ];
          },
          icon: new Icon(
              Icons.ac_unit,
              color: Colors.white
          ),
          onSelected: (String selected){
            print("选择的:" + selected);
          },
        ),
      ],
      bottom:PreferredSize(//设置标题下面的view
        child: new Container(
          height: 50.0,
          child: new Center(
            child: new Text(
              '显示在title下面',
            ),
          ),
          decoration: BoxDecoration(
            color: Colors.red,
          ),
        ),
        preferredSize: Size.fromHeight(50.0),
      ),
    );
  }

  int _currentIndex = 1;//记录当前选择的PageView与Tab的index
  List _pages;//pageView的item
  PageController _pageController;//pageView的控制器

  @override
  void initState() {
    super.initState();
    print("初始化数据");

    //PageView的控制
    _pageCOntroller= new PageController(
        initialPage: _currentIndex //初始化选中的页面位置
    );

    _pages = [
      Container(color: Colors.red),
      Container(color: Colors.greenAccent),
      Container(color: Colors.yellow),
    ];
  }

  @override
  Widget build(BuildContext context) {
    print("调用setState()方法后 就会调用build()方法,重绘");
    return new Scaffold(//实现了基本的布局结构包含titlebar  body  drawer  悬浮按钮 bottomNavigationBar,基本用到的都会涵盖
        appBar: getAppBar(),

        //中间部分
        body: PageView.builder(
          itemBuilder: (BuildContext context, int index){
            return _pages[index];
          },
          controller: _pageController,
          itemCount: _pages.length,//PageView的总个数
          onPageChanged: (int index){
            //PageView的回调
            print("当前显示的是第$index页");
            //setState()  更新数据,将回调build()方法,重新绘制页面
            setState(() {
              _currentIndex = index;
            });
          },
        ),

        //底部固定的widget
        persistentFooterButtons: [
          new Icon(Icons.add_shopping_cart),
          new Icon(Icons.ac_unit),
          new Icon(Icons.print),
          new Icon(Icons.accessibility),
          new Icon(Icons.keyboard),
          new Icon(Icons.add_shopping_cart),
          new Icon(Icons.ac_unit),
          new Icon(Icons.print),
          new Icon(Icons.accessibility),
        ],

        //侧边栏
        drawer: new Drawer(
          child:new Image.network(
            "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2755523882,2215399258&fm=200&gp=0.jpg",
            fit: BoxFit.fill,
          ),
        ),

        //底部导航栏
        bottomNavigationBar: new BottomNavigationBar(
          currentIndex: _currentIndex,//默认选中的位置
          fixedColor: Colors.green,//选中的颜色
          onTap: (int index){//点击的bar
            //改变PageView显示的页面,将回调PageView的onPageChanged() 方法
            _pageController.animateToPage(
              index,//切换到的页面index
              duration: Duration(milliseconds: 200),//200毫秒
              curve: Curves.bounceOut,//动画
            );
          },
          items:[
            new BottomNavigationBarItem(
              icon:new Icon(
                Icons.airplay,
              ),
              activeIcon: new Icon(//选中显示的icon
                Icons.airport_shuttle,
              ),
              title: new Text(
                '主页',
              ),
            ),
            new BottomNavigationBarItem(
              icon:new Icon(
                Icons.add,
              ),
              title: new Text(
                '加量',
              ),
            ),
            new BottomNavigationBarItem(
              icon:new Icon(
                Icons.account_box,
              ),
              title: new Text(
                '个人中心',
              ),
            ),
          ] ,
        ),

        //悬浮按钮
        floatingActionButton: new Builder(
            builder:(BuildContext context){
              return new FloatingActionButton(
                tooltip: '这里是长按提示的文字',
                backgroundColor: Colors.red,//设置悬浮按钮的背景颜色
//             heroTag: ,//页面切换动画的tag
                elevation: 10.0,//阴影大小
//             highlightElevation: 20.0,//设置高亮的阴影
                mini: false,//设置是否为小图标
                child: new Icon(Icons.access_alarm),//设置中间的小图标
                //点击事件
                onPressed: (){
                  Scaffold.of(context).showSnackBar(
                    new SnackBar(
                      content: new Text('看你出来不'),//设置要提示的文字
                      backgroundColor: Colors.red,//设置背景颜色
                      duration:new Duration(//设置显示的时间
                        days: 0,
                        hours: 0,
                        minutes: 1,//1分钟
                        milliseconds: 0,
                        microseconds: 0,
                      ),
                      //animation: ,//设置显示的时候的动画
                      action: new SnackBarAction(
                        label: "snackBar右边的按钮",//按钮显示的内容
                        onPressed:(){//点击之后触发的另一个事件
                          print('点击了snackBar右边的按钮');
                        },
                      ),
                    ),
                  );
                },
              );
            })
    );
  }
}

效果图:

Flutter控件之Scaffold(包含基本布局结构)

 


推荐阅读
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
author-avatar
mobiledu2502924733
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有