AppBar

作者: 放肆滴微笑 | 来源:发表于2019-12-16 22:26 被阅读0次
    AppBar({
        Key key,
        this.leading,//在标题前面显示的一个控件,在首页通常显示应用的 logo;在其他界面通常显示为返回按钮
        this.automaticallyImplyLeading = true,
        this.title,//Toolbar 中主要内容,通常显示为当前界面的标题文字
        this.actions,//一个 Widget 列表,代表 Toolbar 中所显示的菜单,对于常用的菜单,通常使用 IconButton 来表示;对于不常用的菜单通常使用 PopupMenuButton 来显示为三个点,点击后弹出二级菜单
        this.flexibleSpace,//一个显示在 AppBar 下方的控件,高度和 AppBar 高度一样,可以实现一些特殊的效果,该属性通常在 SliverAppBar 中使用
        this.bottom,//一个 AppBarBottomWidget 对象,通常是 TabBar。用来在 Toolbar 标题下面显示一个 Tab 导航栏
        this.elevation = 4.0,//纸墨设计中控件的 z 坐标顺序,默认值为 4,对于可滚动的 SliverAppBar,当 SliverAppBar 和内容同级的时候,该值为 0, 当内容滚动 SliverAppBar 变为 Toolbar 的时候,修改 elevation 的值
        this.backgroundColor,//APP bar 的颜色,默认值为 ThemeData.primaryColor。改值通常和下面的三个属性一起使用
        this.brightness,//App bar 的亮度,有白色和黑色两种主题,默认值为 ThemeData.primaryColorBrightness
        this.iconTheme,//App bar 上图标的颜色、透明度、和尺寸信息。默认值为 ThemeData.primaryIconTheme
        this.textTheme,//App bar 上的文字样式。默认值为 ThemeData.primaryTextTheme
        this.primary = true,
        this.centerTitle,//标题是否居中显示,默认值根据不同的操作系统,显示方式不一样,true居中 false居左
        this.titleSpacing = NavigationToolbar.kMiddleSpacing,
        this.toolbarOpacity = 1.0,
        this.bottomOpacity = 1.0,
        })
    

    隐藏返回按钮

    automaticallyImplyLeading: false,
    
    属性 描述
    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
    只有APPbar的写法
    Widget build(BuildContext context) {
        return new Scaffold(
          /// Line 1
          appBar: new AppBar(
            leading: IconButton(
                icon: Icon(Icons.close),
                onPressed: () {
                  Navigator.maybePop(context);
                }),
            automaticallyImplyLeading: true,
            elevation: 10,
            centerTitle: true,
            title: Text("主标题"),
            actions: <Widget>[
              IconButton(
                  icon: Icon(Icons.alarm),
                  onPressed: () {
                    print("alarm");
                  }),
              IconButton(
                  icon: Icon(Icons.home),
                  onPressed: () {
                    print("home");
                  }),
              PopupMenuButton(
                itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
                      PopupMenuItem<String>(
                        child: Text("热度"),
                        value: "hot",
                      ),
                      PopupMenuItem<String>(
                        child: Text("最新"),
                        value: "new",
                      ),
                    ],
                onSelected: (String action) {
                  switch (action) {
                    case "hot":
                      print("hot");
                      break;
                    case "new":
                      print("new");
                      break;
                  }
                },
                onCanceled: () {
                  print("onCanceled");
                },
              )
            ],
          ),
        );
    
    appbar + tabs

    appbar 增加tabs,需要再MaterialApp 和 Scaffold 控件中间增加DefaultTabController

    DefaultTabController({
        Key key,
        @required this.length,   // 有几个tabs
        this.initialIndex = 0,
        @required this.child,    // 一般写Scaffold 也就tabbar的父控件
      })
    

    在顶部没有AppBar的情况

    Widget build(BuildContext context) {
        return DefaultTabController(
            length: 2,
            child: Scaffold(
              appBar: AppBar(
                automaticallyImplyLeading: false,
                bottom: TabBar(
                  tabs: <Widget>[Tab(text: "热门"), Tab(text: "推荐")],
                ),
              ),
              body: TabBarView(
                children: <Widget>[
                  ListView(
                    children: <Widget>[
                      ListTile(title: Text("第一个tab")),
                      ListTile(title: Text("第一个tab")),
                      ListTile(title: Text("第一个tab"))
                    ],
                  ),
                  ListView(
                    children: <Widget>[
                      ListTile(title: Text("第二个tab")),
                      ListTile(title: Text("第二个tab")),
                      ListTile(title: Text("第二个tab"))
                    ],
                  )
                ],
              ),
            ));
      }
    

    顶部有APPbar ,这个时候会出现多了appbar的空间,这个时候不能写到bottom中,要写到title中


    image.png image.png
    Widget build(BuildContext context) {
        return DefaultTabController(
            length: 2,
            child: Scaffold(
              appBar: AppBar(
                automaticallyImplyLeading: false,
                title: Row(
                  children: <Widget>[
                    Expanded(
                      flex: 1,
                      child: TabBar(
                        tabs: <Widget>[Tab(text: "热门"), Tab(text: "推荐")],
                      ),
                    )
                  ],
                ),
              ),
              body: TabBarView(
                children: <Widget>[
                  ListView(
                    children: <Widget>[
                      ListTile(title: Text("第一个tab")),
                      ListTile(title: Text("第一个tab")),
                      ListTile(title: Text("第一个tab"))
                    ],
                  ),
                  ListView(
                    children: <Widget>[
                      ListTile(title: Text("第二个tab")),
                      ListTile(title: Text("第二个tab")),
                      ListTile(title: Text("第二个tab"))
                    ],
                  )
                ],
              ),
            ));
      }
    

    通过TabController 定义TabBar 来获取点击事件

    1、必须继承StatefulWidget
    2、必须实现SingleTickerProviderStateMixin
    3、页面初始化,实例化TabController
    4、页面结束,tabController.dispose()
    5、TabBar 指定controller
    6、TabBarView指定controller

    属性 描述
    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 清除监听器
    class TabBarControllerPage extends StatefulWidget {
      @override
      _TabBarControllerPageState createState() => _TabBarControllerPageState();
    }
    
    class _TabBarControllerPageState extends State<TabBarControllerPage>
        with SingleTickerProviderStateMixin {
      TabController _tabController;
    
      @override
      void dispose() {
        super.dispose();
        _tabController.dispose();
      }
    
      @override
      void initState() {
        super.initState();
        _tabController = new TabController(
          vsync: this,
          length: 2,
        );
        _tabController.addListener(() {
          if (_tabController.indexIsChanging) {
            // 因为回调2次,加上就回调1次
            print(_tabController.index);
            print(_tabController.previousIndex);
          }
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return DefaultTabController(
            length: 2,
            child: Scaffold(
              appBar: AppBar(
                bottom: TabBar(
                  controller: _tabController,
                  tabs: <Widget>[
                    Tab(
                      text: "text1",
                    ),
                    Tab(
                      text: "text1",
                    ),
                  ],
                ),
              ),
              body: TabBarView(
    //                        controller: _tabController,
                children: <Widget>[
                  Center(
                    child: Text("tabbar1"),
                  ),
                  Center(
                    child: Text("tabbar2"),
                  )
                ],
              ),
            ));
      }
    }
    
    

    相关文章

      网友评论

          本文标题:AppBar

          本文链接:https://www.haomeiwen.com/subject/zdpdnctx.html