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产生兴趣,加入进来吧!



相关文章
|
8天前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
36 0
|
1天前
|
前端开发 JavaScript 开发者
现代前端框架激烈交锋,高效响应式 Web 界面的归属扑朔迷离!
【9月更文挑战第6天】本文通过实际案例,比较了主流前端框架 Vue.js、React 和 Angular 的特点与优势。Vue.js 以简洁的语法和灵活的组件化架构著称,适合小型到中型项目;React 强调性能和可扩展性,适用于大型应用;Angular 凭借全面的功能和严格架构,适合企业级开发。开发者应根据项目需求和技术栈选择合适的框架。
9 0
|
7天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
25 0
|
7天前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
14 0
|
7天前
|
API Java Python
API的神秘面纱:从零开始构建你的RESTful服务
【8月更文挑战第31天】在现代网络应用开发中,RESTful API已成为数据交互的标准。本文通过比较流行的技术栈(如Node.js、Python的Django和Flask、Java的Spring Boot)及其框架,帮助你理解构建RESTful API的关键差异,涵盖性能、可扩展性、开发效率、社区支持、安全性和维护性等方面,并提供示例代码和最佳实践,指导你选择最适合项目需求的工具,构建高效、安全且易维护的API服务。
16 0
|
7天前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
11 0
|
7天前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
31 0
|
7天前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
26 0
|
7天前
|
前端开发 JavaScript 大数据
React与Web Workers:开启前端多线程时代的钥匙——深入探索计算密集型任务的优化策略与最佳实践
【8月更文挑战第31天】随着Web应用复杂性的提升,单线程JavaScript已难以胜任高计算量任务。Web Workers通过多线程编程解决了这一问题,使耗时任务独立运行而不阻塞主线程。结合React的组件化与虚拟DOM优势,可将大数据处理等任务交由Web Workers完成,确保UI流畅。最佳实践包括定义清晰接口、加强错误处理及合理评估任务特性。这一结合不仅提升了用户体验,更为前端开发带来多线程时代的全新可能。
11 0
|
7天前
|
前端开发 JavaScript 微服务
探索现代Web开发中的微前端架构
在今天的Web开发世界,应用程序的复杂性与日俱增,传统的单体前端架构已经难以满足日益增长的需求。微前端架构应运而生,成为解决大型应用开发和维护挑战的一种有效方式。本文深入探讨微前端的核心概念、优缺点,以及如何在实际项目中应用这种架构,助力团队更好地应对复杂的前端开发需求。
下一篇
DDNS