经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Flutter » 查看文章
详解Flutter TabLayout 布局用法
来源:jb51  时间:2019/7/22 11:23:45  对本文有异议

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

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

先上图

顶部TabBar

使用 flutter create xxxx 创建一个项目

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

First.dart

  1. import "package:flutter/material.dart";
  2. class First extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Material(
  6. color: Colors.green,
  7. );
  8. }
  9. }

Second.dart

  1. import "package:flutter/material.dart";
  2.  
  3. class Second extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return Material(
  7. color: Colors.red,
  8. );
  9. }
  10. }

Third.dart

  1. import "package:flutter/material.dart";
  2. class Third extends StatelessWidget {
  3. @override
  4. Widget build(BuildContext context) {
  5. return Material(
  6. color: Colors.yellow,
  7. );
  8. }
  9. }

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

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

  1. appBar: AppBar(
  2. title: Text(widget.title),
  3. bottom: TabBar(
  4. controller: tabController,
  5. tabs: <Tab>[
  6. new Tab(text: "问答"),
  7. new Tab(text: "分享"),
  8. new Tab(text: "博客"),
  9. ],
  10. ),
  11. ),

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

  1. // 引入 dart 文件
  2. import 'First.dart' as first;
  3. import 'Second.dart' as second;
  4. import 'Third.dart' as third;
  5. body: TabBarView(controller: tabController, children: <Widget>[
  6. new first.First(),
  7. new second.Second(),
  8. new third.Third(),
  9. ]),

完整代码:

  1. import 'package:flutter/material.dart';
  2.  
  3. import 'First.dart' as first;
  4. import 'Second.dart' as second;
  5. import 'Third.dart' as third;
  6.  
  7. void main() => runApp(MyApp());
  8.  
  9. class MyApp extends StatelessWidget {
  10. // This widget is the root of your application.
  11. @override
  12. Widget build(BuildContext context) {
  13. return MaterialApp(
  14. title: 'Flutter Demo',
  15. theme: ThemeData(
  16. primarySwatch: Colors.blue,
  17. ),
  18. home: MyHomePage(title: 'TabLayout Demo'),
  19. );
  20. }
  21. }
  22.  
  23. class MyHomePage extends StatefulWidget {
  24. MyHomePage({Key key, this.title}) : super(key: key);
  25.  
  26. final String title;
  27.  
  28. @override
  29. _MyHomePageState createState() => _MyHomePageState();
  30. }
  31.  
  32. class _MyHomePageState extends State<MyHomePage>
  33. with SingleTickerProviderStateMixin {
  34. TabController tabController;
  35.  
  36. @override
  37. void initState() {
  38. super.initState();
  39.  
  40. tabController = new TabController(length: 3, vsync: this);
  41. }
  42.  
  43. @override
  44. void dispose() {
  45. super.dispose();
  46. tabController.dispose();
  47. }
  48.  
  49. @override
  50. Widget build(BuildContext context) {
  51. return Scaffold(
  52. appBar: AppBar(
  53. title: Text(widget.title),
  54. bottom: TabBar(
  55. controller: tabController,
  56. tabs: <Tab>[
  57. new Tab(text: "问答"),
  58. new Tab(text: "分享"),
  59. new Tab(text: "博客"),
  60. ],
  61. ),
  62. ),
  63. body: TabBarView(controller: tabController, children: <Widget>[
  64. new first.First(),
  65. new second.Second(),
  66. new third.Third(),
  67. ]),
  68. );
  69. }
  70. }

底部TabBar

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

  1. Widget build(BuildContext context) {
  2. return Scaffold(
  3. appBar: AppBar(
  4. title: Text(widget.title),
  5. // bottom: TabBar(
  6. // controller: tabController,
  7. // tabs: <Tab>[
  8. // new Tab(text: "问答"),
  9. // new Tab(text: "分享"),
  10. // new Tab(text: "博客"),
  11. // ],
  12. // ),
  13. ),
  14. bottomNavigationBar: new Material(
  15. color: Colors.blue,
  16. child: TabBar(
  17. controller: tabController,
  18. indicatorColor: Colors.white,
  19. tabs: <Tab>[
  20. new Tab(text: "问答"),
  21. new Tab(text: "分享"),
  22. new Tab(text: "博客"),
  23. ],
  24. ),
  25. ),
  26. body: TabBarView(controller: tabController, children: <Widget>[
  27. new first.First(),
  28. new second.Second(),
  29. new third.Third(),
  30. ]),
  31. );
  32. }

这样的布局长下面这个样

参考

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

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号