重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Dart作为高级语言,支持面向对象的很多特性,并且支持基于mixin的继承方式,基于mixin的继承方式是指:一个类可以继承自多个父类,相当于其他语言里的多继承。所有的类都有同一个基类Object,这和特性类似于Java语言,Java所有的类也都是继承自Object,也就是说一切皆对象。
创新互联公司是一家成都网站设计、成都网站制作,提供网页设计,网站设计,网站制作,建网站,专业公司,网站开发公司,于2013年成立是互联行业建设者,服务者。以提升客户品牌价值为核心业务,全程参与项目的网站策划设计制作,前端开发,后台程序制作以及后期项目运营并提出专业建议和思路。
Dart 是一门面向对象的语言, 全部的类都是继承自 Object , 除了支持传统的 继承、封装、多态 , 还有基于组合(Mixin-based)的继承特性
类型推导(var/final/const)
var
final和const的区别
3.非零即真( )
4.字符串
5.集合
Dart中变量初始值为null,即使是int类型也可以是null(java中int默认是0, boolean默认是false); Dart支持自识别,可以是用var定义变量,也可以直接指定具体类型; final或者const都可修饰不可变的变量,final变量只能赋值一次,const是编译时常量。
int和double是num子类,没有float类型; 支持字符串模板,用${expression}的方式来实现字符串效果,类似如字符串拼接; String可以使用单引号或者双引号; Dart没有数组,只有列表; 其中List,Set,Map不是抽象接口,是具体实现类,可直接使用; Map的key没有指定类型,key类型不一致不会报错;key不能相同,但是value可以相同,value可以为null。 var name = 'Tom';
方法也是对象,方法可赋值给一个变量; 如果方法的参数是解构出来的可以通过 @required 注解标注为必填 const Scrollbar({Key key, @required Widget child}); 支持可选参数,可选命名参数用{}包围,可选位置参数写在最后并且使用[]包围 String say(String from, String msg, [String device]); 支持默认参数 void enableFlags({bool bold = false, bool hidden = false}) {…}; 以_开头的方法都是私有的。 void main() {
支持闭包,闭包能够访问外部方法内部的局部变量
1.空替换?? expr1 ?? expr2,如果expr1是non-null,返回其值。否则执行expr2并返回其结果; 2.条件成员访问?.P?.y = 4; 如果p是non-null,则设置y的值等于4; 3.类型判定操作符(as,is,is!); 4.级联操作,可以在同一个对象上连续调用多个函数以及访问成员变量;
和java不同的是,Dart可以抛出任意类型的对象; 程序不会强制要求开发中处理异常,但若发生异常,程序会中断; 其中异常主要分为Error和Exception两种类型。
创建对象可以不使用new关键字; Dart中没有public,private,protected这些关键字; 没有interfaces关键字,每一个类都是一个接口。我们可以用抽象类来类比java中的接口; Dart把多重继承的类叫做Mixins。
支持语法糖 Point(this.x, this.y); 每个实例变量都会自动生成一个getter方法,Non-final变量还会自动生成一个setter; 命名构造函数,使用命名构造函数可以为一个类实现多个构造函数,也能更加清晰的表明你的意图;
断言是如果条件表达式不满足则停止代码执行; 断言只在检查模式下运行有效,如果在生产模式下运行则不会执行。
Dart 以两种模式运行: Dart 1.x 有生产模式和检查模式两种模式, Dart 2.x 中移除了检查模式。
注:建议在开发/测试模式中使用 检查模式 运行 Dart VM ,因为它会添加警告和错误以帮助开发和调试过程;选中的模式会强制执行各种检查,例如类型检查等。
dart标识符可以包括字符和数字,但不能以 数字开头 。
Dart 是一种面向对象的编程语言。
代码说明:定义了一个类 TestClass ,这个类拥有一个方法 disp() ,方法可以实现在终端打印字符串 Hello Dart! ,使用 new 关键字创建类的对象,该对象调用方法 disp() 。
关于dart的学习还有很多;我列出如下: Flutter高级工程师进阶学习资料;需要可以私信我。发送“核心笔记”或“手册”,即可领取资料!
前些时候北京市政府做了一个关于 996 的调研,第一时间我参与了调研,同时发到所有读者群,让大家一起发声。
不少朋友开始热烈的讨论起来,有人很乐观认为这是改变的开始,也有人觉得这就是走一个形式。 不管怎么说,也算看到政府针对这个问题开始有行动了。
其实 996 最残酷的一点是:年纪大的人很容易被无情淘汰。中国互联网的 35 岁危机是和 996 盛行分不开的。
996 对于打工人来说,绝不可能常态化!
为什么不能常态化? 从生理规律上看,脑力劳动者如果不以进 ICU 为目标,那么每天能够认真投入的时间,八小时也就到极限了。 人毕竟不是机器,是血肉之躯!
但中国老板普遍希望程序们 996,别激动别骂,这是残酷的现实。
同时中国老板们偏爱年轻人,为什么?很简单,老了之后,你舔活速度显然没有年轻人来的卖力,来的凶猛!长年累月的辛苦劳作,已经让你这颗螺丝钉生锈甚至发霉了!如果你是老板,这个时候你还要支付比年轻人多 2 倍的薪资,你怎么选?
更别提,年纪这么大的你,还有各种猝死风险 ,拿最近的 pdd 猝死事件来说,在超级大小周(996+997)的压力下,这么年轻的女孩都猝死了,更何况 40 岁的一线码农?那猝死率该得多高了?企业的商誉还要不要了?
显然,资本家一定会作出最商业最正确的选择:年轻人,甚至是刚毕业的大学生,这些最新鲜的韭菜才是他们的最爱。
所以,对于打工人尤其程序员而言,996 本身反而不是最大问题,最大问题是我们如何跨越大龄危机。
相比等待环境发生改变,不如主动思考清楚这个问题。
想起去年写过的一篇旧文,再次分享给大家,讲的是我身边五个大龄程序员的故事,绝对真实的经历分享,有洋哥的同学、朋友、下属,他们都成功的跨越了 35 岁危机,希望他们的经历对大家有一点点启发:
1.沉迷是一种力量
第一次见 A 君是 10 年前参加人人网的面试,他是面试官,那个时候 A 君 35 岁,担任后端 leader。入职后,我发现,他用于做管理的时间不多,90% 时间在疯狂编码。
A 君基本没有社交,上班就是撸代码,下班就是回家带孩子。他对优秀的工程师容忍度极高,对差一点的完全没耐心。
偶尔能听见他训斥下属的吵闹声:“这个类写成这样,你没看代码规范吗?”、“这个线程池不能这么用,给你说多少次了!”、“是你没听清楚还是我没讲清楚?不能这么干!”。
一次下班,和他一起回家,一路上给我讲各种编程技巧和方法论,我听的津津有味。聊了差不多半小时,心想可以换个话题了,于是我问:“您周末 娱乐 都干些什么呢?”,他是这样回答的:“我会去看些开源代码,自己改着玩很有趣”。那一刻,空气都凝固了,这话我实在没法接下去了。
后来有一天,A 君上班拍桌子,暴怒之后冲了出去。大家一脸懵逼,后来才知道,原来是大 Boss 批评他不懂管理,只知道埋头写代码。
几年前,和他在微信聊了一次。他去了一家创业公司做技术负责人,我很好奇,很想知道这次他是怎么做管理的。
我问他:“您现在是怎么带团队的”,这一问不要紧,聊了半小时。从 Flutter 的优越性到微服务的落地,再到 Google 出了什么新技术,顺带鄙视了一些还在用落后技术的公司。一顿硬核技术科普下来,收获挺大,但是管理这两个字?嗯,不存在的。
我现在理解了,他压根就不关心管理,聚集一帮极客跟他一起成长战斗才是最开心的事情。
A 君今年快 50 了,前不久和其他人聊起他,大家都感叹,这老哥战斗力太强了,真是那种一顶十的程序员。
有时候,沉迷是一种力量,焦虑?不存在的.....
想起 A 君给我说的那句:“我要开心 coding 到 80!”。我真心相信他能做到。
2.不服就是干
这次说说我的好朋友 B 君,今年 40 岁,曾经鹅场的高级工程师,7 年前,晋升失败一怒之下开启了创业之路。
我们是在 CSDN 论坛上认识的,他帮我解决了一个底层操作系统级的防劫持问题。后来经常问他一些排查线上故障的方法论、微服务怎么拆分、如何做出能抗更高并发的架构,他都非常耐心的指导我,他还有句口头禅:不服就是干!
B 君出来创业没拿融资,自己投了 100 万。团队 5 个人,挤在一个很小的民房。创业期间找他喝酒,他告诉我:“我一定要改变世界,否则我会被世界改变”。
一年后,再次去找他喝酒,这次他脸色灰暗,人也非常低迷。原来前期 100 万烧完,又投入了 50 万积蓄,项目还是没有做成。酒过半巡,他突然抱着我哭了起来,我这才得知因为积蓄全部烧完,他女朋友已经和他分手了。
再后来,他回到大厂当程序员,级别薪资跟创业前相差无几。谈起创业经历,我为他惋惜,而他并不后悔。
两年前,他开始炒比特币,炒着炒着嫌这些交易平台做得都不够好,于是空余时间动手做了一个交易平台。
去年,B 君告诉我,他的交易平台融资 500 万,再次出来创业。第二次创业,他已平和很多,没有豪言壮语,让公司活下去是最大目标。
今年听说 B 君的公司已经快 30 人了,为他祝福,相信他一定能改变世界。
有时候,我们需要点不服就是干的精神!
3.反焦虑
这次上场的是 C 君,硕士师兄,40 岁。C 君是一名大厂总监,他花了四年时间跳了三次才来到当下的这家大厂扎根下来,带 100 人团队,每个月安安稳稳拿高薪,不用担心公司倒闭的风险。
以 C 君的专业技能和学历背景、工作经历,其实完全不需要担心没工作。可他总是莫名担忧,害怕自己没有创造更多价值。
100 人的团队不是那么好带,除了技术之外还需要精通业务产品、精通组织流程、掌握良好的沟通推动技巧、在大厂还需要明争暗斗。
一次和 C 君聊天,他感叹到:“还是写代码有安全感,做管理不仅心累还觉得自己没创造价值”,可不是,这种焦虑几年前我也感同深受。
大厂的高 P 看起来风光无比,其实要跳槽也不容易,毕竟中小公司能接得住大厂高 P 薪资期权总包的,并不多。
有时候,不是现在取得了成就就会开心,决定因素是你未来会不会更好,如果答案是否定的,不仅不会开心还有可能带来焦虑。
C 君就陷入这种焦虑当中,总是担心未来的上升空间和 40 岁以后的收入。特别是大厂还有年龄线的要求,到一定年龄不能晋升就有可能被淘汰。
有一段时间,公司领导层波动,他面临被连带的危险,甚至需要依靠抗抑郁的药物。但最终他依靠持续有规律的运动和学习新领域克服过来。
C 君给我提的最多的话: “反焦虑很重要”, 是啊,真的重要,从 C 君身上我真正学到了一点:无论你是否能成功,首先要反焦虑。
4.舍命狂奔
这次要说的是清华 MBA 同学 D 君,39 岁。他在通讯行业干了 10 多年,超级专家那种,带十人团队。
问起他读 MBA 的原因,他很坚定的说:“我对投资非常感兴趣,就是为了转行投资才这么大年纪了还选择读书”。
清华 MBA 课程安排的很紧张,我们都是六日班,也就周六半天周日全天,而他公司的工作非常忙,几乎 996,但从没见过他迟到过一次。
三年时光,D 君在跟时间赛跑,小组讨论、企业访谈、课程作业,他都完成的堪称完美。有一次我问他,你为什么这么拼?他说,当你笃定一件事,确定一个目标,那剩下的只有舍命狂奔。
毕业后,D 君如愿以偿加入一家投行,当上了投资人。有一次很好奇的问他投资人的收入,他告诉我刚入行薪资很低,只有之前做架构师带团队的 1/3。但他说这话的时候,一脸幸福感。
去年 D 君已经晋升为所在机构的合伙人级别,为他感到开心。
5.接受现实
最后上场的是老同事 E 君,41 岁。他是那种职场老黄牛。属于领导让做什么就做什么的人,任劳任怨勤勤恳恳,但个人成长一直比较缓慢。
前几年开始 E 君就不太顺了,因为编码能力一直没有达到高级或者架构师水平。他其实一直在跟年轻人拼体力,而随着年龄增大,是真拼不过了。我和他经常讨论的话题是颈椎病如何康复。
去年 E 君所在公司效益不太好,领导决定裁员,他进入了优化名单。被优化后,他休息整顿了好久,将原来 90kg 的体重减到现在的 75kg,颈椎病也恢复不少。再开始找工作,大概花了几个月时间,他终于找到了一个不那么满意的 Offer。
听到他找到下家的消息,我还挺为他开心的,因为这个过程我也帮他各种投简历,但大佬朋友们一听说 41 岁还是中级水平,都不太愿意给面试机会。
没想到过了半年,我和他吃饭,他对我说:“洋哥,我没有入职这家公司,我想明白了,继续做程序员对我来说没意义。我拿积蓄开了个小店”,刚听到消息,我非常惋惜,编码十多年最后却去做小生意,在我眼里就是逃兵。
直到最近去他小店玩,我才发现,这也是另一种好的生活。他开的是一个小型亲子游乐园,带上小孩,一边陪小孩一边工作,月收入也不差,养家完全没问题。这一瞬间,我产生了一种羡慕的情绪。
有时候,接受现实然后重新出发,未尝不是一个更好的选择。
最后的话
程序员不是一个「银发职业」,但也绝不是如某些贩卖焦虑的自媒体宣传的那样:35 岁危机,40 岁失业。
40 岁的程序员有的做了大厂中高管、有的成了小公司联创、有的成了连续创业者、还有的转行投资金融、也有人继续坚持写代码战斗在一线。
不可否认,有一部分人会被行业淘汰出局,但互联网的老年人在其他行业恐怕还是年轻人,接受现实,人生再起航完全没问题。
最重要的是,我们不能因为年纪的增长而焦虑,因为焦虑本身除了干扰我们成长,没有任何意义。
尽最大努力,做最好打算,但接受最坏的结果。在这个复杂多变的 社会 ,反焦虑、不断提升认知,不断充实自己的专业技能将永远重要。
表格布局和线性布局比较相似,只是使用起来更简洁一些。
本地Flutter 2.10.1,Mac版Android Studio Bumblebee | 2021.1.1 Patch 2
我是小栗子,初学Flutter ,文章会根据学习进度不定时更新,请多多指教~~
目前Flutter平台主流的两个播放器是video_player和fijkplayer
pub
github
1、Flutter平台官方插件,作者是国外的,有问题沟通比较困难,只能通过提交issue
2、硬解码
4、UI封装: better_player
基于video_player和Chewie的高级视频播放器。它解决了许多典型的用例,并且易于运行。
5、播放器宽高比例与视频内容宽高比例不一致时,会出现图像压缩变形的问题
6、调用原生内核播放器:iOS--AVPlayer, Android--ExoPlayer
7、对于分段源 m3u8 的播放不友好,如果一个切片播放超时,会导致整个播放都失败
8、better_player可以缓存视频,但不能自定义缓存的地址,只能指定key,和缓存的最大内存量(还未研究超出最大的话是不能缓存新的,还是删除最旧的)
9、better_player不能完全自定义UI,只能修改类中的一些开放属性,比如说icon图标,文字颜色啥的
10、无网络有缓存时,封面可以正常展示
11、better_player播放失败有手动retry的设计
pub
github
1、fijkplayer 是一个 Flutter 生态的媒体播放器,是对 ijkplayer 的 Flutter 封装,支持 Android 和 iOS。 fijkplayer 使用 ijkplayer 作为播放器内核,ijkplayer 使用 ffmpeg 进行音视频解封装和解码,同时添加了 Android 和 iOS 平台特有的硬件加速解码能力。
2 、国内有QQ群,但是活跃度也是不高。
3、可以缓存视频,可以自定义缓存的地址,方便后续的内存维护。
4、可以通过FijkPanelWidgetBuilder较大程度上自定义UI。
5、无网络有缓存视频时,无法展示封面,因为内部是通过imageProvider去加载网络图片的。
7、播放失败无手动retry的设计
1、两种播放器都是通过外接纹理方案 (Texture),将播放器视频画面渲染接入 flutter 中,性能上优于 PlatformView 的接入方法。
如何自己实现?
下面以video_palyer的iOS源码部分解释:
iOS用CVPixelBufferRef将渲染出来的数据存在内存中,Flutter engine会将Texture的数据在内存中直接进行映射无需通过Channel传输,然后Texture Widget就可以把你提供的这些数据显示出来。在我们传输数据的时候会需要将其与 TextureID 绑定,绑定的过程通过BasicMessageChannel实现数据流的传输,以做到实时展示的效果
Image是一个用于展示图片的组件。支持 JPEG、PNG、GIF、Animated GIF、WebP、Animated WebP、BMP 和 WBMP 等格式。
Image.asset - 用于从资源目录的显示图片,需要在 pubspec.yaml 文件中声明。
Image.network - 用于从网络上显示图片。
Image.file - 用于从文件里显示图片。
Image.memory - 用于从内存里(Uint8List)显示图片。
alignment → AlignmentGeometry - 图像边界内对齐图像。
centerSlice → Rect - 九片图像的中心切片。
color → Color - 该颜色与每个图像像素混合colorBlendMode。
colorBlendMode → BlendMode - 用于 color 与此图像结合使用。
fit → BoxFit - 图像在布局中分配的空间。
gaplessPlayback → bool - 当图像提供者发生变化时,是继续显示旧图像(true)还是暂时不显示(false)。
image → ImageProvider - 要显示的图像。
matchTextDirection → bool - 是否在图像的方向上绘制图像 TextDirection。
repeat → ImageRepeat - 未充分容器时,是否重复图片。
height → double - 图像的高度。
width → double - 图像的宽度。
加载资源图片需要将图片资源放入工程中,例如:新建images文件夹,将图片放在该文件夹下,图片适配则是使用ios的方式1X,2X,3X:
然后在pubspec.yaml中配置assets:
加载资源/网络/本地文件图片/内存图片:
占位图加载图片:
圆形图片:1.裁剪实现 2.CircleAvatar实现 3.Container边框实现
圆角图片:1.裁剪实现 2.Container边框实现
BoxFit.contain 全图居中显示但不充满,显示原比例
BoxFit.cover 图片可能拉伸,也可能裁剪,但是充满容器
BoxFit.fill 全图显示且填充满,图片可能会拉伸
BoxFit.fitHeight 图片可能拉伸,可能裁剪,高度充满
BoxFit.fitWidth 图片可能拉伸,可能裁剪,宽度充满
BoxFit.scaleDown 效果和contain差不多, 但是只能缩小图片,不能放大图片
下一节学习基础组件之Text
因为我们使用Flutter跨平台技术开发App时,会有很多公用组件,因为Flutter中一切皆为Widget,widget也比较细粒度,所以我们需要进行封装,用于一个项目或者公司不同项目中去~
那么今天写写如何发布package或者插件到Pub.dev上,扯扯谈O(∩_∩)O哈哈~
《Flutter的拨云见日》系列文章如下:
1、Flutter中指定字体(全局或者局部,自有字库或第三方)
2、Flutter发布Package(Pub.dev或私有Pub仓库)
首先,我们知道flutter有四种工程模式:Flutter Application、Flutter Module、Flutter Plugin和Flutter Package。
我们这里就主要讲Package 纯Dart插件的发布吧,都差不多。
创建工程后,就可以编写你的公共组件,或者公用字体库呀啥的, 都行。
在更改下你的pubspec.yaml文件,修改下你的versionCode,项目名称,项目描述,作者等
如果上传失败试试????的命令:
在执行该命令时,可能会中途调到网页,要求你登录google账号,登录授权,到时候登录账号并授权就可以了。
因为我们直接使用flutter packages pub publish是发布到Pub.dev上,并不是发布到私有仓库,该怎么办呢?
其实呢,也很简单!像versionCode,项目名,等都和发布Pub.dev是一样的。没啥区别。
有两种方式:
就是这么简单o( @ )o
相信大家引用Pub.dev上的第三方库都会了哈,到处都是这里不讲了
在使用flutter pub get就可以拉到私有仓库项目了
以上就差不多聊了聊package发布和获取的事儿了,都很明了,大家可以试试,挺简单的。
PS: 写文不易,觉得没有浪费你时间,请给个点赞~ ????