上一篇: 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 />```dartclass DTMessageTopQuick extends StatelessWidget {@overrideWidget 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});@overrideWidget 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 {@overrideWidget 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
