Flutter 之 Scaffold 控件

属性

1. appBar 显示在界面顶部的一个 AppBar,也就是 Android 中的 ActionBar 、Toolbar

AppBar 控件属性有这些:

  • leading 最左边范围的 Widget 控件,如放一个返回键
  • automaticallyImplyLeading 如果 leading 不为 null ,则这个属性无效,如果 leading为 null ,并且该属性为 false ,则这个范围的空间会给 Title 。如图


    image.png
  • title appBar 的标题,在 leading 后面
  • actions 一个 List<Widget> 可以使用 IconButton 控件从右往左排图标,


    IconButton.png

    也可以使用 PopupMenuButton 最右边显示 3 个点弹出更多,如图


    PopupMenuButton.png
  • flexibleSpace 配合 SliverAppBar 实现类似 CoordinatorLayout 控件 AppBar 折叠效果
  • bottom 一个 TabBar ,类似 TabLayout 控件
  • elevation 阴影程度,默认为 4
  • shape ShapeBorder ,当 elevation 大于 0 ,该属性有效,定义阴影的形状。有 RoundedRectangleBorder,ContinuousRectangleBorder,BeveledRectangleBorder
  • backgroundColor appBar背景颜色
  • brightness AppBar 的亮度,有白天 Brightness.light 和黑夜模式 Brightness.dark
  • iconTheme AppBar 图标的样式 ,通过 IconTheme.of(context) 可以进行设置
  • actionsIconTheme actions 属性设置的图标的样式,使用通 iconTheme
  • textTheme appBar 的文字样式 可以使用 Theme.of(context).textTheme 来进行设置
  • primary appBar 内容是否 嵌入 StatusBar 里面。false 为 嵌入
  • centerTitle 标题是否居中显示
  • titleSpacing 标题左右间距
  • toolbarOpacity 应用程序栏的工具栏的透明程度。值 1.0 是完全不透明的,值 0.0 是完全透明的
  • bottomOpacity appBar 底部透明度,结合 bottom 属性使用设置方式同 toolbarOpacity
appBar: AppBar(
        leading: null,
        automaticallyImplyLeading : false,
        title: Text(widget.title),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.ac_unit),
            onPressed: (){

            },
          ),
          new PopupMenuButton<String>(
              itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
                new PopupMenuItem(child: new Text("我的")),
                new PopupMenuItem(child: new Text("设置")),
                new PopupMenuItem(child: new Text("钱包")),
              ]
          )
        ],
        elevation: 10,
        shape: new RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0),side: new BorderSide(
          style: BorderStyle.none,
        )),
        backgroundColor:Colors.green,
        brightness: Brightness.light,
        iconTheme: IconTheme.of(context).copyWith(color: Colors.black),
        actionsIconTheme: IconTheme.of(context).copyWith(color: Colors.black),
        textTheme: Theme.of(context).textTheme.apply(fontSizeFactor: 1.2),
        primary:true,
        centerTitle: true,
        titleSpacing:10,
        toolbarOpacity:1.0,
        bottomOpacity :0.5,
      ),

效果为


appBar.png

2. body 给一个 Widget ,当前界面所显示的主要布局内容 ,也就是 AppBar 下面部分,如

body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Hello Flutter',
            ),
          ],
        ),
      ),

显示效果


body.png

3. floatingActionButton 类似 Android 的 FloatingActionButton 控件。
FloatingActionButton 有以下几个属性

  • child FloatingActionButton 包含的子 Widget
  • tooltip FloatingActionButton 控件长按显示的提示文本
  • foregroundColor 除了 FloatingActionButton 的背景色,其他元素的颜色
  • backgroundColor FloatingActionButton 的背景色
  • focusColor focus 为 true 获取焦点按钮显示的颜色
  • hoverColor 悬浮颜色,貌似没啥用
  • heroTag 设置 Tag ,防止同一个页面两个 FloatingActionButton 冲突问题
  • elevation 阴影程度
  • focusElevation 聚焦阴影程度
  • hoverElevation 悬浮状态阴影颜色
  • highlightElevation 高亮对应的颜色
  • disabledElevation 按钮禁用时的颜色
  • onPressed 按钮点击事件
  • mini 是小图标还是大图标
  • shape 按钮的形状(矩形 Border,圆形图标 CircleBorder )
  • clipBehavior Clip.antiAlias 剪辑具有抗锯齿功; Clip.antiAliasWithSaveLayer 在剪辑后立即剪辑具有抗锯齿和 saveLayer :Clip.hardEdge:剪辑,但不应用抗锯齿;Clip.none:不剪辑。
  • focusNode FocusNode,对焦点事件的一些设置和处理
  • materialTapTargetSize 点击的效果
  • isExtended 是否有一个显示的动画

4. floatingActionButtonLocation

设置 FloatingActionButton 的位置,有如下几个属性


FloatingActionButton .png

5. floatingActionButtonAnimator

FloatingActionButton 控件出现或消失的动画

6. persistentFooterButtons 固定在下方显示的按钮,比如对话框下方的确定、取消按钮

persistentFooterButtons:<Widget>[
        Text('取消'),
        Text('确定')
      ],
persistentFooterButtons.png

7. drawer 侧边栏控件
通过 Drawer 创建侧边栏

 drawer: new Drawer(
       child: new UserAccountsDrawerHeader(
         accountName: new Text(
           "Flutter",
         ),
         accountEmail: new Text(
           "Flutter@gmail.com",
         ),
       ),
     ),
drawer.png

8. backgroundColor 内容的背景颜色,默认使用的是 ThemeData.scaffoldBackgroundColor
9. bottomNavigationBar 显示在页面底部的导航栏

bottomNavigationBar:BottomNavigationBar(
          items:[
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                title: Text(
                  '首页',
                ),
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                title: Text(
                  '社区',
                ),
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                title: Text(
                  '我的',
                ),
              ),
          ],
        currentIndex:0,
      ),
bottomNavigationBar.png

10. bottomSheet 底部弹出框
11. resizeToAvoidBottomPadding 类似于 Android 中的android:windowSoftInputMode=”adjustResize”,控制界面内容 body 是否重新布局来避免底部被覆盖了,比如当键盘显示的时候,重新布局避免被键盘盖住内容。默认值为 true。
12. resizeToAvoidBottomInset 重新计算布局空间大小
13. primary 布局是否显示到顶部状态栏
14. drawerDragStartBehavior 默认为 DragStartBehavior.down ,还有一种为
DragStartBehavior.start ,暂时不知道啥作用。
15. extendBody 暂时不知道啥作用。
16. drawerScrimColor Drawer 展开后剩余空间的颜色,可是 30% 透明那种

最后代码 :

Scaffold(
      appBar: AppBar(
        leading: null,
        automaticallyImplyLeading : false,
        title: Text(widget.title),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.ac_unit),
            onPressed: (){

            },
          ),
          new PopupMenuButton<String>(
              itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
                new PopupMenuItem(child: new Text("我的")),
                new PopupMenuItem(child: new Text("设置")),
                new PopupMenuItem(child: new Text("钱包")),
              ]
          )
        ],
        elevation: 10,
        shape: new RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0),side: new BorderSide(
          style: BorderStyle.none,
        )),
        backgroundColor:Colors.green,
        brightness: Brightness.light,
        iconTheme: IconTheme.of(context).copyWith(color: Colors.black),
        actionsIconTheme: IconTheme.of(context).copyWith(color: Colors.black),
        textTheme: Theme.of(context).textTheme.apply(fontSizeFactor: 1.2),
        primary:true,
        centerTitle: true,
        titleSpacing:10,
        toolbarOpacity:1.0,
        bottomOpacity :0.5,
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Hello Flutter',
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        tooltip: 'Increment',
        foregroundColor: Colors.cyanAccent,
        backgroundColor: Colors.green,
        focusColor: Colors.red,
        hoverColor:Colors.black,
        onPressed: _showMessage,
        shape :const CircleBorder(),
        clipBehavior: Clip.none,
        focusNode:  _node,
        isExtended: true,
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      floatingActionButtonAnimator:FloatingActionButtonAnimator.scaling,
      persistentFooterButtons:<Widget>[
        Text('取消'),
        Text('确定')
      ],
      drawer: new Drawer(
        child: new UserAccountsDrawerHeader(
          accountName: new Text(
            "Flutter",
          ),
          accountEmail: new Text(
            "Flutter@gmail.com",
          ),
        ),
      ),
      bottomNavigationBar:BottomNavigationBar(
          items:[
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                title: Text(
                  '首页',
                ),
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                title: Text(
                  '社区',
                ),
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                title: Text(
                  '我的',
                ),
              ),
          ],
        currentIndex:0,
      ),
      bottomSheet:Text('底部弹出框'),
      primary:true,
      drawerDragStartBehavior: DragStartBehavior.down,
      extendBody: true,
      drawerScrimColor: Color.fromARGB(50, 0, 0, 0),
    );

效果为:

效果1.png

效果图2.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容