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的子页

  • 相关阅读:
    mouseover 有一个多次触发的问题
    2019牛客多校第一场 H.XOR
    luoguP4570 [BJWC2011]元素(线性基)
    线性基
    2019牛客多校第七场 E.Find the median
    2019牛客多校第七场
    2019牛客多校第五场
    支配树
    2019牛客多校第四场
    Codeforces 1195E OpenStreetMap(单调队列)
  • 原文地址:https://www.cnblogs.com/joe235/p/11229815.html
Copyright © 2011-2022 走看看