源码地址:github.com/ding-zou/fl…git
🔥A flutter app which clones wechat! 这是一个仿照微信样式基于flutter实现的app,还在继续完善中,欢迎提意见github
包含了flutter中基本全部的组件,适合以此项目进行flutter学习。数组
Q:如何实现列表滚动而字母表不滚动微信
A:由于通信录列表是能够滚动的,因此咱们想到使用Stack
来把字符表放在固定位置而不会由于ListView滑动而滑动。markdown
Q:如何控制字母表滚到对应位置触发外部轮廓圆?app
A:首先咱们使用的是BoxDecoration
实现的外部轮廓,而后咱们须要一个标志来控制其轮廓的显示,其实咱们经过控制轮廓的颜色就行了,咱们定义了一个颜色,滚动到时经过setState
来改变颜色,就能够实现滚动是变化。ide
Q:如何肯定对应字母的对应ListView的位置?学习
A:咱们知道构建每个ListTile时它的高度都是同样的,咱们就能够经过计算来获得每一个字母在ListView中的位置。咱们模拟接收到数据,咱们用一个map保存对应字母对应所在的位置,好比字母a所在为110,而后a有10个通信录Item,那么b的位置就是a的位置加上10*每一个Item的高度。此外咱们每一个字母还有一行显示,因此咱们还要加上这行的高度。ui
Q:怎么经过TextField实现自定义搜索栏?spa
A:咱们经过设置TextField
的装饰属性decoration
,传入一个InputDecoration
控件,里面咱们能够设置不少属性来自定义显示。还不能知足你的状况的话能够本身在外层进行包装。
decoration: InputDecoration(
icon: Container(
padding: EdgeInsets.only(left: 10),
child: Icon(Icons.search,
size: 23, color: Colors.grey[400])),
contentPadding: EdgeInsets.fromLTRB(0, 0, 0, 13),
border: InputBorder.none,
hintText: widget.hint,
hintStyle: TextStyle(
fontSize: 15,
)),
复制代码
Q:如何实现这样的弹窗?
A:咱们能够经过官方提供的PopupMenuButton
来实现,能够经过如下这种方式构建
PopupMenuButton(
offset: Offset(0,70),
color: Color(0xff4c4c4c),
itemBuilder: (BuildContext context) {
return <PopupMenuItem<int>>[
/// 设置你的弹窗Item数组
PopupMenuItem(
child: _popupItem(0xe69e,0),
value: 0,
),
];
},
/// 设置按钮的Icon 是一个Widget类型的
icon: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border.fromBorderSide(BorderSide(
color: Colors.black87,
style: BorderStyle.solid))),
child: Icon(
Icons.add,
size: 19,
color: Colors.black87,
),
))
复制代码
Q:如何设置弹窗出现的位置?它遮住了其余控件怎么办?
A:咱们能够经过它的offset
属性传入一个Offset偏移量就行了
Q:怎么实现红点显示在图片上?
A:咱们能够经过万能的Stack
来实现,咱们能够用Container
包裹,设置一个较大的宽和高,而后里面放上图片,再经过Positioned
把小红点放在右上角
参见下面实现方式:
Container(
height: 43,
width: 43,
child: Stack(children: <Widget>[
Positioned(
left: 0,
bottom: 0,
child: ClipRRect(
borderRadius: BorderRadius.circular(4),
child: Image.network(
imgUrl
fit: BoxFit.cover,
height: 40,
width: 40,
))),
Positioned(
right: 0,
top: 0,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
border: Border.fromBorderSide(
BorderSide(width: 1, color: Colors.red[600]))),
child: Container(
color: Colors.red[600],
height: 6,
width: 6,
),
),
)
]),
)
复制代码
Q:flutter提供的*BottomNavigationBar
*怎么实现红点?
A:你可使用BottomNavigationBar
来使用上述方式构建红点,分别设置icon和activeIcon
首页
通信录页(通信录页字母表跳转)
发现页
个人页面
搜索页
聊天页