第三篇-用Flutter手撸一个抖音国内版,看看有多炫

前言

前一篇已经开发了大部分框架,包含视频上下滑动播放,这次将上次未完成的数据显示友好显示,以及底部音乐走马灯特效,另外优化了加载数据的bug,在dart语言里 & 会自动变成& 另外优化了代码逻辑.

本系列会持续更新,将各个模块及功能持续完善,地址:https://github.com/WangCharlie/douyin 欢迎各位fork 和star. 谢谢!

运行效果如下图:

第三篇-用Flutter手撸一个抖音国内版,看看有多炫

修复Dart语言 URL显示错误.

经过反复则是,发现url 在tostring()方法执行后 会把原来的 &替换成&, 所以暂时只能这样替换了 url = url.replaceAll(‘&’, ‘&’)来修复问题了

go;gutter:true; getVideos(BillboardData v) async { try { var url = v.link.split("/")[5]; var response = await http.get( api.video + url + "&dytk", headers: api.headers, ); VideoData videoData = VideoData.fromJson(jsonDecode(response.body)); //获取无水印的视频地址 api.getRedirects(videoData.itemList[0].video.playaddr.uri).then((url) => { url = url.replaceAll('&', '&'), if (url != '') { videos.add(VideoItem( data: videoData, videourl: url, )), //print(url), } }); } catch (ex) { print(ex); } }</p> <pre><code> ## 对数据友好格式化显示 如下图显示数据通常超过1000 会显示1k,超过10000显示1m,这样更加友好显示数据. 主要使用了package:flutter_money_formatter 这个组件 ![第三篇-用Flutter手撸一个抖音国内版,看看有多炫](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/122099-20200529002025152-1922512527.png) 1,先引用 import 'package:flutter_money_formatter/flutter_money_formatter.dart'; 2,使用如下方法 ;gutter:true;
FlutterMoneyFormatter fmf =
FlutterMoneyFormatter(amount: double.parse(widget.favorite.toString()));

FlutterMoneyFormatter fmf2 =
FlutterMoneyFormatter(amount: double.parse(widget.comments));

3,显示的方法如下

go;gutter:true; fmf.output.compactNonSymbol</p> <pre><code> 完整的实现代码如下: ;gutter:true;
return Align(
alignment: Alignment.bottomRight,
widthFactor: 100.0,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: [
_getFollowAction(),
_getSocialAction(
icon: DouyinIcons.heart,
title: ‘${fmf.output.compactNonSymbol}’),
_getSocialAction(
icon: DouyinIcons.chat_bubble,
title: ‘${fmf2.output.compactNonSymbol}’),
_getSocialAction(
icon: DouyinIcons.reply, title: ‘分享’, isShare: true),
_getMusicPlayerAction()
],
));
}

底部音乐名字走马灯特效

先引入 import ‘package:marquee_widget/marquee_widget.dart’;

反复测试后发现,这里需要设置width,否则没有效果,切记. 并使用container包含起来

go;gutter:true; Container( width: 150, child: Marquee( child: Text('${widget.musicName} - ${widget.authorName}'), direction: Axis.horizontal, textDirection: TextDirection.ltr, animationDuration: Duration(seconds: 1), directionMarguee: DirectionMarguee.oneDirection, ), ), ])</p> <pre><code> ## 音乐图标旋转效果 ![第三篇-用Flutter手撸一个抖音国内版,看看有多炫](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/122099-20200529002625293-308995086.png) 这里主要模仿抖音的音乐按钮旋转起来的特效,目前还未实现的地方是哪个音乐字符飞出来消失 改造后的代码如下,先使用 SingleTickerProviderStateMixin,当元素显示时才播放动画效果 ;gutter:true;
class _ActionsToolbarState extends State
with SingleTickerProviderStateMixin {
static const double ActionWidgetSize = 60.0;
static const double ActionIconSize = 35.0;
static const double ShareActionIconSize = 25.0;
static const double ProfileImageSize = 50.0;
static const double PlusIconSize = 20.0;
AnimationController animationController;

然后设置初始化状态,以及各种初始化参数。间隔 seconds: 5,并且在初始化状态下把animationController 创建出来,下面的方法使用得到

go;gutter:true; @override void initState() { super.initState(); animationController = new AnimationController( vsync: this, duration: new Duration(seconds: 5), ); animationController.repeat(); }</p> <pre><code> 这里是完整的播放图标改造后的代码 ;gutter:true;
Widget _getMusicPlayerAction() {
return Container(
margin: EdgeInsets.only(top: 10.0),
width: ActionWidgetSize,
height: ActionWidgetSize,
child: Column(children: [
Container(
decoration: new BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(25.0)),
color: Colors.black54,
),
padding: EdgeInsets.all(11.0),
height: ProfileImageSize,
width: ProfileImageSize,
child: AnimatedBuilder(
animation: animationController,
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: musicGradient,
//border: Border.all(color: Colors.black87, width: 11.0),
image: DecorationImage(
image: NetworkImage(widget.coverImg),
fit: BoxFit.cover,
),
),
),
builder: (BuildContext context, Widget _widget) {
return Transform.rotate(
angle: animationController.value * 6.3,
child: _widget,
);
},
),

// decoration: BoxDecoration(
// shape: BoxShape.circle,
// gradient: musicGradient,
// border: Border.all(color: Colors.black87, width: 11.0),
// image: DecorationImage(
// image: NetworkImage(widget.coverImg),
// fit: BoxFit.cover,
// ),
// ),
),
]));
}

未完成的还有搜索界面,消息页面、关注,登录界面,后续会继续完善这些界面

结语

本博客会持续更新,将在业余时间将其他的功能完善。请持续关注本博客,代码地址:https://github.com/WangCharlie/douyin

欢迎各位点击star 和fork 代码.

Original: https://www.cnblogs.com/fengqingyangNo1/p/12985001.html
Author: 风清扬 No.1
Title: 第三篇-用Flutter手撸一个抖音国内版,看看有多炫

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580148/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PLG SaaS 产品 Figma 商业模式拆解

    9 月 15 日,Figma 的 CEO Dylan Field 发布消息:今天,Figma 宣布接受 Adobe 的收购… Adobe 以约 200 亿美元收购 Fi…

    Java 2023年6月13日
    073
  • KMP算法的实现过程

    朴素的字符串匹配算法的时间复杂度为O(m*n),m、n分别为主串、模式串的长度。容易理解的是,主串和模式串的指针同步进行,当遇到不匹配的字符时,主串指针将移动到当前指针下一位,因此…

    Java 2023年6月13日
    0103
  • Oracle新建用户

    注:本文针对像我之前一样刚入Oracle服务器的新手,运用极简形式快速入门,更多知识,请看本人博客! 1.创建临时表空间 说明: &#x4E34;&#x65F6;&…

    Java 2023年6月8日
    0102
  • springcloud alibaba 阿里 Nacos 注册中心 配置启动说明

    1.控制台,服务端 下载nacos运行包,找到 nacos\bin\startup.cmd 双击 startup.cmd 运行, 默认用户名密码都是 nacos 客户的配置,微服务…

    Java 2023年6月7日
    0140
  • Git配置用户信息和SSH免密

    一、配置用户信息 1.查看配置信息 查看所有配置 $ git config -l/–list 查看系统配置 $ git config –system -l/–list 查看用…

    Java 2023年6月8日
    0108
  • java.net.NoRouteToHostException: 没有到主机的路由

    今天在配置Jenkins 的云服务器的时候提示:java.net.NoRouteToHostException: 没有到主机的路由,网上查到的没有主机路由问题提到的大多是防火墙问题…

    Java 2023年5月29日
    080
  • 这个队列的思路是真的好,现在它是我简历上的亮点了。

    你好呀,我是歪歪。 前几天在一个开源项目的 github 里面看到这样的一个 pr: 光是看这个名字,里面有个 MemorySafe,我就有点陷进去了。 我先给你看看这个东西: 这…

    Java 2023年6月5日
    075
  • web 网页nginx反向代理【检查到弱密码套件:不支持完全向前保密 】处理

    web 项目扫描出如下问题: 处理方式如下: 打开nginx配置文件nginx.conf,添加如下内容: python;gutter:true;ssl_ciphers ‘AES12…

    Java 2023年5月30日
    088
  • ReentrantLock 公平锁源码 第2篇

    Reentrant 2 前两篇写完了后我自己研究了下,还有有很多疑惑和问题,这篇就继续以自问自答的方式写 如果没看过第1篇的可以先看看那个https://www.cnblogs.c…

    Java 2023年6月6日
    0132
  • (WebFlux)003、多数据源R2dbc事务失效分析

    一、背景 最近项目持续改造,然后把SpringMVC换成了SpringWebflux,然后把Mybatis换成了R2dbc。中间没有遇到什么问题,一切都那么的美滋滋,直到最近一个新…

    Java 2023年6月15日
    092
  • 群晖安装docker 安装neuxs3

    群晖docker 文件夹下创建 docker 下载neuxs3 启动容器 映射端口3003:8081 群晖反向代理。不用https的这一步可以不用,之间路由转发端口3003就行 路…

    Java 2023年6月6日
    0101
  • vue 中,echarts的使用,简单入门

    vue 中,echarts的使用,简单入门 原作者哔哩哔哩视频 感谢 多多支持效果图 首先创建一个页面组件,创建三个div,分别来使用折线图,柱状图,扇形图 //折线图 //柱状图…

    Java 2023年6月16日
    0112
  • Fuck Sharepoint 2013

    最近遇到一个貌似是bug的问题,每次点击页面的时候页面的地址多出一行/_layouts/15/start.aspx#/ 解决办法: 1,点击 设置到 网站设置 2,打开 网站集管理…

    Java 2023年6月7日
    099
  • Jenkins 强制停止 job 执行

    0.背景 某天,Jenkins 运维支持群里,有同学反馈说,点击 job 页面的取消执行按钮不生效,job 执行停不下来。 收到这个反馈后,我自己也试了下,发现确实点页面取消按钮不…

    Java 2023年6月9日
    0124
  • Java 在Word指定段落/文本位置插入分页符

    在Word插入 分页符可以 在指定段落后插入,也可以 在特定文本位置处插入。本文,将以Java代码来操作以上两种文档分页需求。下面是详细方法及步骤。 【程序环境】 在程序中导入ja…

    Java 2023年5月29日
    078
  • 【Java全栈进阶】-接口

    学习类的时候,知道类与类之间可以通过继承产生关系,接口和类之间可以通过实现产生关系,那么接口与接口之间会有什么关系呢? 多个接口之间可以使用 extends进行继承。 interf…

    Java 2023年6月7日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球