如何在Flutter中构建任何类型的应用程序

112 阅读11分钟

人们经常问我的一个问题是。

我如何在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的动画。如果这是你需要学习的一个主题,那么参加课程可能会节省你很多时间。

学习和实践是一个反馈循环

综上所述,我认为教程/课程和刻意练习是互补的任务。

在阅读文档、观看教程和参加课程的同时,你需要自己练习构建应用程序,并从错误中学习。

通过建立一个持续的学习和实践的循环,你的进步会快很多。

学习和实践:反馈循环

注意这是一个循环。这是在你学完之后马上练习你所学的东西。如果你只看一个又一个的教程,你不会保留任何有意义的东西,因为你没有练习。

同样地,如果你只在自己身上练习,你的编码风格也会受到影响。这就是加入开放源码项目与他人合作可以产生巨大影响的地方。

编码愉快!