zoukankan      html  css  js  c++  java
  • Flutter中的浮动按钮FloatingActionButton 及融合底部工具栏

    FloatingActionButton 简称 FAB,从字面理解可以看出,它是“可交互的浮动按钮”,其实在Flutter默认生成的代码中就有这家伙,只是我们没有正式的接触。

    一般来说,它是一个圆形,中间放着图标,会优先显示在其他Widget的前面。一般可以实现浮动按钮,也可以实现类似闲鱼 app 的底部凸起导航 。

    常用属性

    FloatingActionButton的常用属性,同flutter中其他按钮的常用属性大部分相同,但是也有特殊的:

    • child :子视图,一般为 Icon,不推荐使用文字
    • tooltip FAB: 被长按时显示,也是无障碍功能
    • backgroundColor: 背景颜色
    • elevation :未点击的时候的阴影
    • hignlightElevation :点击时阴影值,默认 12.0
    • onPressed :点击事件回调
    • shape :可以定义 FAB 的形状等
    • mini: 是否是 mini 类型默认 false 
    import 'package:flutter/material.dart';
    
    void main(){ runApp(MyApp());}
    
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home:HomeContent(), 
        );
      }
    }
    
    class HomeContent extends StatelessWidget{
       int _counter = 0; //声明计数器 
    
       void _incrementCounter(){
        setState(() { _counter++; });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
           appBar: AppBar(
              title:Text("flutter demo")
           ),
           body: Center(
             child: Column(
               mainAxisAlignment: MainAxisAlignment.center,
               children: <Widget>[
                 Text('点一次增加一个数字'),
                 Text(
                   '$_counter',
                   style: Theme.of(context).textTheme.display1,
                 ),
               ],
             ),
           ),
           floatingActionButton: FloatingActionButton(
             onPressed: _incrementCounter,
             tooltip: 'Increment',
             child: Icon(Icons.add),
           ),
        );
      }
    }

    FloatingActionButton与BottomAppBar的结合

    我们来看一下floatingActionButton的主要代码:

    floatingActionButton: FloatingActionButton(
        onPressed: (){
          Navigator.of(context).push(MaterialPageRoute(builder:(BuildContext context){
            return EachView('New Page');
          }));
        },
        tooltip: 'Increment',
        child: Icon(
          Icons.add,
          color: Colors.white,
        ),
      ),

    写完这些代码已经有了一个悬浮的按钮,但这个悬浮按钮还没有和低栏进行融合,这时候需要一个属性。

    floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,

    不规则的底部导航栏完整代码如下:

    
    
      import 'package:flutter/material.dart';

    class
    MyApp extends StatefulWidget { @override MyAppState createState() => MyAppState(); } class MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { return Scaffold( body: BottomAppBarDemo(), //不规则的底部导航 ); } } class BottomAppBarDemo extends StatefulWidget { _BottomAppBarDemoState createState() => _BottomAppBarDemoState(); } class _BottomAppBarDemoState extends State<BottomAppBarDemo> { List<Widget> _eachView; int _index = 0; @override void initState() { _eachView = List(); _eachView..add(EachView('Home'))..add(EachView('User')); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( floatingActionButton: FloatingActionButton( //浮动交互按钮 onPressed: (){ Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) { return EachView('New Page'); } )); }, tooltip: '新建页', //长按提示 backgroundColor:Colors.red, //背景颜色 child:Icon(Icons.add,color: Colors.white,) ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, //融合底部工具栏 bottomNavigationBar: BottomAppBar( //底部工具栏 color: Colors.red, shape: CircularNotchedRectangle(), //圆形缺口 child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment:MainAxisAlignment.spaceAround , children: <Widget>[ IconButton( icon: Icon(Icons.home), color: Colors.white, onPressed: (){ setState(() { _index = 0; }); }, ), IconButton( icon: Icon(Icons.airplay), color: Colors.white, onPressed: (){ setState(() { _index = 1; }); }, ), ], ), ), body:_eachView[_index], ); } } class EachView extends StatefulWidget { String _title; EachView(this._title); @override _EachViewState createState() => _EachViewState(); } class _EachViewState extends State<EachView> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(widget._title)), body: Center( child: Text(widget._title), ), ); } }

     如果还是跳上次的子页,代码如下:

      void initState() {
        _eachView = List();
        _eachView
          // ..add(EachView('Home'))
          // ..add(EachView('User')); 
          ..add(Contacts())
          ..add(Personal());
        super.initState();
      }

    还要记得头部要import的子页

  • 相关阅读:
    5 Things Every Manager Should Know about Microsoft SharePoint 关于微软SharePoint每个经理应该知道的五件事
    Microsoft SharePoint 2010, is it a true Document Management System? 微软SharePoint 2010,它是真正的文档管理系统吗?
    You think you use SharePoint but you really don't 你认为你使用了SharePoint,但是实际上不是
    Introducing Document Management in SharePoint 2010 介绍SharePoint 2010中的文档管理
    Creating Your Own Document Management System With SharePoint 使用SharePoint创建你自己的文档管理系统
    MVP模式介绍
    权重初始化的选择
    机器学习中线性模型和非线性的区别
    神经网络激励函数的作用是什么
    深度学习中,交叉熵损失函数为什么优于均方差损失函数
  • 原文地址:https://www.cnblogs.com/joe235/p/11229815.html
Copyright © 2011-2022 走看看