Flutter实现微信朋友圈功能
作者:陈世流年
这篇文章主要为大家详细介绍了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; } }
到此朋友圈效果的实现就完成了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。