Flutter动态加载TabBar

我会带着你远行 2021-06-06 15:28 1291阅读 0赞

效果图:

在这里插入图片描述

这里主要是用了TabController这个controller,而不是用的默认的DefaultTabController,TabBar跟TabBarView必须关联起来,否则会报错。我这个上面的代码改得还有点多,因为还加入了listview,各位看官就暂时凑合着看吧。

源码贴出来

源码:

  1. import 'dart:convert';
  2. import 'package:flutter/material.dart';
  3. import 'package:guoding/api/data_utils.dart';
  4. import 'package:guoding/model/topic_head_bean.dart';
  5. import 'package:guoding/resources/my_dimens.dart';
  6. import 'package:guoding/resources/mycolor_resources.dart';
  7. import 'package:guoding/routers/application.dart';
  8. import 'package:guoding/ui/home/top/topic_list_page.dart';
  9. import 'package:guoding/widgets/my_tab_indicator.dart';
  10. class MoreTopicPage extends StatefulWidget {
  11. @override
  12. State<StatefulWidget> createState() {
  13. return MoreTopicPageState();
  14. }
  15. }
  16. class MoreTopicPageState extends State<MoreTopicPage>
  17. with TickerProviderStateMixin {
  18. bool hasTopLoad = false;
  19. List<TopicHeadLists> mTabs = new List();
  20. TabController _tabController;
  21. int _selectedIndex;
  22. @override
  23. void initState() {
  24. super.initState();
  25. _tabController = new TabController(length: mTabs.length, vsync: this);
  26. _tabController.addListener(() {
  27. setState(() => _selectedIndex = _tabController.index);
  28. print("liucheng-> ${_tabController.indexIsChanging}");
  29. });
  30. getTopicHorizatalData();
  31. }
  32. @override
  33. void dispose() {
  34. super.dispose();
  35. _tabController.dispose();
  36. }
  37. @override
  38. Widget build(BuildContext context) {
  39. return new Scaffold(
  40. body: SafeArea(
  41. top: true,
  42. child: Container(
  43. child: Column(
  44. crossAxisAlignment: CrossAxisAlignment.center,
  45. children: <Widget>[
  46. Container(
  47. child: Row(
  48. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  49. children: <Widget>[
  50. GestureDetector(
  51. onTap: () {
  52. Application.router.pop(context);
  53. },
  54. child: Icon(
  55. Icons.arrow_back_ios,
  56. size: 20,
  57. color: MyColorRes.tvMainSelectColor,
  58. ),
  59. ),
  60. Text(
  61. '话题列表',
  62. style: TextStyle(
  63. fontSize: 20, color: MyColorRes.tvMainSelectColor),
  64. ),
  65. Icon(
  66. Icons.search,
  67. size: 30,
  68. color: MyColorRes.tvMainSelectColor,
  69. ),
  70. ],
  71. ),
  72. height: MyDimenRes.dp_title_height,
  73. margin: EdgeInsets.only(
  74. left: MyDimenRes.dp_base_left,
  75. right: MyDimenRes.dp_base_right,
  76. ),
  77. alignment: Alignment.bottomCenter,
  78. ),
  79. Divider(color: MyColorRes.divideLine,),
  80. _buildRoot()
  81. ],
  82. ),
  83. color: MyColorRes.bg_white,
  84. ),
  85. ),
  86. );
  87. }
  88. Widget _buildRoot() {
  89. if (!hasTopLoad) {
  90. return Center(
  91. child: Text('加载中...'),
  92. );
  93. } else {
  94. return Container(
  95. color: MyColorRes.bgTagColor,
  96. height: MediaQuery.of(context).size.height-100,
  97. child: Column(
  98. children: <Widget>[
  99. Container(
  100. height: 46,
  101. child: TabBar(
  102. indicatorColor: MyColorRes.primaryColor,
  103. labelColor: MyColorRes.tvMainSelectColor,
  104. unselectedLabelColor: MyColorRes.tvMainUnSelectColor,
  105. unselectedLabelStyle: TextStyle(fontSize: 15),
  106. labelStyle: TextStyle(fontSize: 17),
  107. isScrollable: true,
  108. indicator: MyUnderlineTabIndicator(borderSide: BorderSide(width: 2.0, color: MyColorRes.primaryColor)),
  109. controller: _tabController,
  110. tabs: mTabs.map((value) {
  111. return Text(value.name);
  112. }).toList(),
  113. ),
  114. alignment: Alignment.centerLeft,
  115. color: MyColorRes.bg_white,
  116. ),
  117. Expanded(
  118. flex: 1,
  119. child: TabBarView(
  120. children: _buildPages(),
  121. controller: _tabController,
  122. ),
  123. ),
  124. ],
  125. ),
  126. );
  127. }
  128. }
  129. List<Widget> _buildPages() {
  130. List<Widget> pages = List();
  131. for (int i = 0; i < mTabs.length; i++) {
  132. Widget page = TopicListPage(mTabs[i].flId);
  133. pages.add(page);
  134. }
  135. return pages;
  136. }
  137. void getTopicHorizatalData() async {
  138. DataUtils.getTopicHorizatalists().then((value) {
  139. if (value != null) {
  140. var jsData = json.decode(value);
  141. int status = jsData['status'];
  142. var data = jsData['data'];
  143. TopicHeadBean headBean = TopicHeadBean.fromJson(jsonDecode(value));
  144. print('${headBean.data.lists}');
  145. mTabs.addAll(headBean.data.lists);
  146. if (mounted) { }
  147. setState(() {
  148. hasTopLoad = true;
  149. _tabController = new TabController(length: mTabs.length, vsync: this);
  150. });
  151. }
  152. }).catchError((e) {
  153. print('eee getTopicHorizatalData $e');
  154. });
  155. }
  156. }

发表评论

表情:
评论列表 (有 0 条评论,1291人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态js

    通常,加载哪些js文件都是在开发阶段,预先写好在页面上。但某些场景下需要动态加载js脚本。 像以下这个例子,由于地图页面是个公用的页面,所以应该尽量保持干净和轻量。但好多地方

    相关 延迟动态

    延迟加载是你在使用的使用加载,而动态加载是在程序运行时才知道类的名字,然后加载类。延迟加载可以应用在动态和非动态的加载上。 动态加载的例子 String class

    相关 javascript动态

      将所有<script>标签放置在页面底部,紧靠关闭标签</body>的上方。此方法可以保证页面在脚本运行之前完成解析。 将脚本成组打包。页面的<scri

    相关 JS动态

    / loadJS:动态加载js文件---方法定义 js_path:动态加载js文件的路径 callback:加载完成后执行的回调函数 / functio