Flutter 构建一个完整的聊天应用程序

“https://images.unsplash.com/photo-1463453091185-61582044d556?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1050&q=80”,

“https://images.unsplash.com/photo-1545130368-4c55e2418062?ixlib=rb-1.2.1&auto=format&fit=crop&w=926&q=80”,

“https://images.unsplash.com/photo-1438761681033-6461ffad8d80?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1050&q=80”,

“https://images.unsplash.com/photo-1470441623172-c47235e287ee?ixlib=rb-1.2.1&auto=format&fit=crop&w=1052&q=80”,

“https://images.unsplash.com/photo-1458662236860-b721a6735660?ixlib=rb-1.2.1&auto=format&fit=crop&w=1050&q=80”,

“https://images.unsplash.com/photo-1530268729831-4b0b9e170218?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1050&q=80”,

“https://images.unsplash.com/photo-1534308143481-c55f00be8bd7?ixlib=rb-1.2.1&auto=format&fit=crop&w=1188&q=80”,

“https://images.unsplash.com/photo-1525879000488-bff3b1c387cf?ixlib=rb-1.2.1&auto=format&fit=crop&w=634&q=80”,

“https://images.unsplash.com/photo-1535201344891-231e85e83c8a?ixlib=rb-1.2.1&auto=format&fit=crop&w=1050&q=80”

];

//Avatar widget

Widget avatarWidget(String urlImg, double radius) {

return Container(

width: radius,

height: radius,

decoration: BoxDecoration(

shape: BoxShape.circle,

image: DecorationImage(

fit: BoxFit.cover,

alignment: Alignment.topCenter,

image: NetworkImage(urlImg),

)),

);

}

//StoryButton widget

Widget storyButton(String urlImg, double radius) {

return InkWell(

onTap: () {},

child: Padding(

padding: const EdgeInsets.symmetric(horizontal: 8.0),

child: Container(

width: radius,

height: radius,

decoration: BoxDecoration(

shape: BoxShape.circle,

image: DecorationImage(

fit: BoxFit.cover,

alignment: Alignment.topCenter,

image: NetworkImage(urlImg),

)),

),

),

);

}

//List items widget

Widget listItem(

String urlImg, String userName, String, message, String hour) {

return InkWell(

onTap: () {},

child: Padding(

padding: EdgeInsets.symmetric(vertical: 8.0, horizontal: 4.0),

child: Container(

child: Row(

children: [

avatarWidget(urlImg, 60.0),

SizedBox(

width: 10.0,

),

Expanded(

child: Column(

mainAxisAlignment: MainAxisAlignment.start,

crossAxisAlignment: CrossAxisAlignment.start,

children: [

Text(

userName,

style: TextStyle(

color: Colors.white,

fontSize: 20.0,

fontWeight: FontWeight.bold,

),

),

Text(

message,

style: TextStyle(

color: Colors.white,

fontSize: 16.0,

fontWeight: FontWeight.w300,

),

),

],

),

),

Text(

hour,

style: TextStyle(

color: Colors.grey[50],

),

)

],

),

),

),

);

}

@override

Widget build(BuildContext context) {

return Scaffold(

backgroundColor: Colors.black,

body: Container(

child: Padding(

padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 35.0),

child: Column(

children: [

//First let’s create our menu bar

Row(

children: [

// for the first par i’ll need to create a custom widget for my avatar button

avatarWidget(_avatarUrl[0], 50.0),

SizedBox(

width: 10.0,

),

Expanded(

child: Text(

“Messages”,

style: TextStyle(

color: Colors.white,

fontSize: 20.0,

fontWeight: FontWeight.w700,

),

),

),

MaterialButton(

onPressed: () {},

elevation: 0.0,

padding: EdgeInsets.all(8.0),

color: Colors.blue,

shape: CircleBorder(),

child: Icon(Icons.edit, color: Colors.white),

)

],

),

//Now let’s create the search bar

SizedBox(

height: 20.0,

),

TextField(

cursorColor: Colors.white,

style: TextStyle(color: Colors.white),

decoration: InputDecoration(

prefixIcon: Icon(Icons.search, color: Colors.white),

hintText: “Search”,

contentPadding: EdgeInsets.only(left: 34.0),

filled: true,

fillColor: Colors.grey[800],

border: OutlineInputBorder(

borderRadius: BorderRadius.circular(50.0),

borderSide: BorderSide.none,

)),

),

SizedBox(

height: 20.0,

),

//Now it’s time to create our list view for storys

Container(

height: 60.0,

width: double.infinity,

child: ListView(

scrollDirection: Axis.horizontal,

children: [

//let’s now create our story widget, but before let’s add the add button

MaterialButton(

onPressed: () {},

elevation: 0.0,

padding: EdgeInsets.all(8.0),

color: Colors.grey[800],

shape: CircleBorder(),

child: Icon(Icons.add, color: Colors.grey[300]),

),

//Now let’s create our storybutton widget

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
外链图片转存中…(img-syW3jUkl-1715516612896)]

[外链图片转存中…(img-skkPVnTD-1715516612897)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值