前言
我目前从事Flutter桌面应用的开发,深刻领会到Flutter功能的强大。Flutter对于桌面的支持已经很不错了,网络、数据库、UI界面这三者都已经完备。在众多开发者的推动之下,Flutter正在不断壮大和完善,我相信它的未来是光明的。
Flutter框架中内置的Widget有300多个,对于一个初学者而言,把它们全都看完是不现实的,也没有必要。很多初学者认为Widget是Flutter的一切,其实Widget只是半壁江山,Flutter还拥有强大的绘制接口、异步处理能力、完整的网络、文件操作接口以及状态管理工具。
本书主要想让初学者对Flutter有一个比较全面的认识。我觉得一次学习过程就像一次旅行,对我们要去的地方从全然不知,到渐渐熟悉,当我回首时,发现这一路的成长中包括了困惑、犹豫、兴奋、痛苦、快乐。现在,我又回到了起点,背起行囊带你一起出发,一点点去认识Flutter。
旅途之初,我会为你备好行囊和工具:介绍Debug和开发工具,然后介绍Dart语言和基础的组件使用。本书介绍了很多实用的组件,以及动画、路由,还介绍了一些Flutter框架渲染层的知识和相关源码,虽然不是非常深入,但会让你对Flutter的了解更加深入。本书还包括数据的处理和状态管理、异步处理、数据库操作等,最后介绍了插件和混合开发。
本书没有把纷繁复杂的组件都讲了,只挑一些重要的组件深入剖析,让读者学会认识组件。为了让读者掌握如此多的组件,我特意开源了一个FlutterUnit项目,地址为https://github.com/toly1994328/FlutterUnit。其中收录了约250个组件,每一个组件都会附加详细的说明和示例代码。这个项目目前已支持Android、iOS、MacOS和Windows系统,可以帮初学者快速、直观地了解Flutter中有哪些组件可以使用,以及如何使用。FlutterUnit项目可以全面搜索并具备完整的分类,可以很容易地找到想要了解的组件。开源的另一个好处就是方便更新与修改。
由于Flutter多平台的特性,它的环境配置、开发环境搭建、模拟器运行等操作比较多,也比较简单。但是实际应用中总会遇到一些问题,为此我综合考虑了很多,最后决定在FlutterUnit项目中也列出问题及解决方案。在项目的主页里还列出了关于Flutter在各平台上的配置方面的文章。另外,我会不定期在Issues中分享一些经验和错误处理方式,当然你也可以一起分享,这也是建立FlutterUnit的初衷。后期会根据Issues的分享将其加入FlutterUnit中,作为入门者的最佳助力。此外,在Issues的point标签中,还会收录一些易错点和要点,对本书的勘误也在Issues中指出。FlutterUnit是我的个人开源行为,任何人都可以享用。
本书主要面向有一定编程经验的读者,对基础知识讲解不多,如果你觉得本书太难,那你需要自行补充一些基础的编程知识。遇到困难试着多读几遍,对着源码仔细推敲,或许就能豁然开朗。如果书中存在错误,还请读者见谅,有任何建议也请及时联系我。
本书的源码规划
本书用的源码Flutter SDK版本为1.12.13+hotfix.8。许多编程书的demo案例都按照章节组织,或每个知识点是一个小项目,这有很大的缺点:找起来比较麻烦,而且打开一个项目也很费时间,更大的问题的是项目产生的垃圾很占内存。所以按知识点分立项目并不可取。
由于Flutter可以让一个个知识点独立成Widget进行展现,因此本书将所有代码放在同一个项目中。在学习的过程中你可以新建一个空白项目,然后一点一点累积成源码的结构,记录自己的成长。
例如,每章的源码在一个day里,每个day中有相应的知识点包,每个包里都有一个可运行的main.dart文件,每一个包代表一个小知识点或小节。这样就可以独立记录细碎的知识点,并且很清楚地记录它如何一步步演变,比如状态管理如何一步步演变得更优雅。
另外,Flutter可以指定运行的main入口,这就让这种处理方式更加优雅,如下图右侧所示,这样每个小的知识点包也可以作为单独的运行块。你可以快速切换,以查看该小节知识点运行的情况。也就是说,花3秒就能切换一个知识点。如果知识点在一个单独的项目里,那么切换一个知识点至少需要一分钟,也无法感受到知识的连贯性。
但这样做也会存在一个缺点,就是如果一个项目中代码过多,那么定位知识点会比较麻烦。一个服务器上的数据资源也是非常多而杂乱的,但是可以很方便地获取特定资源,这归功于统一资源定位符,即URL。
具体进行如下处理:你会发现在书中的相关源码处专门有个头标指向源码的地址,如下图所示。这样你可以迅速定位到相关位置,只要运行该包下的main.dart就可以立刻看到该知识点的展示效果。你可以将它看作内存寻址,源码就是资源库,而标识就是指向某一资源的指针,使用该指针就能打开相应的资源。
希望书和源码两者结合能擦出智慧的火花,为你的阅读过程带来便利。
关于Widget图鉴
为了让大家对Flutter组件有整体的认识,我特意制作了Widget图鉴,地址为https://github.com/toly1994328/FlutterUnit/tree/master/widgets_unity。
这些图鉴以图片形式放在FlutterUnit项目中,这样方便维护和更新。其中包含大多数常用的Widget,图鉴中的每个组件都可以在FlutterUnit项目源码中看到。图鉴主要包括StatelessWidget、StatefulWidget、SingleChildRenderObjectWidget和MultiChildRender-ObjectWidget组件,这四种组件涵盖了日常工作中使用的绝大多数组件。
图鉴提供常用Widget的基本效果图,对常用的属性进行标注,主要目的是让初学者更直观地了解常用组件,不至于被众多组件弄糊涂。如果想要看某个图鉴具体效果的实现,可以在FlutterUnit项目中通过全局搜索获得。
你也可以在FlutterUnit的App中搜索,其中每个组件都有详情介绍。每个知识点都会有对应的组件使用效果,点击右侧的折叠按钮,可以展开对应的代码,并且提供代码的复制功能,这样你可以很方便地得到一个组件用法的源码。
本书知识规划
我在写作时更想专注于Flutter技术本身,希望让你在每一页都能学到东西。我还想向你分享一些我的思考方式和对问题的见解。另外,书中有大量的图片、类比的手法,相信你在读书过程中不会觉得太无趣。希望让你有种背上行囊随我旅行12天,我们共同见证、欣赏Flutter世界的感觉。
Day 1:初识Flutter与技能储备。首先,重新认识Flutter初始项目,并在此基础上提出两个问题,借这两个问题来介绍Debug的使用方法。然后,介绍Android Studio中针对Flutter的实用工具,“磨刀不误砍柴工”,把“拖鞋”换成“运动鞋”再开始旅行。最后,分享一些关于Flutter中Widget的见解,从整体上先感受一下Widget,再说明组件抽离的必要性,不要把所有鸡蛋(组件)放在同一个篮子(文件)里。
Day 2:Dart实用语法速览。Dart作为新时代的编程语言,有着优秀且优雅的语法。本章分别从基础语法、面向对象和Dart特殊语法三个层面展开对Dart语法的介绍,并结合实际使用以及源码来学习。
Day 3:界面风格和简单绘制。介绍Flutter中的两种界面风格,以及一个简单的App界面如何搭建。对Flutter的视图层有一个整体的认知将为之后的学习打下基础。另外,还介绍Flutter中的简单绘制,可以看出Android等其他平台的绘制技能在Flutter中完全适用。
Day 4:基础Widget。首先通过基础的图文组件介绍属性的使用,以及批量制作某属性的对比图,让你摆脱“属性黑洞”的束缚。然后以图解的形式对容器组件和多子组件进行介绍,使你更直观地认识各个属性的作用,进而掌握基本的布局功能。
Day 5:列表与滑动。首先讲述如何将一个组件抽离,封装成条目以供列表使用,再通过ListView填充数据展现条目,通过一个聊天界面介绍如何实现下拉和上拉的功能。然后对滑动控制器和其他滑动进行介绍,如单子滑动组件和GridView、PageView以及Sliver家族。
Day 6:动画与路由。详细介绍在Flutter中如何实现动画,从一开始的运动盒到可以动态变化的n角星,努力揭示了动画的本质。然后介绍如何简化和封装组件,让动画更加强大、好用。本章介绍路由的跳转、传参、回参、管理、动画等知识,将路由放在这里是因为路由与动画有所关联,掌握这些知识就可以创建一个相对复杂的界面系统。
Day 7:手势组件与自定义组件。如果一个组件经常被用到,或者可以独立于项目之外分享给很多人用,那么封装成一个自定义组件是很好的方式。本章先简单介绍Flutter中手势的处理,并自定义一个手写板,然后通过原生组件实现自定义组件;通过绘制组件可以了解如何在Flutter的画板上绘制文字和图片,以及进行一些复杂的数学计算。
Day 8:Flutter渲染机制。本章将深入Flutter框架层的源码中,谈论Widget、RenderObject、Element三棵树,介绍Flutter的main函数是如何运行的,以及Element的加载流程,最后全面介绍State及其生命周期。
Day 9:异步与资源。本章将介绍异步与流这个强大武器,并通过文件的操作加深对两者的理解。然后介绍Flutter网络请求的方式以及对数据资源的处理方式。
Day 10:数据共享与状态管理。本章先介绍数据传输中InheritedWidget的解决方案,然后介绍状态管理的处理过程以及FutureBuilder和StreamBuilder的用法,最后介绍BLoC、Provider、Redux三个状态管理工具及其使用案例。
Day 11:数据持久化和读取。本章分别从数据库、json数据文件、XML配置文件来介绍如何进行持久化处理,并介绍如何访问数据库,查询结果并填充界面,并通过界面完成增、删、改、查操作。
Day 12:插件及混合开发。首先介绍Flutter和原生平台的通信机制,之后介绍几个常用的插件,包括路径和权限申请、音频播放、视频播放、图片拾取、Web页面,最后介绍Flutter与原生平台的混合开发。
最后,感谢家人和伙伴们的支持和建议,感谢吴怡编辑的邀请,让我有机会将这些技术知识分享给大家。希望大家在学习过程中能够收获满满。Flutter的旅程即将开始,试着深呼吸一下,和我一起出发吧,去见证Flutter的奇妙世界!
张德立(张风捷特烈)
于2020年3月10日