原文作者:ma.ttias.ch/
发布时间:2021年6月30日
在过去的一周里,我一直在用Flutter构建一个应用程序。我选择Flutter是因为我喜欢它的承诺。即跨平台的特性和开发过程中的快速重载。下面是我的第一印象。
主要见解
- Flutter不是原生应用开发的替代品
- Dart语言是非常严格的类型化
- 学习Flutter感觉就像重新学习HTML
- 在状态方面,很容易让自己陷入困境
- Flutter是一个不完整的框架
- 仔细检查您的依赖性
- 热重载是惊人的
- 超越材料设计
Flutter 不能替代本地应用程序的开发
Flutter给我带来的第一个惊喜是,文档中推荐使用Android Studio或Visual Studio Code。这些都是你可能已经从你以前的应用开发经验中知道的工具。我知道我已经知道了。
描述Flutter的另一种方式是,它使Dart能够作为脚本语言使用,并为不同平台提供解释器。这意味着你仍然在与任何本地应用程序的相同API对话。事实上,如果你想与任何设备功能对接,除了显示用户界面和发出HTTP请求外,你还需要为这些功能编写本地代码。
使用Flutter的好处是,pub.dev提供了一个包库,由社区为你实现这些原生实现。
Dart语言是非常严格的类型化
我喜欢严格类型化的语言,所以对我来说Dart就像家一样。不过严格程度是有范围的,Dart倾向于非常严格。这很像我对Java的体验。这是我在开发过程中最喜欢的屏幕截图。
解决上述错误(由Android Studio显示)的方法是在相关函数的第一个参数中添加动态关键字。
在最初的几个小时里,你应该已经遇到了大多数这样的怪事,而且一旦你知道该怎么找,它们就很容易解决。如果你像我一样,在这之前你可能会觉得有一点点自卑。
学习Flutter感觉就像重新学习HTML
我所关注的文档侧重于使用不同的UI元素。这是有道理的,一个应用程序所做的大部分事情都是在用户界面和它的元素中。在大多数情况下,这些元素都是以树形方式分类的。
MaterialApp
└── StartScreen
└── Column
├── Padding
│ └── DropdownButtonFormField
├── Padding
│ └── Flexible
│ └── Text
└── ElevatedButton
直观地说,这种结构在我看来很像HTML(或XML),只是用Dart类代替了纯文本。
不过,相似之处也就到此为止了。这些元素中的每一个都有自己的怪癖,你将不得不努力学习。举例来说。
假设你想在加载过程中禁用一个文本输入字段的输入。文本输入有一个属性可以实现这个目的。对一个下拉列表做同样的事情则完全不同。该元素没有相关的属性。相反,你需要把null传给onChanged属性,以代替你的回调。
就其本身而言,这些设计选择并不坏。只是要注意,你必须学习所有这些细节,就像学习一门新语言的词汇。
在状态问题上,很容易使自己陷入困境
为状态管理提供的解决方案乍一看似乎很简单。任何Widget(大致相当于一个组件)都可以有它自己的状态,或者是无状态。这很容易让人忘记从Redux或Vuex学到的经验。让每个组件记住它自己的状态,很容易演变成一个复杂的、相互关联的状态变化网络,使应用程序难以理解和调试。
相反,你应该尝试在结构的顶部附近保留一个主记录--一个真理的来源。从那里你可以向下传递数值,就像你在前面提到的解决方案中那样。
Flutter是一个不完整的框架
起初,我对将Flutter称为一个框架感到犹豫不决。它的主要目的是作为一个开发工具来实现互操作性和程序员的便利。但在构建我的应用程序的过程中,我遇到了许多开箱即用的功能,我认为它们是框架的一部分。
- 路由(定义和导航)
- 模板语言和组件
- 调试工具
- 编码
- 国际化(i18n)支持
- 状态管理
这是一个很好的开始,但可能不是你需要的全部。如果你打算建立一个相当规模的应用程序,我建议你考虑在某些领域建立或寻找解决方案,因为开箱即用的解决方案并不存在或缺乏。
表格
当然,您可以用Flutter构建表单。不过,如何从每个组件中访问数据,以及配置当前状态,都是不同的。每个行也需要一些模板代码。由于这个原因,我建议研究某种formbuilder或控制器。
JSON序列化/反序列化
与你可能习惯的情况不同,处理JSON需要一些设置,将JSON转换为本地对象。如果你不需要,很容易将JSON字符串解析为String Maps。如果你有一个大项目,这可能不适合。
品牌风格
我把主题设计列为内置组件之一。这只对了一半。一些Widget可以在全局范围内进行样式设计,不需要额外的参数。对于其他的(例如文本),它们的风格需要每次都被设置为一个属性。考虑设置一些Widgets的子类,或者是某种工厂,以避免手工设置每个对象的属性样式。
仔细检查你的依赖性
如上所述,你安装的软件包将负责其功能的本地实现。对于我的应用程序,我在Android上测试,一切都很正常。出于好奇,我检查了源码库,发现iOS的实现基本上是个无用功。当然,版本号0.0.1也可以给我一个提示,但让这成为我们所有人的一个教训。在你全力以赴之前,请确保你的依赖在所有的目标平台上都能正常工作。
热重载是惊人的
在我看来,这是一堆功能中最好的。保存你的变化并在一秒钟内看到你的变化,这可以媲美JavaScript应用程序的反馈循环。我预计这个功能只在某些情况下起作用,但实际上,据我所知,只有少数情况下需要完全重新加载应用程序。这些情况主要是围绕着状态管理,特别是状态初始化。
超越Material Design
我发现的每个例子都是基于谷歌的Material设计。如果你不希望你的应用程序采用Material Design的风格,会发生什么?我做了一些研究,普遍的共识似乎是这样的。
- 所有的Widget都可以完全定制,甚至到了不再具有Material设计的外观。
- 对于像文本输入、导航或类似的普通设计元素这样的重要组件,重新发明车轮是没有意义的。
你想怎么做就怎么做吧。在这种情况下,我没有经验可言。
结论
一个星期后,我的第一个应用程序完成了。这只是一个供我自己使用的工具,所以它看起来并不花哨。但它工作得非常好,而且在大多数情况下,几乎所有的东西都是直观使用的。一个更大的应用程序将需要按照我上面所说的思路进行更多的思考。这些绝不是什么大问题,所以我只能建议你给Flutter一个尝试。
谢谢您的阅读
我希望您喜欢这篇文章,也许还能学到一些东西。如果您想保持联系,我有一个邮件列表,或者您可以通过社交媒体与我联系。
通过www.DeepL.com/Translator(免费版)翻译