人们经常问我的一个问题是。
我如何在Flutter中建立一个电子商务/订餐/Uber克隆的应用程序?
虽然我的全职工作是创建Flutter教程和课程,但我没有时间为每一个应用程序制作教程。
最重要的是,你不应该为了建立你自己的应用程序而需要依赖教程。
在这里,我分享了我如何构建复杂应用程序的心理过程,以及一些关于如何有效学习的提示。
TL;DR:通过不断地学习、练习和获得反馈,你将能够更快地进步。
让我们来了解一下所有的细节。👇
编码=玩乐高(有点)
我的看法是,构建应用程序就像玩乐高一样。
当你玩乐高积木的时候,你可以通过把更小的积木放在一起做成复杂的东西--呃--乐高积木。😅
照片:Xavi CabreraonUnsplash
当涉及到应用开发时,你可以通过将代码组成的较小的积木放在一起来制作复杂的应用。
因此,如果你想在构建复杂的Flutter应用程序方面取得好成绩,你需要一些深入的知识。
- Dart语言
- Flutter的基础和API
这些是您工作的工具。而且您需要好好学习它们。
但这还不够。您还需要了解
- 编程原则(SOLID)
- 设计模式
- 调试
- 一些核心软件包,这样你就不必重新发明轮子了
以及更多。
学习上述所有内容需要时间。
但更需要时间的是,在你充分理解基础之前,试图建立一个复杂的应用程序。
如果你没有坚实的基础,你就会挣扎,被卡住,并在StackOverflow上等待几个小时或几天的答案。😭
反过来说,一旦你有了坚实的基础,你至少会对如何进行下去有一些认识,而不需要太多的外部帮助。
所有这些听起来不错,但你可能会想。"好吧,但是...我还没到那一步,我仍然不知道如何建立复杂的应用程序。哼!"。
我如何构建复杂的应用程序
事实证明,我在过去的几个月里建立了一个复杂的习惯跟踪应用程序,并为此创建了一个完整的Flutter课程。而我即将分享我是如何做到的。
这款应用是App Store上顶级健康与健身应用之一的克隆,这里是作为Flutter网页演示的最终结果。
Streaks App Clone。注意:如果在移动端不工作,请在桌面上试试。
尽管多年来我已经建立了许多复杂的应用程序,但这对我来说仍然是一个挑战,因为这个应用程序有很多自定义的UI和动画。我不知道如何在前期实现这些功能,在开始之前我也不太了解Flutter动画的情况。
因此,我想分享我在尝试建立这个复杂的应用程序时的思考过程。
而且我可以保证,在完成这个项目之前,我有几个错误的开始,经历了很多试验和错误。但我没有被卡住,并为一路上遇到的每个问题找到了解决方案。
那么,我是如何做到的呢?
对现有的应用程序进行逆向工程
这个项目的目标是创建一个现有应用程序的工作克隆。因此,我从App Store下载了Streaks应用程序,并花了很多时间来弄清楚哪些是主要的构件,以及如何实现每个功能。
一些最具挑战性的功能是。
- 用点击和保持的手势控制的动画任务完成环
- 可以通过程序或手势触发的3D翻页过渡。
- 完全定制的动画主题:多种颜色的主题,每个主题的多种变体
当我开始时,我不知道如何建立这些功能。但我知道它们都涉及动画。
文档和谷歌可以走很远的路
幸运的是,Flutter文档对动画有一个很好的介绍,同时还有一些有用的代码实验,可以让我对基础知识进行一些练习。
所以我阅读了文档(多次),并试图创建一个心理地图,了解哪些动画API可以用于哪些应用程序的功能。
文档与功能
阅读文档可以让你对一个特定的主题有广泛的了解,并对什么是可能的,什么是不可能的有一些直觉。
然后我开始构建功能,一次一个。
有些东西,比如任务完成环,并不太复杂,因为我之前已经有一些关于如何使用自定义画师和显式动画的知识。
任务完成环的动画
但是其他的东西,比如翻页过渡,就超出了我的能力范围,我没有看到一个明显的方法来应用Flutter动画API来获得我想要的效果。
搜索。Flutter翻页
于是我在网上搜索,发现了两个 有用的教程,这让我找到了正确的方向。
我对其中一个教程中的代码进行了实验,将其分解并重新组装(就像你对乐高积木所做的那样),并从中创建了我的第一个解决方案。但对于我的用例来说,这段示例代码还不够好,我需要进一步努力。
在这个阶段,我没有回到网上去寻找其他的教程。
相反,我用我从Flutter文档中学到的东西改进了我的解决方案,创造了以前没有人做过的全新的东西。
这很有价值,所以我决定将其开源为一个page_flip_builder包,供其他人使用。我还分享了两个关于我如何创建它的完整教程。
有时,没有一个现成的教程或软件包来满足您的需要。因此,你需要从头开始或通过组合已有的东西来建立东西。这是一个很好的学习方法。如果你想出了一些难点,你可以分享结果以获得奖励。💯
奖励挑战:iOS首创Jank
最终,我成功地构建了所有复杂的UI功能,但我的应用程序遭受了臭名昭著的iOS首发jank问题,我不打算发布一个有严重动画性能问题的Flutter动画课程。
所以我在Flutter repo上提交了一个详细的问题。这可能超出了你在构建Flutter应用程序时需要做的事情。但这样做对我来说是值得的,因为其中一个答案指出,这个问题与文本渲染有关。结果发现,通过禁用我正在使用的一种自定义字体,这个问题几乎完全消失了。
经验之谈:有时在公开场合寻求帮助,并提供有用的可重复的步骤,对帮助每个人(包括你自己)都有很大帮助。
永远不要被卡住(长时间)。
尽管我是在创建一个克隆,但我在选择一个具有复杂动画的应用程序时是相当慎重的,在这一过程中我也遇到了许多挑战。
但我如何能够在一开始就接手一个复杂的应用程序,是因为我对所有的基础知识都很熟悉。
- 我从来不需要担心使用什么语法,因为我对Dart非常了解。
- 我的代码从一开始就很有条理,因为我知道如何编写可维护的代码
- 我在开发过程中遇到了错误,但我没有被卡住,因为我知道如何调试和使用
谷歌DuckDuckGo。
对你来说也可以是这样的。
我并不是说你可以在几个月内掌握Flutter应用开发。
我是说,学好基础将为你今后的工作节省大量的时间。
但是...我想为我奶奶建立一个电子商务/Uber克隆/TODO列表
我明白了。每个应用程序都是不同的,有不同的要求。
你总是会遇到你不知道的事情。
但与其看一个又一个的教程,并试图学习 "如何构建应用程序X",不如专注于用于构建移动应用程序的基本技术和设计模式。
更好地使用谷歌DuckDuckGo,并学习如何使用断点和Flutter检查器来调试你的应用程序。
如果我需要上网找答案,我会问自己。
- 这个答案与我的用例是否匹配?
- 它在我的代码库中适合吗/我需要调整或重写它吗?
- 它能适用于所有的边缘情况吗?
- 我是否完全理解这段代码?如果不是,我就会深入挖掘,试图获得更深的知识。
一次又一次地这样做会给你带来超能力。你会更少地被卡住,并设法解决事情,而不需要请求(和等待)帮助。你还会建立起肌肉记忆,了解什么有用,什么没用。
仅仅通过阅读文档和练习,你就能走得很远。
因此,这给我们留下了一个问题。
教程和课程是在浪费时间和金钱吗?
毕竟,给陷入教程地狱的人们的第一条建议是:建立你自己的应用程序。
这就是我的学习方法,也是我今天仍然在做的事情。
但你知道吗?我有15年以上的经验,我仍然购买课程,当我知道它们会节省我的时间。
如果一个主题/语言/包有很好的文件记录,并且容易理解,你就不需要关于它的教程或课程。
但情况并非总是如此。
以CSS为例。许多开发者讨厌CSS,因为他们对CSS的工作原理没有一个完整的心理模型,他们只是在寻找特定情况下的 "小技巧"(例如,将东西垂直居中)。我自己与CSS斗争了很久,大多数教程/文章/答案在我应用时似乎都不起作用。
所以对我来说,学习一门非常好但昂贵的CSS课程要比继续挣扎更有时间效益。
当你对某种语言/框架完全陌生,想按照结构化的方法快速掌握时,课程也是非常好的。
哪里可以找到好的教程和课程?
这是个好问题。一个更好的问题是:谁在做这些东西?
我想这是关键。你想从那些在其领域内的专家那里学习,并善于用简单的术语来解释复杂的概念。
因此,在Twitter和Reddit上逛逛,看看谁在持续发布有价值的东西。你甚至可以找到任何技术栈的最佳开发者博客。
就Flutter而言,这就是我努力要做的:创造好的内容,帮助别人快速学习。
例如,我花了60个小时来构建整个习惯跟踪应用程序,我将所有的学习内容浓缩在一个7小时的课程中,详细介绍了Flutter的动画。如果这是你需要学习的一个主题,那么参加课程可能会节省你很多时间。
学习和实践是一个反馈循环
综上所述,我认为教程/课程和刻意练习是互补的任务。
在阅读文档、观看教程和参加课程的同时,你需要自己练习构建应用程序,并从错误中学习。
通过建立一个持续的学习和实践的循环,你的进步会快很多。
学习和实践:反馈循环
注意这是一个循环。这是在你学完之后马上练习你所学的东西。如果你只看一个又一个的教程,你不会保留任何有意义的东西,因为你没有练习。
同样地,如果你只在自己身上练习,你的编码风格也会受到影响。这就是加入开放源码项目和与他人合作可以产生巨大影响的地方。
编码愉快!