Web前端工程师Flutter快速入门,大佬勿入!

简介: 本篇文章中将结合一些我曾经文章里的内容,整合为一篇面向Web前端工程师的Flutter入门教程。

跨端开发的前世今生


大帅曾经是一名闪客



之所以提到这个,是因为我说Flash是曾经的Web1.0时代的跨端之王,应该没有人反对吧(我个人拿Flash做过网页,在当时还没有Adobe AIR的时候,我就拿.net +

ActiveObjectX实现过桌面端),后来的ActionScript3.0更是ES4的唯一实现。不过那个时候还没有诞生移动互联网,直到乔帮主给Flash下了驱逐令。


跨端真正变成一种开发方式,要从移动互联时代开始说起


1.基于Webview的跨端模式


就是使用网页浏览容器(Webview)来呈现html页面,配合Webview和原生系统的通讯api,可以调用原生方法。优点是开发效率高,成本最低,缺点是Webview的内存开销较高,启动白屏问题以及没有原生的页面跳转体验等(这个问题后来的引擎通过webview多开都解决了)。


2.使用JS+受限的HTML和CSS的Native渲染模式


为了解决Webview跨端的问题,另一种新的方案被提出来。代码仍然使用Javascript编写,运行在独立的JS内核(如JSCore,V8)中,使用受限的HTML,受限的CSS来编写界面,但最终会使用原生的UI框架来渲染(如UIKit)。Facebook旗下的RN,Apache基金会的Weex都属于这种方式。


3.Hybrid渲染模式


注意,不是混合开发,而是指混合渲染。是在一个页面里既使用Webview来渲染又使用原生的UI来渲染。比如微信小程序


image.png


第2,3种方式都有一个问题,就是JS代码是运行在独立的JS内核中,和视图层的渲染不在一个线程里,那逻辑层和视图层里的数据要互通,会有通讯折损,这个时间差大部分时候我们感受不到。但我们去尝试做一个跟手的交互效果,就能明显感受到。


image.png


为了解决这个问题,在RN/Weex里我们有了BindingX方案,微信小程序里有了WXS方案。


自渲染的Flutter


Flutter是自己“独创”的一套渲染模式,即不使用webview来渲染,也不使用原生UI来渲染,而是自己实现了一套声明式的UI体系,然后在画布里画出来。


这套东西并不新鲜


十几年前的Flash也是“自渲染”呀,当年就很多“传统工程师”反映在Flash里做UI太麻烦了,后来有了第三方的UI框架Aswing等,再后来有了Flex。各种知名的游戏引擎也是如此,比如Unity3D,Unreal。


image.png


游戏里不也有各种UI吗?它们的跨端表现不也是一致的吗?游戏里要绘制那么多图形,浮点运算,3D渲染....效率不也挺高的吗?


所以,别被这些新词搞蒙了,“自渲染”就是自己有一套规范约束声明UI,然后自己在一个独立的“画布”里把它们绘制出来。这个画布在游戏引擎里叫OpenGL,WebGL....在Flutter里,它叫SGL(SkiaGraphicsLibrary)。


image.png


Skia本身就很强大,Chrome浏览器,Android系统的底层绘制库都是它。


Dart语言


对于Web前端开发者而言,Dart绝对不是把你拦在门外的因素,毕竟Dart语言也是ECMA的标准。但Dart在提供一些新特性的同时,也有其特立独行的一面,这些差异会增加Web前端开发者的学习和记忆成本。


image.png



举个简单的例子,获取一个0.0到1.0之间的随机浮点值


//JS的随机浮点值
Math.random();
//Dart的随机浮点值
Random().nextDouble();


//JS的数组
var list = [];
list.push(1);
list.push(2,3,4);
//Dart的数组
var list = [];
list.add(1);
list.addAll([2,3,4]);


像这样的差异还有挺多,如果你的工作需要在两种语言间反复切换,那就换个工作吧~~ 哈哈:p!开个玩笑,但你应该感受到了什么叫做记忆成本的增加。


安装Flutter开发环境


这里就不废话了,请查看 安装教程 。开发环境支持Win/Mac/Linux。


image.png


不安装开发环境,我们也能在网页里 dartpad.cn 来编写调试感受一下Dart和Flutter的魅力


image.png


IDE选择


  • VSCode


安装插件:Flutter,Dart,Bracket Pair Colorizer,Awesome Flutter Snippets


  • Android Studio


无论是是否使用Android Studio来编写Dart代码,Android Studio都是Flutter开发环境安装的必选项。


我平时属于经常在多个前端语言里切换的,主要使用的IDE就是VSCode,所以我基本不使用Android Studio。但我在看了很多其他大佬的视频后发现,Android Studio更配Flutter,有一些特性VSCode里暂时还没有插件可以实现。


嵌套地狱?


Flutter是一种声明式UI框架,每个组件,会有个build函数,这里会返回一个能够完整描述UI的对象结构。


而Flutter的嵌套地狱问题,主要就来自这个声明式UI的特性。我们可以用拆解嵌套来解决嵌套过深的问题,但嵌套的究竟是什么?


image.png


image.png


来,让我换一个说法给你介绍


声明式UI 就是 虚拟Dom


万物皆Widgets!


万物皆Widgets ,一切皆组件 这样的话很多文章都说过了。


我提一,不是,提一句


子不教,父之过


  • 当儿子没有这个能力的时候,找他爹!
  • 他爹没有这个能力的时候,找他爷爷!
  • 他爹没有这个能力的时候,是不是可以换个爹!


image.png


我把官方文档中列举的所有Widgets做成一个脑图


微信搜索 大帅老猿 关注后回复 flutter 即可下载


Flutter项目基本结构


创建项目


flutter create projectname


配置文件


pubspec.yaml


这个文件就等于我们熟悉的packages.json


  • 配置依赖


dependencies:
  flutter:
    sdk: flutter
  flame: ^1.0.0-rc5
dev_dependencies:
  flutter_test:
    sdk: flutter


  • 配置图片和字体


assets:
    - assets/images/
    - assets/images/xxx.jpg
fonts:
    - family: MyFont
      fonts:
        - asset: assets/fonts/myfont.ttf


pubspec.yaml的配置采用缩进式结构体,在配置时要注意缩进的规则。


入口代码


lib/main.dart


你所有的代码都应该在lib这个文件夹下,你可以根据自己的习惯来组织你的代码。


项目内常用命令


查看当前可run的设备列表


flutter devices


将Flutter项目运行到设备列表中的默认项


flutter run


将Flutter项目运行到设备列中的指定设备


flutter run -d macos


入门demo之点不到的按钮


image.png


界面里有一个按钮,点击后就随机改变坐标


double left = 100;//x坐标
double top = 100;//y坐标
//爷爷是Stack,爸爸是Positioned,儿子是ElevatedButton
Stack(
    children:[
        Positioned(
            left:left,  //x坐标
            top:top,   //y坐标
            child:ElevatedButton(
                child:Text("点我呀"),
                onPressed:(){
                    setState((){
                        left = Random().nextDouble()*300;
                        top = Random().nextDouble()*300;
                    })
                }
            )
        )
    ]
)


加入动画

位置改变的时候加入动画效果?So easy~


Flutter的Widget封装得太好了,记得我们前面说的。


儿子不行找爸爸

爸爸不行,换一个爸爸


我们只需要把Positioned换成AnimatedPositioned,然后设置一下动画持续时长


Stack(
    children:[
        AnimatedPositioned(
            duration:Duration(millsecond:500),//动画持续500毫秒
            left:left,  //x坐标
            top:top,   //y坐标
            child:ElevatedButton(
                child:Text("点我呀"),
                onPressed:(){
                    setState((){
                        left = Random().nextDouble()*300;
                        top = Random().nextDouble()*300;
                    })
                }
            )
        )
    ]
)


image.png


Flutter里的路由


使用Navigator


推入新页面

Navigator.push(context, MaterialPageRoute(builder: (BuildContext context){
    return PageDetail();
}));


退出当前页


Navigator.pop(context);


动画之神奇移动?


两个路由页之间相同元素的动画怎么做?比如A页面是个通讯录列表页,B页面是点击之后的联系人详情页。A页面的头像和昵称要以动画的方式移动到B页面里的状态。

好好感受一下这个动画,它在两个页面之间


image.png


在其它框架里,要实现这个动画效果,要么你创建一个独立于两个页面的顶级元素,在A页面的动画开始时隐藏元素,B页面先隐藏元素推入,在动画结束后再将其显示出来。要么把两个页面整合到一个页面里。


而在Flutter里,我们只需要用Hero动画将目标动画元素包裹起来,即可直接实现。


//A页面
Hero(
  tag: "logo", 
  child: FlutterLogo(
  size: 64,
)


//B页面
Hero(
  tag: "logo", 
  child: FlutterLogo(
  size: 128,
)


就是这么简单!


结束语


简简单单的一个入门导读,并没有特别系统的介绍到Flutter的方方面面,但希望能让更多的Web前端工程师们对Flutter产生兴趣,加入进来吧!



相关文章
|
1月前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
58 3
|
1月前
|
前端开发 JavaScript
探索现代Web应用的微前端架构
【10月更文挑战第40天】在数字时代的浪潮中,Web应用的发展日益复杂多变。微前端架构作为一种新兴的设计理念,正逐步改变着传统的单一前端开发模式。本文将深入探讨微前端的核心概念、实现原理及其在实际项目中的应用,同时通过一个简单的代码示例,揭示如何将一个庞大的前端工程拆分成小而美的模块,进而提升项目的可维护性、可扩展性和开发效率。
|
22天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
31 6
|
1月前
|
消息中间件 前端开发 JavaScript
探索微前端架构:构建现代Web应用的新策略
本文探讨了微前端架构的概念、优势及实施策略,旨在解决传统单体应用难以快速迭代和团队协作的问题。微前端允许不同团队独立开发、部署应用的各部分,提升灵活性与可维护性。文中还讨论了技术栈灵活性、独立部署、团队自治等优势,并提出了定义清晰接口、使用Web组件、状态管理和样式隔离等实施策略。
|
1月前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
1月前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
37 3
|
1月前
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
48 2
|
2月前
|
人工智能 前端开发
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
|
2月前
|
存储 前端开发 JavaScript
从 Web 2.0 到 Web 3.0:前端开发的历史与未来
【10月更文挑战第4天】本文探讨了从 Web 2.0 到 Web 3.0 的前端开发演变过程。Web 2.0 时代,前端开发者从静态网页设计走向复杂交互,技术框架如 jQuery、React 和 Vue 带来了巨大的变革。而 Web 3.0 以区块链技术为核心,带来了去中心化的互联网体验,前端开发者面临与区块链交互、去中心化身份验证、分布式存储等新挑战。文章总结了 Web 2.0 和 Web 3.0 的核心区别,并为开发者提供了如何应对新技术的建议,帮助他们在新时代中掌握技能、设计更安全的用户体验。
66 0
从 Web 2.0 到 Web 3.0:前端开发的历史与未来
|
1月前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
52 0