Flutter动态加载TabBar
发布日期:2021-06-28 19:09:56
浏览次数:2
分类:技术文章
本文共 4784 字,大约阅读时间需要 15 分钟。
效果图:
这里主要是用了TabController
这个controller
,而不是用的默认的DefaultTabController
,TabBar跟TabBarView必须关联起来,否则会报错。我这个上面的代码改得还有点多,因为还加入了listview,各位看官就暂时凑合着看吧。
源码贴出来
源码:
import 'dart:convert';import 'package:flutter/material.dart';import 'package:guoding/api/data_utils.dart';import 'package:guoding/model/topic_head_bean.dart';import 'package:guoding/resources/my_dimens.dart';import 'package:guoding/resources/mycolor_resources.dart';import 'package:guoding/routers/application.dart';import 'package:guoding/ui/home/top/topic_list_page.dart';import 'package:guoding/widgets/my_tab_indicator.dart';class MoreTopicPage extends StatefulWidget { @override StatecreateState() { return MoreTopicPageState(); }}class MoreTopicPageState extends State with TickerProviderStateMixin { bool hasTopLoad = false; List mTabs = new List(); TabController _tabController; int _selectedIndex; @override void initState() { super.initState(); _tabController = new TabController(length: mTabs.length, vsync: this); _tabController.addListener(() { setState(() => _selectedIndex = _tabController.index); print("liucheng-> ${_tabController.indexIsChanging}"); }); getTopicHorizatalData(); } @override void dispose() { super.dispose(); _tabController.dispose(); } @override Widget build(BuildContext context) { return new Scaffold( body: SafeArea( top: true, child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( onTap: () { Application.router.pop(context); }, child: Icon( Icons.arrow_back_ios, size: 20, color: MyColorRes.tvMainSelectColor, ), ), Text( '话题列表', style: TextStyle( fontSize: 20, color: MyColorRes.tvMainSelectColor), ), Icon( Icons.search, size: 30, color: MyColorRes.tvMainSelectColor, ), ], ), height: MyDimenRes.dp_title_height, margin: EdgeInsets.only( left: MyDimenRes.dp_base_left, right: MyDimenRes.dp_base_right, ), alignment: Alignment.bottomCenter, ), Divider(color: MyColorRes.divideLine,), _buildRoot() ], ), color: MyColorRes.bg_white, ), ), ); } Widget _buildRoot() { if (!hasTopLoad) { return Center( child: Text('加载中...'), ); } else { return Container( color: MyColorRes.bgTagColor, height: MediaQuery.of(context).size.height-100, child: Column( children: [ Container( height: 46, child: TabBar( indicatorColor: MyColorRes.primaryColor, labelColor: MyColorRes.tvMainSelectColor, unselectedLabelColor: MyColorRes.tvMainUnSelectColor, unselectedLabelStyle: TextStyle(fontSize: 15), labelStyle: TextStyle(fontSize: 17), isScrollable: true, indicator: MyUnderlineTabIndicator(borderSide: BorderSide(width: 2.0, color: MyColorRes.primaryColor)), controller: _tabController, tabs: mTabs.map((value) { return Text(value.name); }).toList(), ), alignment: Alignment.centerLeft, color: MyColorRes.bg_white, ), Expanded( flex: 1, child: TabBarView( children: _buildPages(), controller: _tabController, ), ), ], ), ); } } List _buildPages() { List pages = List(); for (int i = 0; i < mTabs.length; i++) { Widget page = TopicListPage(mTabs[i].flId); pages.add(page); } return pages; } void getTopicHorizatalData() async { DataUtils.getTopicHorizatalists().then((value) { if (value != null) { var jsData = json.decode(value); int status = jsData['status']; var data = jsData['data']; TopicHeadBean headBean = TopicHeadBean.fromJson(jsonDecode(value)); print('${headBean.data.lists}'); mTabs.addAll(headBean.data.lists); if (mounted) { } setState(() { hasTopLoad = true; _tabController = new TabController(length: mTabs.length, vsync: this); }); } }).catchError((e) { print('eee getTopicHorizatalData $e'); }); }}
大神轻喷,本文参考掘金大神:
更多资源请访问:
欢迎关注「蛇崽网盘教程资源」公众号 ,在微信后台回复「领取资源」,获取IT资源200G干货大全。
在微信后台回复「130个小程序」,即可免费领取享有导入就能跑的微信小程序
在微信后台回复「Flutter移动电商」,即可免费领取Flutter移动电商系列全套
转载地址:https://blog.csdn.net/xudailong_blog/article/details/98967330 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月18日 06时43分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android面试回忆录:在字节跳动我是如何当面试官的,面试心得体会
2019-04-29
android面试题!看懂这份Android面经大厂真不是问题!不吃透都对不起自己
2019-04-29
apk开发学习!Android开发者面试如何系统复习?已拿offer入职
2019-04-29
Android技术篇!只需一篇文章吃透Android多线程技术,成功定级腾讯T3-2
2019-04-29
android模拟器!记一次字节跳动Android社招面试,成功拿下大厂offer
2019-04-29
android视频直播开发!阿里P8面试官都说太详细了,赶快收藏备战金九银十!
2019-04-29
android视频编辑sdk!深入浅出Android性能调优,含泪整理面经
2019-04-29
android设计!Android事件分发机制收藏这一篇就够了,重难点整理
2019-04-29
android语言!搞懂开源框架设计思想真的这么重要吗?3面直接拿到offer
2019-04-29
android课程表!大厂offer手到擒来,满满干货指导
2019-04-29
android网!2021中级Android开发面试解答,进阶学习资料!
2019-04-29
android自动化测试工具!为什么有人说Android开发不再吃香?建议收藏
2019-04-29
android系统架构五层!最详细的解释小白也能听懂,2年以上经验必看
2019-04-29
android线刷包!跟我一起手写EventBus吧,大厂内部资料
2019-04-29
android实战!百度、阿里、滴滴、新浪的面试心经总结,满满干货指导
2019-04-29
Android小技巧:一线互联网移动架构师NDK模块开发!含BATJM大厂
2019-04-29