Flutter之AppBar的部分定制

本篇已同步到 个人博客 ,欢迎常来。

代码 最终预览效果如下:

AppBar定制-min.gif

一、定制Title

目标:App导航栏title换成需要切换条(iOS中叫Segment)
1、flutter提供的AppBar的title属性就是wigdet,所有我们可以直接把title设置为tabbar;
2、需要相应的页面来进行联动,所以需要关联SingleTickerProviderStateMixin, 且把tabbar的controller 和 TabBarView的controller设置为同一个controller

final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
class MyHomePage extends StatefulWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  TabController _controller;
  @override
  void initState() {
    super.initState();
    _controller = TabController(length: 3, vsync: this); //初始化方法
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        title: TabBar(
          controller: _controller,
          tabs: <Widget>[
            Tab(
              icon: Icon(Icons.directions_car),
            ),
            Tab(
              icon: Icon(Icons.directions_transit),
            ),
            Tab(
              icon: Icon(Icons.directions_bike),
            ),
          ],
        ),
      ),
      body: TabBarView(
        controller: _controller,
        children: <Widget>[
          HomePage(
            title: "设置11111",
          ),
          HomePage(
            title: "设置22222",
          ),
          HomePage(
            title: "设置33333",
          ),
        ],
      ),
    );
  }

HomePage代码

class HomePage extends StatelessWidget {
  final String title;
  final Widget child;

  HomePage({Key key, this.child, this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Text(title),
      ),
    );
  }
}

二、侧滑抽屉效果

1、方法一:系统自带(局限性,图片不能更改)
仅仅设置Scaffold的drawer就好

drawer: _buildDrawer(context),

2、方法二:Builder

leading: Builder(
          builder: (context) => IconButton(
                icon: new Icon(Icons.settings),
                onPressed: () => Scaffold.of(context).openDrawer(),
              ),
        ),

3、方法三:GlobalKey<ScaffoldState>


// 1.步奏一
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,// 2、步奏二
      drawer: _buildDrawer(context),
      leading: IconButton(
          icon: Icon(Icons.account_box),
          onPressed: () {
            // 3、步奏三
            _scaffoldKey.currentState.openDrawer();
          },
        ),
       );
    }

4、方法四:改变源码(不推荐)


    /// 到AppBar源码,修改的部分code
    Widget leading = widget.leading;
    if (/*leading == null && */widget.automaticallyImplyLeading) {
      if (hasDrawer) {
        leading = IconButton(
          icon: /*const Icon(Icons.menu)*/ leading ?? Icon(Icons.home), // 如果leading指定了widget那么
          onPressed: _handleDrawerButton,
          tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
        );
      } else {
        if (canPop)
          leading = useCloseButton ? const CloseButton() : const BackButton();
      }
    }
    if (leading != null) {
      leading = ConstrainedBox(
        constraints: const BoxConstraints.tightFor(width: _kLeadingWidth),
        child: leading,
      );
    }

附录:代码汇总

Widget _buildDrawer(BuildContext context) {
    return Drawer(
      child: ListView(
        dragStartBehavior: DragStartBehavior.down,
        children: <Widget>[
          // 1. 简单的头部
          // const DrawerHeader(
          //   child: Center(
          //     child: Text('我是侧边栏'),
          //   ),
          // ),
          // 2.复杂的用户头部
          // UserAccountsDrawerHeader 不能用const来修饰
          UserAccountsDrawerHeader(
            accountEmail: Text(
              '13456@qq.com',
              style: TextStyle(color: Colors.black),
            ),
            accountName: Text(
              'HandsomeMen',
              style: TextStyle(color: Colors.black),
            ),
            currentAccountPicture: GestureDetector(
              onTap: () {
                print('current user');
              },
              child: CircleAvatar(
                backgroundImage: NetworkImage(
                    'http://m.360buyimg.com/pop/jfs/t25441/342/232745157/35324/69b79175/5b696c57N739592b8.jpg'),
              ),
            ),
            otherAccountsPictures: <Widget>[
              GestureDetector(
                onTap: () => print('点击了otherAccountsPictures 111111'),
                child: CircleAvatar(
                  backgroundImage: NetworkImage(
                      'https://pic.qqtn.com/up/2018-9/15367146917869444.jpg'),
                ),
              ),
              GestureDetector(
                onTap: () => print('点击了otherAccountsPictures 222222'),
                child: CircleAvatar(
                  backgroundImage: NetworkImage(
                      'http://www.gx8899.com/uploads/allimg/160902/3-160Z2104544.jpg'),
                ),
              ),
            ],
            decoration: BoxDecoration(
              //装饰器提供背景图片
              image: DecorationImage(
                  fit: BoxFit.fill,
                  //使用网络图片怎么有问题
                  image: NetworkImage(
                      'http://www.86ps.com/UpLoadFiles/jpg/2011-10/2011100912585215837.jpg')
                  // image: new ExactAssetImage('images/bg.jpg'),
                  ),
            ),
          ),

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