当前位置:   article > 正文

Flutter 之 TabBar & TabBarView_flutter tab text文字

flutter tab text文字

直接上图上代码,代码部分有注释,莫有的自己百度(留言也可以);

效果图.png

  1. class TestDemo extends StatefulWidget {
  2. @override
  3. State<StatefulWidget> createState() {
  4. return _TestDemoState();
  5. }
  6. }
  7. class _TestDemoState extends State<TestDemo>
  8. with SingleTickerProviderStateMixin {
  9. TabController mController;
  10. List<String> tabTitles;
  11. @override
  12. Widget build(BuildContext context) {
  13. return Scaffold(
  14. appBar: _appBarView(),
  15. body: _tabBarView(),
  16. );
  17. }
  18. @override
  19. void dispose() {
  20. super.dispose();
  21. mController.dispose();
  22. }
  23. @override
  24. void initState() {
  25. super.initState();
  26. tabTitles = [
  27. "tab1",
  28. "tab2",
  29. "tab3",
  30. "tab4",
  31. "tab5",
  32. "tab6",
  33. "tab7",
  34. "tab8",
  35. "tab9",
  36. ];
  37. mController = TabController(
  38. length: tabTitles.length,
  39. vsync: this,
  40. );
  41. }
  42. Widget _appBarView() {
  43. return AppBar(
  44. title: Text("TabBar & TabBarView",
  45. style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold)),
  46. elevation: 0,
  47. bottom: _tabBar(),
  48. );
  49. }
  50. Widget _tabBar() {
  51. return TabBar(
  52. //设置tab是否可水平滑动
  53. isScrollable: true,
  54. //控制器
  55. controller: mController,
  56. //设置tab文字得类型
  57. labelStyle: TextStyle(fontSize: 15, fontWeight: FontWeight.bold),
  58. //设置tab选中得颜色
  59. labelColor: Colors.black,
  60. //设置tab未选中得颜色
  61. unselectedLabelColor: Colors.black45,
  62. //设置自定义tab的指示器,CustomUnderlineTabIndicator
  63. //若不需要自定义,可直接通过
  64. //indicatorColor 设置指示器颜色
  65. //indicatorWight 设置指示器厚度
  66. //indicatorPadding
  67. //indicatorSize 设置指示器大小计算方式
  68. indicator: CustomUnderlineTabIndicator(
  69. strokeCap: StrokeCap.round,
  70. insets: EdgeInsets.only(left: 15, right: 15),
  71. borderSide: BorderSide(width: 4.0, color: Colors.red)),
  72. tabs: tabTitles.map((item) {
  73. return Tab(text: item);
  74. }).toList());
  75. }
  76. Widget _tabBarView() {
  77. return TabBarView(
  78. controller: mController,
  79. children: tabTitles.map((item) {
  80. return Container(
  81. color: _getColor(),
  82. child: Center(
  83. child: Text(item,
  84. style: TextStyle(
  85. fontSize: 18,
  86. fontWeight: FontWeight.bold,
  87. color: Colors.white)),
  88. ),
  89. );
  90. }).toList(),
  91. );
  92. }
  93. Color _getColor() {
  94. var random = new Random();
  95. int r = random.nextInt(255);
  96. int g = random.nextInt(255);
  97. int b = random.nextInt(255);
  98. print(r);
  99. print(g);
  100. print(b);
  101. return Color.fromARGB(255, r, g, b);
  102. }
  103. }

TabBarView

这里的children直接使用了Container显示效果,所以在切换的时候,并没有问题出现。但一般情况,我们都会为TabBarView的子类自定义一个Widget,并且会在这个Widget的 initState() 方法里面进行数据的初始化。这时候切换Tab,会发现界面又初始化了?~
(网传)Flutter中为了节约内存不会保存widget的状态,widget都是临时变量。所以,每次切换重修的时候,都会调用 initState() 方法

解决:

在对应的Widget里面的State类,继承AutomaticKeepAliveClientMixin抽象类,并且重写方法,返回true,强制widget不被销毁:

  1. @override
  2. bool get wantKeepAlive => true;

PS:widget在不显示也会强制保存在内存中,所以需要合理使用。

CustomUnderlineTabIndicator 自定义圆角指示器

最简单的,参考UnderlineTabIndicator(代码90行),对Ponit的画笔做了参数自定义。StrokeCap使用了.round的方式,就能实现。



作者:Grey_zbb
链接:https://www.jianshu.com/p/68fa1c725415
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/431811
推荐阅读
相关标签
  

闽ICP备14008679号