zoukankan      html  css  js  c++  java
  • AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar

    一、Flutter AppBar 自定义顶部按钮图标、颜色
    leading   在标题前面显示的一个控件,在首页通常显示应用的 logo;在其他界面通常显示为返回按钮
    title  标题,通常显示为当前界面的标题文字,可以放组件
    actions  通常使用 IconButton 来表示,可以放按钮组
    bottom  通常放 tabBar,标题下面显示一个 Tab 导航栏
    backgroundColor  导航背景颜色
    iconTheme  图标样式
    textTheme  文字样式
    centerTitle  标题是否居中显示
     
     
     
    二、Flutter AppBar 中自定义 TabBar 实现顶部 Tab 切换
    tabs  显示的标签内容,一般使用 Tab 对象,也可以是其他的 Widget
    controller TabController 对象
    isScrollable  是否可滚动
    indicatorColor  指示器颜色
    indicatorWeight 指示器高度
    indicatorPadding  底部指示器的 Padding
    indicator  指示器 decoration,例如边框等
    indicatorSize  指示器大小计算方式,TabBarIndicatorSize.label 跟文字等宽,TabBarIndicatorSize.tab 跟每个 tab 等宽
    labelColor  选中 label 颜色
    labelStyle 选中 label 的 Style
    labelPadding  每个 label 的 padding 值
    unselectedLabelColor  未选中 label 颜色
    unselectedLabelStyle   未选中 label 的 Style
     
    案例代码
    import 'package:flutter/material.dart';

    class ClassIf extends StatelessWidget{
    @override
    Widget build(BuildContext context) {
    // TODO: implement build
    return DefaultTabController(
    length: 2,
    child: Scaffold(
    appBar: AppBar(
    title: Row( // 或者buttom
    children: <Widget>[
    Expanded(
    flex: 1,
    child: TabBar(
    tabs: <Widget>[
    Tab(text: '分类一'),
    Tab(text: '分类二')
    ],
    ),
    )
    ],
    ),
    ),
    body: TabBarView(
    children: <Widget>[
    ListView(
    children: <Widget>[
    Text('132'),
    Text('132'),
    Text('132'),
    ],
    ),
    ListView(
    children: <Widget>[
    Text('132'),
    Text('132'),
    Text('132'),
    ],
    )
    ],
    ),
    ),
    );
    }
    }

    三、Flutter AppBar 中自定义 TabBar 实现 Tabs 的另一种方法 带数据,带下拉更多的时候
       通过TabController 定义TabBar
          页面必须继承StatefulWidget
         页面必须实现SingleTickerProviderStateMixin

         页面初始化时,实例化TabController
         在TabBar组件中指定controller为我们实例化的TabController
         在TabBarView组件中指定controller为我们实例化的TabController

     主要是监听TabBar与TabBarView的交互。比如,我们可以在tab切换时加载不同数据;可以自定义切换动画等。

    参数详解
      animation 官方:一个动画,其值表示TabBar所选选项卡指示器的当前位置以及TabBar 和TabBarView的scrollOffsets。
      index 当前tab索引,//跳转后执行
      indexIsChanging 动画是时为true
      length tab总数
      offset 动画的值和索引之间的差异。偏移量必须在-1.0和1.0之间
      previousIndex 前tab索引,////跳转后执行


    方法详解 
      animateTo 从当前tab跳到目标tab并执行动画
      dispose 销毁
      addListener 添加监听
      noSuchMethod 当访问不存在的属性或方法时调用(不知道是什么鬼)
      notifyListeners 调用所有监听器
      removeListener 清除监听器

    import 'package:flutter/material.dart';
    class AppBardemoPage extends StatefulWidget {
    AppBardemoPage({Key key}) : super(key: key);

    _AppBardemoPageState createState() => _AppBardemoPageState();
    }

    class _AppBardemoPageState extends State<AppBardemoPage> with SingleTickerProviderStateMixin {
    TabController _tabController;

    @override void dispose() {
    _tabController.dispose();
    super.dispose();
    }

    void initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this, initialIndex: 0);
    _tabController.addListener(() {
    print(_tabController.index);
    });
      }

    @override Widget build(BuildContext context) {
    return new Scaffold(appBar: new AppBar(
    title: new Text('顶部 tab 切换'),
    bottom: new TabBar(tabs: <Widget>[
    new Tab(icon: new Icon(Icons.directions_bike),),
    new Tab(icon: new Icon(Icons.directions_boat),),
    new Tab(icon: new Icon(Icons.directions_bus),),
    ], controller: _tabController,),),
    body: new TabBarView(controller: _tabController,
    children: <Widget>[
    new Center(child: new Text('自行车')),
    new Center(child: new Text('船')),
    new Center(child: new Text('巴士')),
    ],),);
    }
    }


    自定义tabBar 不放在appBar里面 

    class TransactionRecord extends StatefulWidget{
    createState() => _TransactionRecord();
    }

    class _TransactionRecord extends State with SingleTickerProviderStateMixin{
    var _tabController;
    @override
    initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this, initialIndex: 0);
    _tabController.addListener(() {
    print(_tabController.index);
    });
    }
    dispose() {
    super.dispose();
    _tabController.dispose();
    }
    Widget build(BuildContext context) {
    Screen.init(context);
    // TODO: implement build
    return DefaultTabController(
    length: 3,
    child: Scaffold(
    body: Container(
    alignment: Alignment.centerLeft,
    color: ColorGather.colorBg(),
    child: Column(
    children: <Widget>[
    Container(
    height: 50, color: Colors.white,
    child: TabBar(
    labelPadding: EdgeInsets.all(0),
    controller: _tabController,
    tabs: <Widget>[
    Tab(child: Text('时间筛选', style: TextStyle(fontSize: Screen.width(28)))),
    Tab(child: Text('时间筛选', style: TextStyle(fontSize: Screen.width(28)))),
    Tab(child: Text('时间筛选', style: TextStyle(fontSize: Screen.width(28)))),
    ],
    onTap: (val) {},
    ),
    ),
    Expanded(
    child: TabBarView(
    controller: _tabController,
    children: <Widget>[
    Text('123'),
    Text('123'),
    Text('123'),
    ],
    ),
    )
    ],
    )
    )
    ),
    );
    }
    }

    // 不确定数量
    DefaultTabController(
    length: titleList.length,
    child:
    )
  • 相关阅读:
    图像的点运算----底层代码与Halcon库函数
    C#跨线程调用控件
    Halcon学习笔记——条形码的定位与识别
    简单实用angular.js购物车功能
    xampp与Hbuilder、phpstorm配置
    AJAX实现简单的注册页面异步请求
    querySelector系列方法相比 getElementsBy 系列方法有什么区别?
    用了那么久的函数,你知道函数是怎么调用的吗??
    JS eval()函数的一些见解
    5分钟让你掌握css3阴影、倒影、渐变小技巧!
  • 原文地址:https://www.cnblogs.com/zhaofeis/p/12341167.html
Copyright © 2011-2022 走看看