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 State
createState() {
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:flutter SmartRefresher+ListView组合,为listview添加headview和footerview
下一篇:Git强制覆盖本地代码

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月18日 06时43分56秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Android面试回忆录:2个月面试腾讯、B站、网易等11家公司的面经总结!3面直接拿到offer 2019-04-29
Android面试回忆录:在字节跳动我是如何当面试官的,面试心得体会 2019-04-29
Android面试总结,GitHub标星9K的Google官方MVP+Rxjava项目详解,算法太TM重要了 2019-04-29
android面试题!看懂这份Android面经大厂真不是问题!不吃透都对不起自己 2019-04-29
Android高级工程师面试实战,GitHub上标星13k的《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
com.mongodb.MongoSocketReadException: Prematurely reached end of stream 2019-04-29