上一篇: Flutter 实现钉钉消息列表效果(一)
pubspec.yaml 依赖
flutter_screenutil: ^2.3.0 # 屏幕适配
flutter_svg: ^0.18.0 # svg 图片加载
nine_grid_view: ^1.0.5 # 显示九宫格头像(QQ头像、微信头像 ....)
实现效果如图
创建 DTMessageScreen
构建 AppBar
使用 Flutter 原生的 AppBar 进行对应属性设置
AppBar buildAppBar(BuildContext context) {
return AppBar(
automaticallyImplyLeading: false,
title: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
GestureDetector(
child: CircleAvatar(
backgroundColor: kPrimaryColor,
radius: kSize40,
child: Text(
"江景",
style: TextStyle(color: Colors.white),
),
),
onTap: () {
Scaffold.of(context).openDrawer();
},
),
Padding(
padding: EdgeInsets.only(left: kSize24),
child: Text(
"未连接",
style: TextStyle(color: kColor33, fontSize: kSize30),
),
)
],
),
);
}
构建搜索输入框 Widget
- 创建 DTMessageSearchDecoration
- 自定义设置视图,使用 Container, 设置上 decoration
- 没有使用 TextFiled,原因是想点击之后跳转到另外一个界面 (TODO:)
```dart
class DTMessageSearchDecoration extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
height: kSize70,
margin: EdgeInsets.symmetric(horizontal: kSize36),
decoration: BoxDecoration(
color: kColorECEDED, borderRadius: BorderRadius.circular(kSize35)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children:
-
实现日历 + 待办 + DING Widget
- 创建 DTMessageTopQuick Widget
- 使用 Column + Row 实现
-
封装子组件 DTTopQuickItem,每个组件样式都是一样的,内容不一样,可以根据数据去渲染实现不同的 Item
<br />![](https://gitee.com/shizidada/moose-resource/raw/master/blog/image-20201211093407909.png#alt=)
```dart
class DTMessageTopQuick extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(vertical: kSize32),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
DTTopQuickItem(
iconPath: "assets/icons/icon_calendar.svg",
title: "日历",
showDivider: true),
DTTopQuickItem(
iconPath: "assets/icons/icon_backlog.svg",
title: "待办",
showDivider: true),
DTTopQuickItem(
iconPath: "assets/icons/icon_ding.svg", title: "DING"),
],
),
),
Divider(height: kSize1, color: kColorECEDED, indent: kSize36)
],
);
}
}
单个 DTTopQuickItem
- 自定义基础 StatelessWidget
根据不同参数
- iconPath 显示图片
- title 显示文本
- showDivider 是否需要显示后面竖杠
- 小红圆点,Container 组件设置 BoxDecoration
class DTTopQuickItem extends StatelessWidget {
final String iconPath;
final String title;
final bool showDivider;
DTTopQuickItem(
{@required this.iconPath,
@required this.title,
this.showDivider = false});
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
SvgPicture.asset(
iconPath,
width: kSize38,
height: kSize38,
color: kColor99,
),
Padding(
padding: EdgeInsets.only(left: kSize14),
child: Text(
title,
style: TextStyle(
color: kColor99,
),
),
),
Padding(
padding: EdgeInsets.only(left: kSize16),
child: Container(
width: kSize32,
height: kSize32,
alignment: Alignment.topCenter,
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(kSize20)),
child: Text(
"6",
style: TextStyle(color: Colors.white, fontSize: kSize24),
)),
),
showDivider
? Container(
width: kSize1,
height: kSize38,
margin: EdgeInsets.only(left: kSize56),
color: kColorECEDED,
)
: SizedBox(),
],
);
}
}
实现待办事项
- 创建 DTMessageTopMask Widget
- Column + Row 来添加不同的组件
- 添加的小组件都是不同的 svg 图片
class DTMessageTopMask extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(vertical: kSize32),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
width: kSize160,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SvgPicture.asset(
'assets/icons/icon_computer.svg',
width: kSize38,
height: kSize38,
),
Container(
width: kSize1,
height: kSize38,
margin: EdgeInsets.only(left: kSize36),
color: kColorECEDED,
)
],
),
),
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
SvgPicture.asset(
'assets/icons/icon_at.svg',
width: kSize38,
color: Colors.orangeAccent,
),
SvgPicture.asset(
'assets/icons/icon_star.svg',
width: kSize38,
color: kColor99,
),
SvgPicture.asset(
'assets/icons/icon_timer.svg',
width: kSize38,
color: kColor99,
),
SvgPicture.asset(
'assets/icons/icon_red_packet.svg',
width: kSize38,
color: kColor99,
),
SvgPicture.asset(
'assets/icons/icon_list.svg',
width: kSize38,
color: kColor99,
),
],
),
),
GestureDetector(
child: Container(
width: kSize160,
alignment: Alignment.centerRight,
padding: EdgeInsets.only(right: kSize24),
child: SvgPicture.asset(
'assets/icons/icon_more.svg',
width: kSize38,
color: kColor99,
),
),
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: (BuildContext context) {
return DTMessageSetting();
}));
},
),
],
),
),
Divider(height: kSize1, color: kColorECEDED, indent: kSize36)
],
);
}
}
代码地址: https://gitee.com/shizidada/flutter_dingtalk/blob/master/lib/ui/screens/message/message_screen.dart