Flutter实现微信朋友圈功能
作者:陈世流年 发布时间:2022-10-02 00:28:15
标签:Flutter,微信,朋友圈
本文实例为大家分享了Flutter实现微信朋友圈功能的具体代码,供大家参考,具体内容如下
今天给大家实现一下微信朋友圈的效果,下面是效果图
下面还是老样子,还是以代码的方式进行讲解
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:nursery_school_gardener/view/main/dynamic/FriendView/FriendCell.dart';
class Dynamic extends StatefulWidget {
@override
_DynamicState createState() => _DynamicState();
}
class _DynamicState extends State<Dynamic> {
// 朋友圈信息数据
List<Result> cachesData;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return CustomScaffold(
contentWidget: Expanded(
flex: 1,
child: ListView.builder(// 朋友圈列表
itemBuilder: (BuildContext context, int index) {
// 每一条的朋友圈
return FriendCell(
result: cachesData[index],//将数据传入每一条列表中
);
},
itemCount: cachesData.length(),
),
),
);
}
}
上面就是列表,下面是列表中的每一个样式
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:nursery_school_gardener/util/ColorUtils.dart';
class FriendCell extends StatefulWidget {
// 上一页传过来的数据
Result result;
FriendCell({this.result, Key key}) : super(key: key);
@override
_FriendCellState createState() => _FriendCellState();
}
class _FriendCellState extends State<FriendCell> {
TextEditingController editingController = new TextEditingController();
// 照片展示样式,1张、2|4张、或者其他
Widget makePictureCount(List<KgPhotosList> pics) {
if (pics.length == 1) {
return GestureDetector(
onTap: () {
//点击图片
},
child: Container(
margin: EdgeInsets.fromLTRB(0, 10, 50, 10),
width: MediaQuery.of(context).size.width - 164,
height: (MediaQuery.of(context).size.width - 164) / 2,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("images/hsf2.jpg"),//展示的图片根据需求展示不同类型
fit: BoxFit.cover,
),
borderRadius: BorderRadius.circular(8),
),
),
);
} else if (pics.length == 4 || pics.length == 2) {
return Container(
margin: EdgeInsets.fromLTRB(0, 10, 0, 10),
child: Wrap(
spacing: 5,
runSpacing: 5,
alignment: WrapAlignment.start,
children: pics
.map(
(p) => GestureDetector(
onTap: () {
//点击图片
},
child: Container(
width: (MediaQuery.of(context).size.width - 164) / 2.2,
height: (MediaQuery.of(context).size.width - 164) / 2.2,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("images/hsf2.jpg"),//展示的图片根据需求展示不同类型
fit: BoxFit.cover,
),
borderRadius: BorderRadius.circular(8),
),
),
),
)
.toList(),
),
);
} else if (pics.length == 3 || pics.length > 4) {
return Container(
margin: EdgeInsets.fromLTRB(0, 10, 0, 10),
child: Wrap(
spacing: 5,
runSpacing: 5,
alignment: WrapAlignment.start,
children: pics
.map(
(p) => GestureDetector(
onTap: () {
//点击图片
},
child: Container(
width: (MediaQuery.of(context).size.width - 164) / 3,
height: (MediaQuery.of(context).size.width - 164) / 3,
decoration: BoxDecoration(
image: DecorationImage(
image:AssetImage("images/hsf2.jpg"),//展示的图片根据需求展示
fit: BoxFit.cover,
),
borderRadius: BorderRadius.circular(8),
),
),
),
)
.toList(),
),
);
} else {
return Container();
}
}
bool _isShow = true;
@override
Widget build(BuildContext context) {
bool deleteStatus = widget.result.addTeacher !=
Variable.share().loginData.result.userInfo.id;
return Container(
margin: new EdgeInsets.only(left: 12, right: 12, bottom: 12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: ColorUtils.WHITE,
boxShadow: [
BoxShadow(
color: ColorUtils.MAIN_BG, blurRadius: 10.0, spreadRadius: 1.0),
],
),
child: Stack(
children: [
Container(
child: Column(
children: <Widget>[
Flex(
direction: Axis.horizontal,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
//头像
Container(
width: 40,
height: 40,
margin: EdgeInsets.fromLTRB(15, 20, 15, 0),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("images/hsf2.jpg"),//用户头像
fit: BoxFit.cover,
),
borderRadius: BorderRadius.circular(8),
),
),
Expanded(
child: Container(
margin: EdgeInsets.fromLTRB(0, 20, 60, 0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
//姓名
Text(
"姓名",
style: TextStyle(
fontSize: 17,
color: Color(0XFF4D6CAB),
fontWeight: FontWeight.w500),
),
SizedBox(
height: 5,
),
//动态内容
Text(
"内容",
style: TextStyle(fontSize: 15),
),
SizedBox(
height: 5,
),
//发表的图片,上一页面传递来的属性
makePictureCount(widget.result.kgPhotosList),
],
),
),
),
],
),
Stack(
children: [
Flex(
direction: Axis.horizontal,
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
//发布的时间
Container(
margin: EdgeInsets.only(left: 70, bottom: 5),
child: Text(
"时间",
style: TextStyle(
fontSize: 12, color: Color(0XFFB2B2B2)),
),
),
//删除朋友圈按钮 deleteStatus代表是否是自己的朋友圈,是可以删除,
Offstage(
offstage: deleteStatus,
child: GestureDetector(
onTap: () {
CustomDialog.show(context,
title: "动态删除",
message: "你确定要删除当前动态吗?", callBack: (flag) {
if (flag) {
delteDynamic();
}
});
},
child: Container(
margin: EdgeInsets.only(left: 5, bottom: 5),
child: Text(
"删除",
style: TextStyle(
fontSize: 12,
color: ColorUtils.BLUE_NORMAL),
),
),
),
),
//管理员驳回按钮,看是否是管理员,可以通过和驳回朋友圈
Offstage(
offstage: ToolUtils.isContainsElement(
Variable.share().USER_DYNAMIC_TYPE),
child: GestureDetector(
onTap: () {
CustomDialog.show(
context,
title: "动态通过",
message: "你确定要通过当前动态吗?",
callBack: (flag) {
if (flag) {}
},
);
},
child: Container(
margin: EdgeInsets.only(left: 5, bottom: 5),
child: Text(
"通过",
style: TextStyle(
fontSize: 12,
color: ColorUtils.BLUE_NORMAL),
),
),
),
),
//管理员驳回按钮,看是否是管理员,可以通过和驳回朋友圈
Offstage(
offstage: ToolUtils.isContainsElement(
Variable.share().USER_DYNAMIC_TYPE),
child: GestureDetector(
onTap: () {
CustomInputDialog.show(context,
title: "动态驳回",
message: "你确定要驳回当前动态吗?", callBack: (flag) {
if (flag) {}
});
},
child: Container(
margin: EdgeInsets.only(left: 5, bottom: 5),
child: Text(
"驳回",
style: TextStyle(
fontSize: 12,
color: ColorUtils.BLUE_NORMAL),
),
),
),
),
],
),
Container(
margin: EdgeInsets.only(right: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Offstage(
offstage: _isShow,
child: AnimatedContainer(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
color: Color(0XFF4C5154)),
duration: Duration(milliseconds: 100),
width: 130,
height: 30,
child: Flex(
direction: Axis.horizontal,
children: <Widget>[
// 点赞模块
Expanded(
flex: 1,
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.favorite_border,
color: Colors.white,
size: 15,
),
SizedBox(
width: 5,
),
InkWell(
onTap: () {
// 点赞功能
setState(
() {
isShow();
addPraise();
},
);
},
child: Text(
"赞",
style: TextStyle(
color: Colors.white,
fontSize: 12),
),
),
],
),
),
// 评论模块
Expanded(
flex: 1,
child: Row(
mainAxisAlignment:
MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.sms,
color: Colors.white,
size: 15,
),
SizedBox(
width: 5,
),
InkWell(
onTap: () {
setState(
() {
isShow();
addDiscuss("我是评论内容");
},
);
},
child: Text(
"评论",
style: TextStyle(
color: Colors.white,
fontSize: 12),
),
),
],
),
),
],
),
),
),
SizedBox(
width: 10,
),
InkWell(
onTap: () {
isShow();
},
child: Image.asset(
"images/button.png",
width: 22,
height: 18,
),
),
],
),
),
],
),
//评论模块
Offstage(
offstage:
widget.result.kgPraiseList.length == 0 ? true : false,
child: Container(
constraints: BoxConstraints(minWidth: double.infinity),
margin: EdgeInsets.fromLTRB(70, 10, 15, 0),
padding:
EdgeInsets.only(top: 5, bottom: 5, left: 10, right: 10),
//因为点赞和评论是两个控件,所以当他俩存在的时候需要设置对应的圆角,保证UI
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8),
topRight: Radius.circular(8),
bottomLeft: Radius.circular(
widget.result.kgDiscussList.length == 0 ? 8 : 0),
bottomRight: Radius.circular(
widget.result.kgDiscussList.length == 0 ? 8 : 0)),
color: Color(0XFFF3F3F5),
),
child: Wrap(
alignment: WrapAlignment.start,
runSpacing: 5,
spacing: 5,
children: likeView(widget.result.kgPraiseList.length)),
),
),
//点赞模块
Offstage(
offstage:
widget.result.kgDiscussList.length == 0 ? true : false,
child: Container(
constraints: BoxConstraints(minWidth: double.infinity),
margin: EdgeInsets.fromLTRB(70, 0, 15, 0),
padding:
EdgeInsets.only(top: 5, bottom: 5, left: 10, right: 10),
//因为点赞和评论是两个控件,所以当他俩存在的时候需要设置对应的圆角,保证UI
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(
widget.result.kgPraiseList.length == 0 ? 8 : 0),
topRight: Radius.circular(
widget.result.kgPraiseList.length == 0 ? 8 : 0),
bottomLeft: Radius.circular(8),
bottomRight: Radius.circular(8)),
color: Color(0XFFF3F3F5),
),
child: Wrap(
alignment: WrapAlignment.start,
runSpacing: 5,
spacing: 5,
children: talkView(widget.result.kgDiscussList.length)),
),
),
SizedBox(
height: 10,
),
],
),
),
Offstage(
offstage: true,
child: Container(
margin: new EdgeInsets.only(
left: MediaQuery.of(context).size.width - 50, top: 20),
child: Image.asset(
"images/ic_no_network.png",
width: 18,
height: 18,
),
),
),
],
),
);
}
// 点赞和评论模块是否显示
void isShow() {
setState(() {
_isShow = !_isShow;
});
}
/*
* 删除朋友圈
* */
void delteDynamic() {
// 删除朋友圈
}
/*
* 发布评论
* */
void addDiscuss(String discuss) {
// 发布评论
}
/*
* 点赞
* */
void addPraise() {
// 点赞
}
//点赞
List<Widget> likeView(int count) {
List<Widget> result = [];
// TODO: 这里不要删除,后期肯定会改回改版本,这个是展示所有点赞人的信息,因为项目需要这里注释了,只用下面的方式
/*
for (int i = 0; i < count; i++) {
var praise = widget.result.kgPraiseList[i];
result.add(
Container(
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
Icons.favorite_border,
size: 13,
color: Color(0XFF566B94),
),
SizedBox(width: 5),
Container(
child: Text(
ToolUtils.isEmptyOrNull(praise.praisePerson),
style: TextStyle(
color: Color(0XFF566B94),
fontSize: 15,
fontWeight: FontWeight.w500),
),
)
],
),
),
);
}
*/
// 点赞数量
if (widget.result.kgPraiseList.length > 0) {
result.add(
Container(
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
Icons.favorite,
size: 16,
color: Color(0XFF4D6CAB),
),
SizedBox(width: 5),
Container(
child: Text(
"${widget.result.kgPraiseList.length}人赞过",
style: TextStyle(
color: Color(0XFF4D6CAB),
fontSize: 14,
fontWeight: FontWeight.w500),
),
)
],
),
),
);
}
return result;
}
//评论
List<Widget> talkView(int count) {
List<Widget> result = [];
for (int i = 0; i < count; i++) {
var discuss = widget.result.kgDiscussList[i];
var rng = new Random();
result.add(
Container(
child: Flex(
direction: Axis.vertical,
children: [
Container(
child: Row(
children: <Widget>[
Expanded(
child: Text.rich(
TextSpan(
style: TextStyle(
fontSize: 15,
color: Color(0xFF333333),
),
children: [
TextSpan(
text: ToolUtils.isEmptyOrNull(
discuss.discussPerson) +
':',
style: TextStyle(
fontWeight: FontWeight.w500,
color: Color(0XFF4D6CAB),
),
),
TextSpan(
text: ToolUtils.isEmptyOrNull(
discuss.discussMessage)),
]),
textAlign: TextAlign.start,
),
),
],
),
),
Container(),
],
),
),
);
}
return result;
}
}
到此朋友圈效果的实现就完成了。
来源:https://blog.csdn.net/WangQingLei0307/article/details/119148798


猜你喜欢
- 记得在 MS Build 2020 大会上,C# 语言开发项目经理 Mads Torgersen 宣称 C# 9.0 将会随着 .NET 5
- Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化,动态初始化:指定长度,由系统给出初始化值静态初始化:给出初始化值,由系统
- 在最近的两个项目中,项目需求要求我们实现 /*登陆页面的内容能够随着键盘的弹出而被顶上去,避免键盘遮挡住登陆按钮*/ 这样的效果,宝宝心里苦
- 最近在开发即时通讯这个模块的时候使用到了自定义的相机,需求与微信一样,要求相机能长按和轻点,当时在网上找自定义相机的资源,很少,所以,我在这
- monitor概念管程,监视器。在操作系统中,存在着semaphore和mutex,即信号量和互斥量,使用基本的mutex进行开发时,需要小
- 改进思考正常实现流程应该为继承ClassLoader虚拟类,并重写其loadClass方法和findClass方法,并在loadClass方
- Java 表格数据导入word文档中个人觉得这个功能实在搞笑,没什么意义,没办法提了需求就要实现,(太好说话了把我)我的实现是再word中生
- 前言本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取、码率压缩、分辨率转换等功能;之前在网上浏览了一大圈Java使用F
- 前言这几天琢磨着开发个个人作品的时候,发现原来Unity3D官方没有提供圆锥体的创建功能,就自己做了个编辑器扩展。鉴于之前搜索Mesh编程的
- 本文实例讲述了Java数据结构之链表、栈、队列、树的实现方法。分享给大家供大家参考,具体如下:最近无意中翻到一本书,闲来无事写几行代码,实现
- 一、前言若使用本机存储来存放文件资源核心实现过程:上传文件,保存文件(本地磁盘)返回文件HTTP访问服务器路径给前端,进行效果展示二、储备服
- @RequestBody与post请求的关系@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的)
- Java StringWriter流的使用一、StringWriter流定义API说明:在字符串缓冲区中收集输出的字符流,可用于构造字符串,
- Java多线程下载网图案例此案例依赖——文件操作工具类(FileUtils)使用 apache 的commons-io包下的FileUtil
- 本文实例为大家分享了OpenCV+Qt实现图像处理操作的具体代码,供大家参考,具体内容如下一、目标Qt界面实现 雪花屏 高斯模糊 中值滤波
- 本文实例为大家分享了java验证码生成的具体代码,供大家参考,具体内容如下简单验证码java实现--servlet类生成 验证码img,并写
- 桥接模式概述桥接模式(Bridge Pattern)也称为桥梁模式、接口(Interfce)模式或柄体(Handle and Body)模式
- 虽然Android给我们提供了众多组件,但是使用起来都不是很方便,我们开发的APK都有自己的风格,如果使用了系统自带的组件,总是觉得和应用的
- 前言:在 Java 中,让线程休眠的方法有很多,这些方法大致可以分为两类,一类是设置时间,在一段时间后自动唤醒,而另一个类是提供了一对休眠和
- 一、POI的定义JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 200