详解Flutter TabLayout 布局用法

 更新时间:2019年07月22日 09:52:51   投稿:mrr  
Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。这篇文章主要介绍了Flutter TabLayout 布局用法,需要的朋友可以参考下

Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。

本文重点给大家介绍Flutter TabLayout 布局用法,具体内容如下所示:

先上图

顶部TabBar

使用 flutter create xxxx 创建一个项目

打开项目文件夹,在 lib 目录里创建三个 dart 文件,内容分别如下

First.dart

import "package:flutter/material.dart";
class First extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 return Material(
  color: Colors.green,
 );
 }
}

Second.dart

import "package:flutter/material.dart";

class Second extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 return Material(
  color: Colors.red,
 );
 }
}

Third.dart

import "package:flutter/material.dart";
class Third extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 return Material(
  color: Colors.yellow,
 );
 }
}

修改 main.dart 文件内容,TabLayout布局是个有状态的组件,所以创建组件时要继承 StatefulWidget 类

动图中的 TabBar 是在 Scaffold 中的 appBar 中定义的,也就是说 tabbar 是 appBar的一部分

appBar: AppBar(
 title: Text(widget.title),
 bottom: TabBar(
 controller: tabController,
 tabs: <Tab>[
  new Tab(text: "问答"),
  new Tab(text: "分享"),
  new Tab(text: "博客"),
 ],
 ),
),

每个 tabbar 对应的视图是在 body 里定义的,按照顺序初始化好即可

// 引入 dart 文件
import 'First.dart' as first;
import 'Second.dart' as second;
import 'Third.dart' as third;
body: TabBarView(controller: tabController, children: <Widget>[
 new first.First(),
 new second.Second(),
 new third.Third(),
]),

完整代码:

import 'package:flutter/material.dart';

import 'First.dart' as first;
import 'Second.dart' as second;
import 'Third.dart' as third;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
 // This widget is the root of your application.
 @override
 Widget build(BuildContext context) {
 return MaterialApp(
  title: 'Flutter Demo',
  theme: ThemeData(
  primarySwatch: Colors.blue,
  ),
  home: MyHomePage(title: 'TabLayout Demo'),
 );
 }
}

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

 final String title;

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

class _MyHomePageState extends State<MyHomePage>
 with SingleTickerProviderStateMixin {
 TabController tabController;

 @override
 void initState() {
 super.initState();

 tabController = new TabController(length: 3, vsync: this);
 }

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

 @override
 Widget build(BuildContext context) {
 return Scaffold(
  appBar: AppBar(
  title: Text(widget.title),
  bottom: TabBar(
   controller: tabController,
   tabs: <Tab>[
   new Tab(text: "问答"),
   new Tab(text: "分享"),
   new Tab(text: "博客"),
   ],
  ),
  ),
  body: TabBarView(controller: tabController, children: <Widget>[
  new first.First(),
  new second.Second(),
  new third.Third(),
  ]),
 );
 }
}

底部TabBar

上面定义的是顶部的tabbar,很多app的布局都是底部有见个tabbar,其实底部的定义方法就是将 appBar 属性中的 bottom 给注释掉,然后在跟 appBar 同级的位置定义一个 bottomNavigationBar 属性,其 child 就是 TabBar 组件,tabbar的视图跟上面定义方法是一样的,代码如下

Widget build(BuildContext context) {
 return Scaffold(
 appBar: AppBar(
  title: Text(widget.title),
//  bottom: TabBar(
//   controller: tabController,
//   tabs: <Tab>[
//   new Tab(text: "问答"),
//   new Tab(text: "分享"),
//   new Tab(text: "博客"),
//   ],
//  ),
 ),
 bottomNavigationBar: new Material(
  color: Colors.blue,
  child: TabBar(
  controller: tabController,
  indicatorColor: Colors.white,
  tabs: <Tab>[
   new Tab(text: "问答"),
   new Tab(text: "分享"),
   new Tab(text: "博客"),
  ],
  ),
 ),
 body: TabBarView(controller: tabController, children: <Widget>[
  new first.First(),
  new second.Second(),
  new third.Third(),
 ]),
 );
}

这样的布局长下面这个样

参考

https://www.youtube.com/watch?v=3N27mjoBK2k

总结

以上所述是小编给大家介绍的ter TabLayout 布局用法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • java OpenTelemetry日志体系及缺陷解决方案

    java OpenTelemetry日志体系及缺陷解决方案

    这篇文章主要为大家介绍了java OpenTelemetry日志体系及缺陷解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • FreeSWITCH跨NAT部署配置详解

    FreeSWITCH跨NAT部署配置详解

    这篇文章主要为大家介绍了FreeSWITCH跨NAT部署配置详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java利用endorsed如何覆盖jdk提供的类详解

    Java利用endorsed如何覆盖jdk提供的类详解

    这篇文章主要给大家介绍了关于Java利用endorsed如何覆盖jdk提供的类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • 在maven工程里运行java main方法

    在maven工程里运行java main方法

    这篇文章主要介绍了在maven工程里运行java main方法,需要的朋友可以参考下
    2014-04-04
  • 解读easyexcel中的常用注解

    解读easyexcel中的常用注解

    这篇文章主要介绍了关于easyexcel中的常用注解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java设计模式之java命令模式详解

    Java设计模式之java命令模式详解

    这篇文章主要介绍了Java设计模式编程中命令模式的使用,在一些处理请求响应的场合经常可以用到命令模式的编程思路,需要的朋友可以参考下
    2021-09-09
  • SpringBoot2零基础到精通之profile功能与自定义starter

    SpringBoot2零基础到精通之profile功能与自定义starter

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇让我们一起学习profile功能与自定义starter
    2022-03-03
  • Java设计模式系列之深入浅出单例模式

    Java设计模式系列之深入浅出单例模式

    设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式,下面这篇文章主要给大家介绍了关于Java设计模式系列之深入浅出单例模式的相关资料,需要的朋友可以参考下
    2021-09-09
  • Spring Boot 中实现跨域的多种方式小结

    Spring Boot 中实现跨域的多种方式小结

    Spring Boot提供了多种方式来实现跨域请求,开发者可以根据具体需求选择适合的方法,在配置时,要确保不仅考虑安全性,还要兼顾应用的灵活性和性能,本文给大家介绍Spring Boot 中实现跨域的多种方式,感兴趣的朋友一起看看吧
    2024-01-01
  • idea中同一SpringBoot项目多端口启动

    idea中同一SpringBoot项目多端口启动

    本文主要介绍了idea中同一SpringBoot项目多端口启动,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论