前言
上篇我们聊了 Stack
及其子项精细化布局 Widget Positioned、Align、Center
的详细使用,这篇我们来聊聊一个非常实用但你可能不知道的 Widget IndexedStack
,我们不光要聊他的使用,还要聊聊怎么优化它,这是实践的经验希望可以分享给你。
看效果
先看看下面的效果一般是 App 的简单主页骨架,你知道他怎么实现的吗?
IndexedStack(索引栈布局)
上一篇我们聊 Stack
时,子项的显示层级会根据子项在 children
列表中的顺序排列,位置越靠后,显示越靠前。
而这篇我们要聊的 IndexedStack
则不会根据顺序来决定显示顺序,而是只会显示指定索引的子项 Widget。
小实验
为了验证上面的说法,我们来做一个小实验,如下代码你猜会显示什么颜色?
// 索引栈布局
IndexedStack(
// 居中对齐,可以看上篇各种对齐方式详解
alignment: Alignment.center,
// 这里设置索引是 0
index: 0,
children: [
// 黄色 300
Container(
width: 300,
height: 300,
color: Colors.orange,
),
// 红色 200
Container(
width: 200,
height: 200,
color: Colors.red,
),
// 蓝色 100
Container(
width: 100,
height: 100,
color: Colors.blue,
),
],
)
index:0 | index:1 | index:2 |
---|---|---|
![]() | ![]() | ![]() |
上面我们调整不同的 index
只显示出来了一个子项 Widget,如果我们把 IndexedStack
换成 Stack
则会显示成如下效果。
IndexedStack 源码
- alignment 对齐方式
- sizing 填充方式
- index 显示子项索引
- children 子项集合
本篇主要聊 index
和 children
,其他的 alignment、sizing
可以稍后转看专栏中 Stack 详解篇,我们开始看看源码吧!
我们可以看到 IndexedStack
其实就是 Stack
的子类,对齐方式和填充方式都是直接传递到父类的,所以我们这篇只关心 index
即可。
效果实现
主体内容
我们先开始主体部分的布局,这里使用 IndexedStack
,添加一个 currentIndex
来记录当前子项索引,当我们改变 currentIndex
值后刷新即可实现切换页面效果啦。
/// IndexedStack 页面
class IndexedStackPage extends StatefulWidget {
IndexedStackPage({Key? key}) : super(key: key);
@override
_IndexedStackPageState createState() => _IndexedStackPageState();
}
class _IndexedStackPageState extends State {
// 当前子项索引
int currentIndex = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(‘IndexedStack - ZeroFlutter’),
),
body: IndexedStack(
alignment: Alignment.center,
// 设置当前索引
index: currentIndex,
children: [
PageDetails(title: ‘首页’),
PageDetails(title: ‘消息’),
PageDetails(title: ‘我的’),
],
),
bottomNavigationBar: [下面聊到],
);
}
}
子项内容
这里我们简单使用一个 StatelessWidget
然后再脚手架中添加一个居中的 Text
用来显示一个页面 title
。
这里的
/// 页面详情
class PageDetails extends StatelessWidget {
const PageDetails({Key? key, required this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
// 这里的打印可以记录一下,后面会用到
print(‘PageDetails build title:$title’);
return Scaffold(
body: Center(
child: Text(title),
),
);
}
}
底部导航
我们使用 BottomNavigationBar
做个简单的底部切换的导航,之后会详细聊聊这个 Widget,记得关注我得专栏《Flutter Widgets》不光是简单介绍Widget,各种实用技法、源码解析、Widget 关系链梳理都会有。
Scaffold(
appBar:[…],
body: IndexedStack(),
// 底部导航栏
bottomNavigationBar: BottomNavigationBar(
// 当前索引和 IndexedStack 使用同一个变量
currentIndex: currentIndex,
// 导航子项集
items: [
// 导航子项
BottomNavigationBarItem(
// 图标
icon: Icon(Icons.home),
// 文字内容
label: ‘首页’,
),
BottomNavigationBarItem(
icon: Icon(Icons.message_rounded),
label: ‘消息’,
),
BottomNavigationBarItem(
icon: Icon(Icons.people),
label: ‘我的’,
),
],
onTap: (value) {
// 点击事件,用于改变当前索引,然后刷新
currentIndex = value;
setState(() {});
},
),
)
效果展示
这样我们就实现了展示的效果
精进优化
还记得我们上面在子项详情页打印的内容吗?再看一遍他
/// 页面详情
class PageDetails extends StatelessWidget {
const PageDetails({Key? key, required this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
// 这里的打印可以记录一下,后面会用到
print(‘PageDetails build title:$title’);
return Scaffold(
body: Center(
child: Text(title),
),
);
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/25cd13f77cc57521daee429a5541a3e9.jpeg)
文末
面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
准备充分的面试,完全是浪费时间,更是对自己的不负责!
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊