flutter循环渲染,flutter for web渲染html
泰戈尔《飞鸟集》中的隽语。
1.我们的生命之所以贫瘠,原因往往不是放弃了工作,而是因工作放弃了沉思:要不断地工作,也要不断地沉思。生命原是一个不知来自何处去至何方的奇迹,存在也是一个时空的偶然,我们需要不停的奋斗,来印证我们生命的真正存在。这样我们便须活跃我们的思维,点燃灵台的明灯,照亮我们该走的路,以便我们继续跋涉。生命也是需要不断跋涉的,不管昨日你有多少功绩,不管昨日你园圃里有多少花朵,那是属于昨日;若你一心沉湎于昨日的喜悦,就难享今日更清醇的欢欣。今日,一个新的开始,更需要我们前进,更需要我们去孕育。人生是一条永远走不完的旅程,需要生命的火把,直至成灰而泪尽。
创新互联2013年至今,是专业互联网技术服务公司,拥有项目网站建设、网站制作网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元麻江做网站,已为上家服务,为麻江各地企业和个人服务,联系电话:18982081108
2 流星虽然陨落了,却用美丽的光芒划破夜空,乐曲虽然结束了,却用激昂的旋律振奋人心。
3 滴水之所以能够穿石,原因起码有二:一是在于它们目标专一,每一滴水都朝着同一方向,落在一个定点上;二是在于它们持之以恒,在漫长的岁月中,它们从未间断过这种努力。由此及彼,我们可以想到古今中外有成就的学者,在它们身上,都体现了“专”“恒”二字。
4有的人生活得富有充实,是因为他具有驾驭生活的能力;有的人生活得平庸无奇,是因为他缺乏战胜生活的勇气。
5 用不着把年轻的心灵装点得沉重。表面上的沧桑,外在的严肃,并不能让你上升为哲人;离开所有的朋友,你有的只能是孤单的背影。既然现在的我还不能变得深刻,那么,我就让自己变得轻松。哭丧着脸的人,怎能听清花开的响声;伪装自己的人,又怎能听懂蛙鸣一片里的激动。
6 用不着立刻判定自己不行,而混入茫茫的人海,太俗地活着,点不亮一盏霍霍燃烧的生命之灯。我的喊声或许有些微弱,我的脚步或许有些盲从,但我的热血却自始至终咆哮奔腾。命运没有什么可怕的,惊涛骇浪的海上不是常见扬起的帆影!
7 用不着为一次小小的挫折而痛哭流涕。人生本来就充满坎坷,没有创伤的珍珠贝,怎会有闪烁迷人的晶莹。跌几次跤,摔几次跟头,是经常的事。如果在一条阴沟里都翻了船,你的人生一定苍白,绝对不会生动。如果败了,我可以从头再来,如果胜了,我可以把脚下的基石夯硬。
8 嫉妒乃无知,模仿即自杀;无论身居祸福,均自我主宰;蕴藏于人身上的潜力是无穷的,它能胜任什么事情,别人无法知晓,若不动手尝试,他对自己的这种能力就一直蒙昧不察。
9 天下只有两种人:譬如一串葡萄到手,一种人挑最好的先吃,另一种人把最好的留到最后吃。照例第一种人应该高兴,因为他每吃一颗都是手中那串葡萄里最好的;第二种人应该悲观。不过事实上却适得其反,缘故是第二种人还有希望,第一种人只有回忆。
10 体验自然是财富。风是一副透明的锦缎,雨是无数晶莹的珍珠,森林宛如翠绿的刺绣,而海湾湖泊则是湛蓝的宝石。
11 人格需“贵我”:自立以树人之尊严,自信以扬人之精神,自学以长人之才华,自爱以见人之崇高,自励以磨人之意志,自警以示人之理智,自强以显人之个性,自谋以图人只发展,自奋以成人之大业。
12 失败,是把有价值的东西毁灭给人看;成功,是把有价值的东西包装给人看。成功的秘诀是不怕失败和不忘失败。成功者都是从失败的炼狱中走出来的。成功与失败循环往复,构成精彩的人生。成功与失败的裁决,不是在起点,而是在终点。
13 一棵小草,也许永远不能成为参天大树,但它可能做最绿最坚强的小草;一滴水,也许永远不能像长江大河一样奔腾,但它可以成为所有水中的最纯的那一滴。
14 人们向往空谷幽兰,因为它遗世而独立,高洁清幽,不为世尘所染,然而那环境毕竟可遇而难求。所以人们更加赞美莲花,因为它出污泥而不染,濯清涟而不妖,人们应该像莲花那样懂得心灵的自我净化。
15 奔着幸福,我们苦苦寻觅。可是,幸福在哪儿?
幸福该是沙漠中一片清凉的绿洲吧?我们跋山涉川,望眼欲穿,最终却只见到几丛沙棘;幸福该是大海中的一颗闪亮的珍珠吧?我们涉江探海,寻踪觅迹,末了却只捡到几只贝壳;幸福该是旅途中的一座舒适的城堡吧?我们饥餐渴饮,夜往晓行,最后却只找到一处陋室;幸福该是山那边的一处桃红杏黄的花果园吧?我们千辛万苦,气喘吁吁,终了却只见到几弯垂柳、几丛小草。
其实我们不要把幸福太理想化了,世上本没有完整无缺的幸福。
16 一切能激发生机的思想都是美好的。敌人只有一个,那就是自私,它能使生命的泉水变得浑浊而枯竭,它能使心灵的天空变得狭窄而阴暗。它能使理想的星辰变得昏暗而模糊。努力激发你心中的光明和力量,激发那无私的爱和奉献的喜悦。
17 清风从水上掠过,留下粼粼波纹;骆驼从沙漠走过,留下了深深蹄印;雨滴从林中飘过,留下了寸寸滋润;阳光从云中穿过,留下了缕缕温暖;岁月从树林中走过,留下了圈圈年轮。朋友,我们从时代的舞台上走过,留下了什么呢?
18 善良,不是夜色里的松明,却总能把前途照亮。真诚,不是春光里的花朵,却总能把希望指明。
19 对骄傲的人不要谦虚,对谦虚的人不要骄傲。
20 自己把自己说服了,是一种理智的胜利;自己被自己感动了,是一种心灵的升华;自己把自己征服了,是一种人生的成熟。
21 生活中那些一生都马不停蹄、郑重前行的人固然可敬,但能适时驻足歇息并懂得欣赏周遭景色的人,不仅可敬,而且越发可爱。
22 帆清楚地知道:在大海上航行,难免会被风吹折,也可能会被大海吞下,但这些危险决不会使帆低下高昂的头颅!因为帆早已把生命交给了大海,也把死交给了大海。帆懂得:如果离开了这沸腾的航海事业。帆即使活着,还不只是一块闲置的破布。
23 人生要有“四气”:奋发向上、百折不回的志气,铁面无私、令人敬畏的正气,披荆斩棘、舍生取义的勇气,求新求好、能做善做的才气。
24 十五岁是风,二十岁是云,二十五岁是水,三十岁是山。风可感而不可见,云可见而不可捉,水可捉而不可握,只有山才能实实在在地把握;但云是风的面貌,水是云的凝结,山是水的故乡。没有风,云便不在漂游,没有云,水便不在降下,没有水,山便将要枯黄。 25 你的奔放决定你的豪爽,你的沉稳决定你的塌实,你的柔韧决定你的忍耐,你的内秀决定你的精细。总之,你的性格决定你的生活作风和态度。
26 对渊博友如读异书,对风雅友如读名人诗文,对谨饬友如读圣贤经传,对滑稽友如读传奇小说。
27 我珍惜从茫茫人海中提取的人生养料,滋润我的生活,激励我的精神;我珍惜成功的经验,也珍惜失败的教训;我珍惜痛苦的回忆,也珍惜欢乐的时光;我珍惜生活的每一个片段,每一个进程;我珍惜人生的每一次坎坷,每一次奋进。成功与失败,痛苦与欢乐,都将融进我的血肉,陪伴我去书写更充实的人生。
28人的生命是非常有限的,如果一个人在一生中不能经常地、果断地舍弃一些不该投入精力的事情,什么都渴望得到,时时,处处都劳心劳力,其结果只能是让自己失望。所以,生活需要经常地清点。
29 青春不是粉面桃腮和朱唇红颜,而是坚定的意志,丰富的想象,饱满的情绪;青春不是短暂的岁月和鲜红的色彩,而是一种永远充实、开放、活跃、蓬勃向上的心态,不断沸腾的滚滚热血。
30 假如生命是花,开时是美好的,花落时也是美好的,我要把生命的花瓣一瓣一瓣地撒在人生的旅途上;假如生命是树,我要把生命的根须一心一意地扎向大地的深处,哪怕脚下是坚硬的岩石,也要锲而不舍地将根须钻进石逢,汲取生活的源泉。在森林和沃野中做一棵参天大树当然很美妙,在戈壁沙漠和荒山秃岭中做一棵孤独的小树,给迷路的跋涉者以希望,那就更光荣。
31 几个苍蝇咬几口,决不能羁留一匹英勇的奔马。
32人的精神世界的空间是有限的。善念多了,恶念少了;信念多了,消磨少了;追求多了,无聊少了。
33一切能激发生机的思想都是美好的。敌人只有一个,那就是自私,它能使生命的泉水变得浑浊而枯竭,它能使心灵的天空变得狭窄而阴暗,它能使理想的星辰变得昏暗而模糊。努力激发你心中的光明和力量,激发那无私的爱和奉献的喜悦。
34迷信是“傻子遇到骗子的结果”。————(法国作家伏尔泰)
35浪费是地球的眼泪,流走了多少宝贵的资源?信任是友谊的桥梁,沟通了多少封闭的心扉?
36他,日日斟出一杯微甘的苦酒,不太少,不太多,以能微醉为度,送给人间,使饮者可以哭,可以歌;也如醒,也如醉,若有知,若无知,也欲死,也余生。
37失误被悔恨征服,离正确就不远了;挫折被毅力征服,离成功就迫近了;主观被客观征服,与真理就贴身了;狭窄被豁达征服,胸襟就宽阔了;狂热被冷静征服,理智便成熟了。而这一切的征服,首先源于对自己的征服。
38 命运是最物质的,因为它太有力量了。大写的“人”若与命运相比,不过就像小小的星辰与广袤无垠的宇宙。人很难做命运的先知,但是命运可以轻而易举地摆布你,就像大海波峰浪谷中的一叶小舟。
39当一个人把自己的命运全部维系在对某个人的忠诚上,并把这种忠诚置于一切原则和道义之上的时候,他也就变为一个卑微小人,一个不足道的走卒。
40生命原是要不断地受伤,不断地复原,不断地创造,不断地被创造的。世界上没有永恒的东西,烦恼和痛苦也是如此,因为生活不会停顿。
41鸟儿爱美,不仅需要羽毛之美,还需要鸣声婉转之美;鱼儿爱美,不仅需要鳞甲之美。还需要浮沉活泼之美。人爱美,不仅需要服饰居室之美,还需要心灵品德之美。
42有智慧的人类可以在不自由中寻找自由,也可以在自由中设置不自由。环顾四周,多少匆忙的行人,眉眼间带着一座座监狱在奔走。
43在茫茫宇宙中,个体生命显得多么渺小;在理想的生命境界的追求与严酷的现实生存环境的激烈冲突中,在与自然、与社会的抗衡中,个体的力量又多么不堪一击。但生命的进程所看重的并非结果而是过程。生命的全部意义就在于为人生所能达到的最高境界而追求、拼搏。
44承受是一种真诚,一种用心铸成的应允领悟;承受是一种涵养,一种处变不惊、处乱不慌的气度和坦荡;承受是一种力量,一种排斥流俗、弘扬正气的凸现和舒展。承受如一杯陈年老酒,醇香而清冽;承受像一盆羞涩的朝花,含苞待放;承受似一支乡音俚曲,粗朴而深厚;承受是一位哲学家的絮语,含蓄而隽永。
45悲观是瘟疫,乐观是甘霖;悲观只能产生平庸,乐观才能造就卓绝;悲观是因为短视而看不清事物的本质,乐观是因为卓视而对事物的深入了解;从卓绝的人那里,我们不难发现乐观的精神,从平庸的人那里,我们很容易找到阴郁的影子。
46成功的花,人们只惊羡它的明艳,谁知道它当初的嫩芽却浸透了奋斗的泪水,洒遍了牺牲的血雨。
47在鲜花面前,不要忘了它凋零的季节;在绿草面前,不要忘了它被践踏的过去;在绿叶面前,不要忘了它飘落的即刻。人,不能陶醉于美好的现在。
48在漆黑的夜晚,你要想到旭日东升的美好;在寒冷的冬季,你要想到千里冰封的壮丽;在汹涌的海边,你要想到乘风破浪的豪迈。人,决不能灰心于困难。
49在荆棘铺路的时候,你要用理想的利刃披荆斩棘;在漆黑围绕的时候,你要用信念的明灯照亮前程;在风雨狂作的时候,你要用坚强的大伞撑起晴空。人,在困境面前决不能丧失意志。
50生活是海,我们是船。纵然有风狂浪猛,也会有晴天碧波;纵然有迷惘苦涩,也会有曼舞轻歌。
51蓦然回首人生之旅,你会惊异地发现,凡你活得最苦最累的时候,命运赋予你的也就越多。
52 单纯决不是幼稚的同义语。幼稚是童气未脱的胎迹,单纯是童年留下的财富。请你保留一份单纯,使你多一份生活的诚信,少一些人情的圆滑世故;请你保留一份单纯,使你多一份与人的友善,少一些心灵的冷漠麻木;请你保留一份单纯,使你多一份人生的快乐,少一些精神的衰老疲惫;请你保留一份单纯,使你多一份奋进的力量,少一些故作高深的看破红尘。
53一粒种子,可以无声无息地在泥土里腐烂掉,也可以长成参天大树;一块玉璞,可以平庸无奇地在石丛里沉睡下去,也可以成为稀世珍宝。
一个人,可以碌碌无为地在人世间虚度光阴,也可以让生命发出耀眼的光芒。
54有理想的人说,生活像一杯蜂蜜,越品越甜;没有理想的人说,生活像一杯白开水,越喝越淡。
55未经风雨交加的黑夜,哪能体会风和日丽的可爱;未经坎坷泥泞的艰难,哪能知道阳光大道的可贵,没有心血和汗水的付出,哪能尝到胜利成功的喜悦。
56人,其实是有魂的。如果一个人失了魂,那么,便只剩了一具空壳,活起来是很没劲、很无聊的。而“魂”这东西,又看不见摸不着,所以有时失了魂,却还浑然不觉。
57有时,我们会觉得生命是一种痛苦的煎熬,当它最充分展示出黑暗、龌龊、卑鄙、虚伪一面的时候;有时,我们会觉得生命是一种快乐的享受,当它最充分地展示出光明、纯洁、崇高、真诚一面的时候。生命似乎永远是这样在两极之间交错延伸的。在它延伸的每一个区段里,似乎总是喜剧与悲剧同生,苦难与幸福共存。
58理想不是现成的粮食,而是一粒种子,需要你去播种,培育;理想不是壮美的画卷,而是一张白纸,需要你去描绘,渲染;理想不是葱茏的绿洲,而是一片荒漠,需要你去开垦,改造。
59其实,寂寞给人的不仅是知识,而且也是一种锤炼,一种感情与思想的升华。有时,寂寞具有决定性的作用。在一定意义上,可以说,大凡很有成就的人,往往是固然最有才能,但首先耐得住寂寞的人。
60智者的智慧往往在于,他最善于通过生活中的很多能照出自己的真实的一切表象的镜子来剖析自己,洞察自己,完美自己。
61鞭挞对于每个人来说,自然难以忍受,宽宏则大受人们的偏爱。其实,鞭挞对于每个人来说,比宽宏更有必要。因为鞭挞令人警觉,宽宏却只能使人沉沦;鞭挞有如一杯苦口的良药,虽然味道不好,但能治好你的病;宽宏有如一杯可口的美酒,虽然味道很好,但容易使你昏昏欲睡。
62遗忘是心的缝隙,漏掉了许多珍贵的昨天。
63村野是我生命的摇篮,母亲是系着摇篮的绳索,任凭风吹雨打,岁月嬗变,它始终以一组强音,把我向生存的高层次鞭策。
64没有孤立的生命,也没有孤立的环境。生命是各类有机生物相互联结休戚与共的网络。
65记忆没有重量,它却既可以使人的精神压抑、迷惘,又可以使人的思想情绪振奋、解放;记忆没有评价,它却既可以让人的灵魂贬值、彷徨,又可以让人的生命意义升华、高昂;记忆没有体积,它却既可以让人的气量狭小、幽暗,又可以使人的胸襟坦荡、舒展;记忆没有色彩,它却既可以使人的心境苍白、忧伤,又可以让人的内在世界绚丽、辉煌。
66真正的成功者,从来不会给自己留退路,相反,倒往往在山重水复中踏出一条新路来。虽遇挫折,但决不气馁;每次跌倒,随即站起;别人放手,他仍然坚持抓住;别人后退,他仍然奋勇前行。
67怎么能不喜欢出发呢?没见过大山的巍峨,真是遗憾;见了大山的巍峨而没见过大海的浩瀚,仍然是遗憾;见了大海的浩瀚,没见过大漠的广袤依旧遗憾,见了大漠的广袤而没见过森林的神秘还是遗憾。世界上有不绝的风景,而我有不老的风景。
68大海的深处是平静的,花朵的一生是无声的,巍峨的山峦是缄默的。大自然中许多蔚为壮观的生命往往以沉默示人。
69机智和美好的语言有时只不过是一种瞬时的智慧和淋漓的表达。但智慧和表达的本身并不证明结果,朴素的行动才是开在成功路上的鲜花。
70认识一棵树,不需急着去看春天里的花,因为有一种事实叫做华而不实。你可以等到秋天,那时你去看树上的果实,果实是花的语言,也是树的注释。
71生命的过程注定是由激越到安详,由绚烂到平淡。一切情绪上的激荡终会过去,一切色彩的喧哗终于消隐。
72花儿是春天的诺言,潮汐是大海的诺言,远方是道路的诺言。世界因为信守诺言,肃穆而深情。
73世界的烦恼,生活的艰辛,冬天的单调和寂寞,花草树木的凋零,使我们的心时觉荒如沙漠。一旦看见一盆鲜花,一点亮色,就会像一泓清澈的泉水流入我们干涸的心田,使我们感到滋润和欢愉。
74智慧是经验之女。经验如果任其如野马般乱奔乱驰,必成为单纯的黑暗中摸索。与其说是指导人的,毋宁说是使他人陷入昏乱。
怀疑是知识之父。怀疑如若任其如毒蛇般缠住一个人的心,必将使之成为窒息人的绳索,与其说是求知的发端,毋宁说是对天才的扼杀。
75人的高明有时不在于聪明,而在于反省。人的成功有时不在于技巧,而在于反省,人的聪明有时不在于大脑,而在于品德。
76鲜花把自己献给春天,春天更美丽;树叶把自己献给大地,大地更肥沃,白鸽把自己献给天空,天空更蔚蓝。
77有些人保持沉默是因为他们无话可说,有些人保持沉默是因为他们懂得说话要适时;有些人宽容别人是因为他们胸怀宽广,有些人宽容别人是因为他们不讲原则。
78尊重。相互尊重对方的自由而不企图控制对方,或强求改变对方。哲学家马可·奥勒留说过:“对一个人来说,不去摆脱他自己的恶,而去摆脱别人的恶,这样做是件可笑的事情,因为摆脱自己的恶是可能的,而摆脱别人的恶是不可能的”。这句话对每个人都十分有借鉴意义,你愿意别人怎样待你,你也要怎样待别人。虽然我们不能改变周围环境,但是我们能够改变自己。
79互惠。彼此的要求与请求是合情合理的,应该主动地关心他人的成长和幸福。作家毛姆指出:“生活中无论什么事都和别人息息相关,要想只为自己,是十分荒谬的”。大哲学家培根更直接地说:“那种只知自爱却不只爱人的人,最终总是没有好结局的。”
80信任。信任是一种充满人类理性,放射人格光芒的心灵春风。对被信任者来说,得到信任是一种莫大的欣慰,是一种无形的精神支柱。因为拥有信任,心灵与心灵之间不会有让人防不胜防的冷箭。一个聪明的人,善于用信任寻求朋友;一个高明的领导,善于用信任去团结和凝聚共创大业的俊才。有了信任,人生才有亲密无间的友谊;有了信任,人们才能在风雨中同舟共济;有了信任,人们才会在同心同德的真诚合作中,不断孕育追求卓越人生的目标和勇气。
前端常用的框架有哪些?
前端三大框架,是Angular、React、Vue,这三个框架现在是最为流行也是最多人用的框架。
React:
1.声明式设计:React采用声明范式,可以轻松描述应用。
2.高效:React通过对DOM的模拟,最大限度地减少与DOM的交互。
3.灵活:React可以与已知的库或框架很好地配合。
优点:
1.速度快:在UI渲染过程中,React通过在虚拟DOM中的微操作来实现对实际DOM的局部更新。
2.跨浏览器兼容:虚拟DOM帮助我们解决了跨浏览器问题,它为我们提供了标准化的API,甚至在IE8中都是没问题的。
3.模块化:为你程序编写独立的模块化UI组件,这样当某个或某些组件出现问题是,可以方便地进行隔离。
4.单向数据流:Flux是一个用于在JavaScript应用中创建单向数据层的架构5.同构、纯粹的javascript:因为搜索引擎的爬虫程序依赖的是服务端响应而不是JavaScript的执行,预渲染你的应用有助于搜索引擎优化。6.兼容性好:比如使用RequireJS来加载和打包,而Browserify和Webpack适用于构建大型应用。它们使得那些艰难的任务不再让人望而生畏。缺点:React本身只是一个V而已,并不是一个完整的框架,所以如果是大型项目想要一套完整的框架的话,基本都需要加上ReactRouter和Flux才能写大型应用。
Vue:
Vue是尤雨溪编写的一个构建数据驱动的Web界面的库,准确来说不是一个框架,它聚焦在V(view)视图层。
它有以下的特性:
1.轻量级的框架
2.双向数据绑定
3.指令
4.插件化
优点:
1.简单:官方文档很清晰,比Angular简单易学。
2.快速:异步批处理方式更新DOM。
3.组合:用解耦的、可复用的组件组合你的应用程序。
4.紧凑:~18kbmin+gzip,且无依赖。
5.强大:表达式无需声明依赖的可推导属性(computedproperties)。
6.对模块友好:可以通过NPM、Bower或Duo安装,不强迫你所有的代码都遵循Angular的各种规定,使用场景更加灵活。
缺点:
1.新生儿:Vue.js是一个新的项目,没有angular那么成熟。
2.影响度不是很大:google了一下,有关于Vue.js多样性或者说丰富性少于其他一些有名的库。
3.不支持IE8。
Angular:
Angular是一款优秀的前端JS框架,已经被用于Google的多款产品当中。
它有以下的特性:
1.良好的应用程序结构
2.双向数据绑定
3.指令
4.HTML模板
5.可嵌入、注入和测试
优点:
1.模板功能强大丰富,自带了极其丰富的angular指令。
2.是一个比较完善的前端框架,包含服务,模板,数据双向绑定,模块化,路由,过滤器,依赖注入等所有功能;3.自定义指令,自定义指令后可以在项目中多次使用。
4.ng模块化比较大胆的引入了Java的一些东西(依赖注入),能够很容易的写出可复用的代码,对于敏捷开发的团队来说非常有帮助。
5.angularjs是互联网巨人谷歌开发,这也意味着他有一个坚实的基础和社区支持。
缺点:
1.angular入门很容易但深入后概念很多,学习中较难理解。
2.文档例子非常少,官方的文档基本只写了api,一个例子都没有,很多时候具体怎么用都是google来的,或直接问misko,angular的作者。
3.对IE6/7兼容不算特别好,就是可以用jQuery自己手写代码解决一些。
4.指令的应用的最佳实践教程少,angular其实很灵活,如果不看一些作者的使用原则,很容易写出四不像的代码,例如js中还是像jQuery的思想有很多dom操作。
5.DI依赖注入如果代码压缩需要显示声明。
Flutter浪潮下的音视频研发探索
文/陈炉军
整理/LiveVideoStack
大家好,我是阿里巴巴闲鱼事业部的陈炉军,本次分享的主题是Flutter浪潮下的音视频研发探索,主要内容是针对闲鱼APP在当下流行的跨平台框架Flutter的大规模实践,介绍其在音视频领域碰到的一些困难以及解决方案。
分享内容主要分为四个方面,首先会对Flutter有一个简单介绍以及选择Flutter作为跨平台框架的原因,其次会介绍Flutter中与音视频关系非常大的外接纹理概念,以及对它做出的一些优化。之后会对闲鱼在音视频实践过程中碰到的一些Flutter问题提出了一些解决方案——TPM音视频框架。最后是闲鱼Flutter多媒体开源组件的介绍。
Flutter
Flutter是一个跨平台框架,以往的做法是将音频、视频和网络这些模块都下沉到C++层或者ARM层,在其上封装成一个音视频的SDK,供UI层的PC、iOS和Android调用。
而Flutter做为一个UI层的跨平台框架,顾名思义就是在UI层也实现了一个跨平台开发。可以预想的是未Flutter发展的好的话,会逐渐变为一个从底层到UI层的一个全链路的跨平台开发,技术人员分别负责SDK和UI层的开发。
在Flutter之前已经有很多跨平台UI解决方案,那为什么选择Flutter呢?
我们主要考虑性能和跨平台的能力。
以往的跨平台方案比如Weex,ReactNative,Cordova等等因为架构的原因无法满足性能要求,尤其是在音视频这种性能要求几乎苛刻的场景。
而诸如Xamarin等,虽然性能可以和原生App一致,但是大部分逻辑还是需要分平台实现。
我们可以看一下,为什么Flutter可以实现高性能:
原生的native组件渲染以IOS为例,苹果的UIKit通过调用平台自己的绘制框架QuaztCore来实现UI的绘制,图形绘制也是调用底层的API,比如OpenGL、Metal等。
而Flutter也是和原生API逻辑一致,也是通过调用底层的绘制框架层SKIA实现UI层。这样相当于Flutter他自己实现了一套UI框架,提供了一种性能超越原生API的跨平台可能性。
但是我们说一个框架最终性能怎样,其实取决于设计者和开发者。至于现在到底是一个什么状况:
在闲鱼的实践中,我们发现在正常的开发没有特意的去优化UI代码的情况下,在一些低端机上,Flutter界面的流畅性是比Native界面要好的。
虽然现在闲鱼某些场景下会有卡顿闪退等情况,但是这是一个新事物发展过程中的必然问题,我们相信未来性能肯定不会成为限制Flutter发展的瓶颈的。
在闲鱼实践Flutter的过程中,混合栈和音视频是其中比较难解决的两个问题,混合栈是指一个APP在Flutter过程中不可能一口气将所有业务全部重写为Flutter,所以这是一个逐步迭代的过程,这期间原生native界面与Flutter界面共存的状态就称之为混合栈。闲鱼在混合栈上也有一些比较好的输出,例如FlutterBoost。
外接纹理
在讲音视频之前需要简要介绍一下外接纹理的概念,我们将它称之为是Flutter和Frame之间的桥梁。
Flutter渲染一帧屏幕数据首先要做的是,GPU发出的VC信号在Flutter的UI线程,通过AOT编译的机器码结合当前Dart Runtime,生成Layer Tree UI树,Layer Tree上每一个叶子节点都代表了当前屏幕上所需要渲染的每一个元素,包含了这些元素渲染所需要的内容。将Layer Tree抛给GPU线程,在GPU线程内调用Skia去完成整个UI的渲染过程。Layer Tree中有PictureLayer和TextureLayer两个比较重要的节点。PictureLayer主要负责屏幕图片的渲染,Flutter内部实现了一套图片解码逻辑,在IO线程将图片读取或者从网络上拉取之后,通过解码能够在IO线程上加载出纹理,交给GPU线程将图片渲染到屏幕上。但是由于音视频场景下系统API太过繁多,业务场景过于复杂。Flutter没有一套逻辑去实现跨平台的音视频组件,所以说Flutter提出了一种让第三方开发者来实现音视频组件的方式,而这些音视频组件的视频渲染出口,就是TextureLayer。
在整个Layer Tree渲染的过程中,TextureLayer的数据纹理需要由外部第三方开发者来指定,可以把视频数据和播放器数据送到TextureLayer里,由Flutter将这些数据渲染出来。
TextureLayer渲染过程:首先判断Layer是否已经初始化,如果没有就创建一个Texture,然后将Texture Attach到一个SufaceTexture上。
这个SufaceTexture是音视频的native代码可以获取到的对象,通过这个对象创建的Suface,我们可以将视频数据、摄像头数据解码放到Suface中,然后Flutter端通过监听SufaceTexture的数据更新就可以顺利把刚才创建的数据更新到它的纹理中,然后再将纹理交给SKIA渲染到屏幕上。
然而我们如果需要用Flutter实现美颜,滤镜,人脸贴图等等功能,就需要将视频数据读取出来,更新到纹理中,再将GPU纹理经过美颜滤镜处理后生成一个处理后的纹理。按Flutter提供的现有能力,必须先将纹理中的数据从GPU读出到CPU中,生成Bitmap后再写入Surface中,这样在Flutter中才能顺利的更新到视频数据,这样做对系统性能的消耗很大。
通过对Flutter渲染过程分析,我们知道Flutter底层需要渲染的数据就是GPU纹理,而我们经过美颜滤镜处理完成以后的结果也是GPU纹理,如果可以将它直接交给Flutter渲染,那就可以避免GPU-CPU-GPU这样的无用循环。这样的方法是可行的,但是需要一个条件,就是OpenGL上下文共享。
OpenGL
在说上下文之前,得提到一个和上线文息息相关的概念:线程。
Flutter引擎启动后会启动四个线程:
第一个线程是UI线程,这是Flutter自己定义的UI线程,主要负责GPU发出的VSync信号时候用当前Dart编译的机器码和当前运行环境创建出Layer Tree。
还有就是IO线程和GPU线程。和大部分OpenGL处理解决方案中一样,Flutter也采取一个线程责资源加载,一部分负责资源渲染这种思路。
两个线程之间纹理共享有两种方式。一种是EGLImage(IOS是 CVOpenGLESTextureCache)。一种是OpenGL Share Context。Flutter通过Share Context来实现纹理共享,将IO线程的Context和GPU线程的Context进行Share,放到同一个Share Group下面,这样两个线程下资源是互相可见可以共享的。
Platform线程是主线程,Flutter中有一个很奇怪的设定,GPU线程和主线程共用一个Context。并且在主线程也有很多OpenGL 操作。
这样的设计会给音视频开发带来很多问题,后面会详细说。
音视频端美颜处理完成的OpenGL纹理能够让Flutter直接使用的条件就是Flutter的上下文需要和平台音视频相关的OpenGL上下文处在一个Share Group下面。
由于Flutter主线程的Context就是GPU的Context,所以在音视频端主线程中有一些OpenGL操作的话,很有可能使Flutter整个OpenGL被破坏掉。所以需要将所有的OpenGL操作都限制在子线程中。
通过上述这两个条件的处理,我们就可以在没有增加GPU消耗的前提下实现美颜和滤镜等等功能。
TPM
在经过demo验证之后,我们将这个方案应用到闲鱼音视频组件中,但改造过程中发现了一些问题。
上图是摄像头采集数据转换为纹理的一段代码,其中有两个操作:首先是切进程,将后面的OpenGL操作都切到cameraQueue中。然后是设置一次上下文。然后这种限制条件或者说是潜规则往往在开发过程中容易被忽略的。而这个条件一旦忽略后果就是出现一些莫名其妙的诡异问题极难排查。因此我们就希望能抽象出一套框架,由框架本身实现线程的切换、上下文和模块生命周期等的管理,开发者接入框架以后只需要安心实现自己的算法,而不需要关心这些潜规则还有其他一些重复的逻辑操作。
在引入Flutter之前闲鱼的音视频架构与大部分音视频逻辑一样采用分层架构:
1:底层是一些独立模块
2:SDK层是对底层模块的封装
3:最上层是UI层。
引入Flutter之后,通过分析各个模块的使用场景,我们可以得出一个假设或者说是抽象:音视频应用在终端上可以归纳为视频帧解码之后视频数据帧在各个模块之间流动的过程,基于这种假设去做Flutter音视频框架的抽象。
咸鱼Flutter多媒体开源组件
整个Flutter音视频框架抽象分为管线和数据的抽象、模块的抽象、线程统一管理和上下文同一管理四部分。
管线,其实就是视频帧流动的管道。数据,音视频中涉及到的数据包括纹理、Bit Map以及时间戳等。结合现有的应用场景我们定义了管线流通数据以Texture为主数据,同时可以选择性的添加Bit Map等作为辅助数据。这样的数据定义方式,避免重复的创建和销毁纹理带来的性能开销以及多线程访问纹理带来的一些问题。也满足一些特殊模块对特殊数据的需求。同时也设计了纹理池来管理管线中的纹理数据。
模块:如果把管线和数据比喻成血管和血液,那框架音视频的场景就可以比喻成器官,我们根据模块所在管线的位置抽象出采集、处理和输出三个基类。这三个基类里实现了刚才说的线程切换,上下文切换,格式转换等等共同逻辑,各个功能模块通过集成自这些基类,可以避免很多重复劳动。
线程:每一个模块初始化的时候,初始化函数就会去线程管理的模块去获取自己的线程,线程管理模块可以决定给初始化函数分配新的线程或者已经分配过其他模块的线程。
这样有三个好处:
一是可以根据需要去决定一个线程可以挂载多少模块,做到线程间的负载均衡。第二,多线程并发式能够保证模块内的OpenGL操作是在当前线程内而不会跑到主线程去,彻底避免Flutter的OpenGL 环境被破坏。第三,多线程并行可以充分利用CPU多核架构,提升处理速度。
从Flutter端修改Flutter引擎将Context取出后,根据Context创建上下文的统一管理模块,每一个模块在初始化的时候会获取它的线程,获取之后会调用上下文管理模块获取自己的上下文。这样可以保证每一个模块的上下文都是与Flutter的上下文进行Share的,每个模块之间资源都是共享可见的,Flutter和音视频native之间也是互相共享可见的。
基于上述框架如果要实现一个简单的场景,比如画面实时预览和滤镜处理功能,
1:需要选择功能模块,功能模块包括摄像头模块、滤镜处理模块和Flutter画面渲染模块,
2:需要配置模块参数,比如采集分辨率、滤镜参数和前后摄像头设置等,
3:在创建视频管线后使用已配置的参数创建模块
4:最后管线搭载模块,开启管线就可以实现这样简单的功能。
上图为整个功能实现的代码和结构图。
结合上述音视频框架,闲鱼实现了Flutter多媒体开源组件。
组要包含四个基本组件分别是:
1:视频图像拍摄组件
2:播放器组件
3:视频图像编辑组件
4:相册选择组件
现在这些组件正在走内部开源流程。预计9月份,相册和播放器会实现开源。
后续展望和规划
1:实现开头所说的从底层SDK到UI的全链路的跨端开发。目前底层框架层和模块层都是各个平台各自实现,反而是Flutter的UI端进行了跨平台的统一,所以后续会将底层也按照音视频常用做法把逻辑下沉到C++层,尽可能的实现全链路跨平台。
2:第二部分内容为开源共建,闲鱼开源的内容不仅包括拍摄、编辑组件,还包括了很多底层模块,希望有开发者在基于Flutter开发音视频应用时可以充分利用闲鱼开源出的音视频模块能力,搭建APP框架,开发者只要去负责实现特殊需求模块就可以,尽可能的减少重复劳动。
0基础学习前端,需要掌握什么?
对于零基础想要学习web前端的小伙伴来说,不知道从哪学起,也不知道该掌握哪些知识,这里蜗牛学院就给大家整理了一份系统全面的web前端学习路线,希望可以给想要学习web前端的小伙伴带来一些帮助。
第一阶段:专业核心基础
阶段目标:
1. 熟练掌握HTML5、CSS3、Less、Sass、响应书布局、移动端开发。
2. 熟练运用HTML+CSS特性完成页面布局。
4. 熟练应用CSS3技术,动画、弹性盒模型设计。
5. 熟练完成移动端页面的设计。
6. 熟练运用所学知识仿制任意Web网站。
7. 能综合运用所学知识完成网页设计实战。
知识点:
1、Web前端开发环境,HTML常用标签,表单元素,Table布局,CSS样式表,DIV+CSS布局。熟练运用HTML和CSS样式属性完成页面的布局和美化,能够仿制任意网站的前端页面实现。
2、CSS3选择器、伪类、过渡、变换、动画、字体图标、弹性盒模型、响应式布局、移动端。熟练运用CSS3来开发网页、熟练开发移动端,整理网页开发技巧。
3、预编译css技术:less、sass基础知识、以及插件的运用、BootStrap源码分析。能够熟练使用 less、sass完成项目开发,深入了解BootStrap。
4、使用HTML、CSS、LESS、SASS等技术完成网页项目实战。通过项目掌握第一阶段html、css的内容、完成PC端页面设计和移动端页面设计。
第二阶段:Web后台技术
阶段目标:
1. 了解JavaScript的发展历史、掌握Node环境搭建及npm使用。
2. 熟练掌握JavaScript的基本数据类型和变量的概念。
3. 熟练掌握JavaScript中的运算符使用。
4. 深入理解分之结构语句和循环语句。
5. 熟练使用数组来完成各种练习。
6.熟悉es6的语法、熟练掌握JavaScript面向对象编程。
7.DOM和BOM实战练习和H5新特性和协议的学习。
知识点:
1、软件开发流程、算法、变量、数据类型、分之语句、循环语句、数组和函数。熟练运用JavaScript的知识完成各种练习。
2、JavaScript面向对象基础、异常处理机制、常见对象api,js的兼容性、ES6新特性。熟练掌握JavaScript面向对象的开发以及掌握es6中的重要内容。
3、BOM操作和DOM操作。熟练使用BOM的各种对象、熟练操作DOM的对象。
4、h5相关api、canvas、ajax、数据模拟、touch事件、mockjs。熟练使用所学知识来完成网站项目开发。
第三阶段:数据库和框架实战
阶段目标:
1. 综合运用Web前端技术进行页面布局与美化。
2. 综合运用Web前端开发框架进行Web系统开发。
3. 熟练掌握Mysql、Mongodb数据库的发开。
4. 熟练掌握vue.js、webpack、elementui等前端框技术。
5. 熟练运用Node.js开发后台应用程序。
6. 对Restful,Ajax,JSON,开发过程有深入的理解,掌握git的基本技能。
知识点:
1、数据库知识,范式,MySQL配置,命令,建库建表,数据的增删改查,mongodb数据库。深入理解数据库管理系统通用知识及MySQL数据库的使用与管理,为Node.js后台开发打下坚实基础。
2、模块系统,函数,路由,全局对象,文件系统,请求处理,Web模块,Express框架,MySQL数据库处理,RestfulAPI,文件上传等。熟练运用Node.js运行环境和后台开发框架完成Web系统的后台开发。
3、vue的组件、生命周期、路由、组件、前端工程化、webpack、elementui框架。Vue.js框架的基本使用有清晰的理解,能够运用Vue.js完成基础前端开发、熟练运用Vue.js框架的高级功能完成Web前端开发和组件开发,对MVVM模式有深刻理解。
4、需求分析,数据库设计,后台开发,使用vue、node完成pc和移动端整站开发。于Node.js+Vue.js+Webpack+Mysql+Mongodb+Git,实现整站项目完整功能并上线发布。
第四阶段:移动端和微信实战
阶段目标:
1.熟练掌握React.js框架,熟练使用React.js完成开发。
2.掌握移动端开发原理,理解原生开发和混合开发。
3.熟练使用react-native和Flutter框架完成移动端开发。
4.掌握微信小程序以及了解支付宝小程序的开发。
5.完成大型电商项目开发。
知识点:
1、React面向组件编程、表单数据、组件通信、监听、声明周期、路由、Redux基本概念。练使用react完成项目开发、掌握Redux中的异步解决方案Saga。
2、react-native、开发工具、视图与渲染、api操作、Flutter环境搭建、路由、ListView组件、网络请求、打包。练掌握react-native和Flutter框架,并分别使用react-native和Flutter分别能开发移动端项目。
3、微信小程序基本介绍、开发工具、视图与渲染、api操作、支付宝小程序的入门和api学习。掌握微信小程序开发了解支付宝小程序。
4、大型购物网站实战,整个项目前后端分离开发;整个项目分为四部分:PC端网页、移动端APP、小程序、后台管理。团队协作开发,使用git进行版本控制。目期间可以扩展Three.js 、TypeScript。
北京web前端培训机构,出来好找工作吗,需要学哪些内容?
大部分人学习一项技术肯定是以就业为目标,那么学习web前端哪些知识才能找到一份工作?小蜗这里根据行业的变化以及企业的用人需求,整理了一份web前端的学习路线,只要掌握了以下内容,找到一份工作基本不难。
第一阶段:专业核心基础
阶段目标:
1. 熟练掌握HTML5、CSS3、Less、Sass、响应书布局、移动端开发。
2. 熟练运用HTML+CSS特性完成页面布局。
4. 熟练应用CSS3技术,动画、弹性盒模型设计。
5. 熟练完成移动端页面的设计。
6. 熟练运用所学知识仿制任意Web网站。
7. 能综合运用所学知识完成网页设计实战。
知识点:
1、Web前端开发环境,HTML常用标签,表单元素,Table布局,CSS样式表,DIV+CSS布局。熟练运用HTML和CSS样式属性完成页面的布局和美化,能够仿制任意网站的前端页面实现。
2、CSS3选择器、伪类、过渡、变换、动画、字体图标、弹性盒模型、响应式布局、移动端。熟练运用CSS3来开发网页、熟练开发移动端,整理网页开发技巧。
3、预编译css技术:less、sass基础知识、以及插件的运用、BootStrap源码分析。能够熟练使用 less、sass完成项目开发,深入了解BootStrap。
4、使用HTML、CSS、LESS、SASS等技术完成网页项目实战。通过项目掌握第一阶段html、css的内容、完成PC端页面设计和移动端页面设计。
第二阶段:Web后台技术
阶段目标:
1. 了解JavaScript的发展历史、掌握Node环境搭建及npm使用。
2. 熟练掌握JavaScript的基本数据类型和变量的概念。
3. 熟练掌握JavaScript中的运算符使用。
4. 深入理解分之结构语句和循环语句。
5. 熟练使用数组来完成各种练习。
6.熟悉es6的语法、熟练掌握JavaScript面向对象编程。
7.DOM和BOM实战练习和H5新特性和协议的学习。
知识点:
1、软件开发流程、算法、变量、数据类型、分之语句、循环语句、数组和函数。熟练运用JavaScript的知识完成各种练习。
2、JavaScript面向对象基础、异常处理机制、常见对象api,js的兼容性、ES6新特性。熟练掌握JavaScript面向对象的开发以及掌握es6中的重要内容。
3、BOM操作和DOM操作。熟练使用BOM的各种对象、熟练操作DOM的对象。
4、h5相关api、canvas、ajax、数据模拟、touch事件、mockjs。熟练使用所学知识来完成网站项目开发。
第三阶段:数据库和框架实战
阶段目标:
1. 综合运用Web前端技术进行页面布局与美化。
2. 综合运用Web前端开发框架进行Web系统开发。
3. 熟练掌握Mysql、Mongodb数据库的发开。
4. 熟练掌握vue.js、webpack、elementui等前端框技术。
5. 熟练运用Node.js开发后台应用程序。
6. 对Restful,Ajax,JSON,开发过程有深入的理解,掌握git的基本技能。
知识点:
1、数据库知识,范式,MySQL配置,命令,建库建表,数据的增删改查,mongodb数据库。深入理解数据库管理系统通用知识及MySQL数据库的使用与管理,为Node.js后台开发打下坚实基础。
2、模块系统,函数,路由,全局对象,文件系统,请求处理,Web模块,Express框架,MySQL数据库处理,RestfulAPI,文件上传等。熟练运用Node.js运行环境和后台开发框架完成Web系统的后台开发。
3、vue的组件、生命周期、路由、组件、前端工程化、webpack、elementui框架。Vue.js框架的基本使用有清晰的理解,能够运用Vue.js完成基础前端开发、熟练运用Vue.js框架的高级功能完成Web前端开发和组件开发,对MVVM模式有深刻理解。
4、需求分析,数据库设计,后台开发,使用vue、node完成pc和移动端整站开发。于Node.js+Vue.js+Webpack+Mysql+Mongodb+Git,实现整站项目完整功能并上线发布。
第四阶段:移动端和微信实战
阶段目标:
1.熟练掌握React.js框架,熟练使用React.js完成开发。
2.掌握移动端开发原理,理解原生开发和混合开发。
3.熟练使用react-native和Flutter框架完成移动端开发。
4.掌握微信小程序以及了解支付宝小程序的开发。
5.完成大型电商项目开发。
知识点:
1、React面向组件编程、表单数据、组件通信、监听、声明周期、路由、Redux基本概念。练使用react完成项目开发、掌握Redux中的异步解决方案Saga。
2、react-native、开发工具、视图与渲染、api操作、Flutter环境搭建、路由、ListView组件、网络请求、打包。练掌握react-native和Flutter框架,并分别使用react-native和Flutter分别能开发移动端项目。
3、微信小程序基本介绍、开发工具、视图与渲染、api操作、支付宝小程序的入门和api学习。掌握微信小程序开发了解支付宝小程序。
4、大型购物网站实战,整个项目前后端分离开发;整个项目分为四部分:PC端网页、移动端APP、小程序、后台管理。团队协作开发,使用git进行版本控制。目期间可以扩展Three.js 、TypeScript。
web前端学习路线思维导图
自学前端,前端开发的学习路线是什么?
自学前端其实很辛苦,需要有强大的自制力和坚持下去的学习心,并且做好详细的学习规划严格执行;如果你想学前端,下面的学习路线或许对你有帮助。
前端完整学习路线
第一阶段:
HTML CSS:HTML进阶、CSS进阶、div css布局、HTML css整站开发。
JavaScript基础:Js基础教程、js内置对象常用方法、常见DOM树操作大全、ECMAscript、DOM、BOM、定时器和焦点图。
JS基本特效:常见特效、例如:tab、导航、整页滚动、轮播图、JS制作幻灯片、弹出层、手风琴菜单、瀑布流布局、滚动事件、滚差视图。
JS高级特征:正则表达式、排序算法、递归算法、闭包、函数节流、作用域链、基于距离运动框架、面向对象基础。
JQuery:基础使用悬着器、DOM操作、特效和动画、方法链、拖拽、变形、JQueryUI组件基本使用。
第二阶段:HTML5和移动Web开发
HTML5:HTML5新语义标签、HTML5表单、音频和视频、离线和本地存储、SVG、Web Socket、Canvas。
CSS3:CSS3新选择器、伪元素、脸色表示法、边框、阴影、background系列属性改变、Transition、动画、景深和深透、3D效果制作、Velocity.js框架、元素进场、出场策略、炫酷CSS3网页制作。
Bootstrap:响应式概念、媒体查询、响应式网站制作、删格系统、删格系统原理、Bootstrap常用模板、LESS和SASS。
移动Web开发:跨终端WEB和主流设备简介、视口、流式布局、弹性盒子、rem、移动终端JavaScript事件、手机中常见JS效果制作、Zepto.js、手机聚划算页面、手机滚屏。
第三阶段:HTTP服务和AJAX编程
WEB服务器基础:服务器基础知识、Apache服务器和其他WEB服务器介绍、Apache服务器搭建、HTTP介绍。
PHP基础:PHP基础语法、使用PHP处理简单的GET或者POST请求。
AJAX上篇:Ajax简介和异步的概念、Ajax框架的封装、XMLHttpRequest对象详细介绍方法、兼容性处理方法、Ajax框架的封装、Ajax中缓存问题、XML介绍和使用。
AJAX下篇:JSON和JSON解析、数据绑定和模板技术、JSONP、跨域技术、图片预读取和lazy-load技术、JQuery框架中的AjaxAPI、使用Ajax实现爆布流案例额。
第四阶段:面向对象进阶
面向对象终极篇:从内存角度到理解JS面向对象、基本类型、复杂类型、原型链、ES6中的面向对象、属性读写权限、设置器、访问器。
面向对象三大特征:继承性、多态性、封装性、接口。
设计模式:面向对象编程思维、单例模式、工厂模式、策略模式、观察者模式、模板方法模式、代理模式、装饰者模式、适配器模式、面向切面编程。
第五阶段:封装一个属于自己的框架
框架封装基础:事件流、冒泡、捕获、事件对象、事件框架、选择框架。
框架封装中级:运动原理、单物体运动框架、多物体运动框架、运动框架面向对象封装。
框架封装高级和补充:JQuery框架雏形、可扩展性、模块化、封装属于传智自己的框架。
第六阶段:模块化组件开发
面向组件编程:面向组件编程的方式、面向组件编程的实现原理、面向组件编程实战、基于组件化思想开发网站应用程序。
面向模块编程:AMD设计规范、CMD设计规范、RequireJS,LoadJS、淘宝的SeaJS。
第七阶段:主流的流行框架
Web开发工作流:GIT/SVN、Yeoman脚手架、NPMer依赖管理工具、Grunt/Gulp/Webpack。
MVC/MVVM/MVW框架:Angular.js、Backbone.js、Knockout/Ember。
常用库:React.js、Vue.js、Zepto.js。
第八阶段:HTML5原生移动应用开发
Cordova:WebApp/NativeApp/HybirdApp简介、Cordova简介、与PhoneGap之间的关系、开发环境搭建、Cordova实战(创建项目,配置,编译,调试,部署发布)。
Ionic:Ionic简介和同类对比、模板项目解析、常见组件及使用、结合Angular构建APP、常见效果(下拉刷新,上拉加载,侧滑导航,选项卡)。
React Native:React Native简介、React Native环境配置、创建项目,配置,编译,调试,部署发布、原生模块和UI组件、原生常用API。
HTML5 :HTML5 中国产业联盟、HTML5 Plus Runtime环境、HBuilder开发工具、MUI框架、H5 开发和部署。
第九阶段: Node.js全栈开发:
快速入门:Node.js发展、生态圈、Io.js、Linux/Windows/OS X环境配置、REPL环境和控制台程序、异步编程,非阻塞I/O、模块概念,模块管理工具、开发流程,调试,测试。
核心模块和对象:全局对象global,process,console,util、事件驱动,事件发射器、加密解密,路径操做。
祝你学有所成!
本文标题:flutter循环渲染,flutter for web渲染html
网页路径:http://scyanting.com/article/dseohcp.html