我对Flutter 3发布的看法
本文由 简悦SimpRead 转码,原文地址 mattcarroll.medium.com
Flutter 3在2022年谷歌I/O大会上宣布并发布。以下是一些值得注意的更新,以及我的......。
Flutter 3在谷歌I/O 2022上宣布并发布。以下是一些值得注意的更新,以及我的意见。
我很高兴听到我的朋友Tim Sneath更新了他对Flutter的定义。
"Flutter是一个开源的工具包,由谷歌支持,用于为任何平台构建漂亮、快速的用户体验"。- Tim Sneath (Flutter的新特性)
让我们永远不要忘记,Flutter是一个工具包,而不是一个框架,它所构建的是用户界面,而不是应用程序!"。谢谢你的更新,Tim!
Flutter推出了一个休闲游戏框架。按照同样的思路,Very Good Ventures与Flutter组织合作,发布了Flutter Pinball。我经常说Flutter是Flash的精神继承者,如果Flutter Pinball还不能让你想起2000年初的Flash游戏,我不知道什么能让你想起!
Flutter Pinball看起来很棒。使用Flame游戏引擎的社区创作看起来很有希望。我始终支持Flutter的创造性扩展,无论它们可能走向何处。这就是我建立Flutter Processing的原因。
但是Flutter的休闲游戏框架让我有点担心。一方面,休闲游戏框架可能是为了给谷歌带来基于Flutter的收入,这很重要,可以让谷歌不减少Flutter的团队规模,或者减少预算。如果休闲游戏框架是一个小的、一次性的收入游戏,那么我对它没有意见。但是,如果Flutter将游戏开发作为另一个团队的焦点,那么我就有很大的问题了。Flutter仍然充满了相当尴尬的错误和缺失的功能。这些缺点是可以理解的,但如果Flutter团队进一步将其极其有限的劳动分化,那就不是了。请先修复和打磨我们都需要的基本的手势输入、文本输入、布局、合成和渲染功能,然后再把精力花在特殊化上。
如果Flutter真的想帮助游戏开发者,同时也帮助其他所有人,请给我们自定义着色器!
对于Flutter来说,添加到应用程序是一条漫长而曲折的道路。我在Flutter团队的大部分时间都花在了重写Android的嵌入上,以支持将Flutter添加到现有的Android应用中。对iOS也做了类似的工作。添加到应用程序在技术上已经可以实现多年,但看起来Flutter在便利性方面达到了一个全新的水平,这很好。
Flutter发布了一个名为Put Flutter to Work的项目,使安卓和iOS开发者可以很容易地在他们的本地应用中部署Flutter体验范例。这让安卓和iOS开发者可以快速、轻松地尝试Flutter,发现Flutter有多好,然后进行更深入的投资,迁移到Flutter。
枚举终于好了!
历史上,Dart的枚举一直是我称之为贫血的枚举。它们限制了一组值,这很有用,但很勉强。这些贫血的枚举可以帮助我们写出详尽的开关语句,但它们违背了我们面向对象的目标。
今天,Dart支持基于类型的枚举。这意味着一个枚举可以包括方法和属性,就像一个类。因此,我们不是在约束值,而是在约束类型。现在,与其在一个枚举上进行 "切换",然后把它的相关行为分散到每个 "切换 "语句中,你可以告诉一个枚举做什么,而这个枚举在内部会做正确的事情。
考虑使用基于类型的枚举来实现一个音频播放器的状态模式。
enum AudioPlayerState {
uninitialized,
ready,
loading,
playing,
paused;
void play() {
// ...
}
void pause() {
// ...
}
void seek(Duration timeStamp) {
// ...
}
}
通过Dart新的基于类型的枚举,你可以在音频播放器的 "状态 "中实现音频播放决策的所有细微差别。你可以看到音频播放器可能做的所有事情,以及这些事情是在哪个状态下完成的。这比在每个按钮处理程序中用 "开关 "语句乱写乱画,或其他类似的疯狂做法要有效得多。
从子类到超类传递构造函数参数
当你定义一个新的子类时,你经常需要从子类的构造函数中传递参数给超类的构造函数。一方面,对于大多数问题来说,子类是一个糟糕的解决方案,你应该避免它。另一方面,子类化有时是不可避免的,偶尔它也是有用的,比如允许我们定义自定义的StatefulWidgets。
Dart现在允许你通过使用super关键字,将传入的构造函数参数隐含地传递给超类构造函数。
在这个变化之前,你的子类可能看起来像这样。
class MySubclass extends SomeSuperclass {
MySubclass({
Thing thing1,
Thing thing2,
Thing thing3,
}) : super(
thing1: thing1,
thing2: thing2,
thing3: thing3,
);
}
使用新的Dart语义,你的子类将看起来像这样。
class MySubclass extends SomeSuperclass {
MySubclass({
super.thing1,
super.thing2,
super.thing3,
});
}
我们已经将构造函数的长度减少了一半,而没有丢失任何关于我们正在做的事情的细节。对我来说,这看起来是个胜利。
历史上,Flutter组织一直负责Firebase的集成。这从来不是一个理想的安排。这些整合大多是基于Firebase的细节,而不是Flutter的细节,然而Flutter团队的开发人员却不得不维护这些整合。
从今天起,Firebase团队承担起维护Firebase与Flutter集成的责任。一切都是理所当然的。
org的转换还带来了一个很好的补充,即当你创建一个新的Firebase项目时,可以选择Flutter应用。Flutter不再是Firebase中的红头发的继子了。无意冒犯,Andrew Brogdon :)
Flutter的发布很少有惊喜,因为我们可以在构建过程中看到一切。Flutter 3的发布也不例外。我们收到了一些增量改进,而这些改进似乎是一件好事。但仍有很多工作要做。
Flutter的 "稳定 "Mac OS支持不包括平台视图,这意味着没有iFrames。因此,你不会在你的Mac应用程序中嵌入任何YouTube或Vimeo播放器。
Flutter的 "稳定 "桌面支持并不包括剪贴板复制/粘贴的严肃实现。Flutter只支持纯文本,这并没有考虑到你可能在桌面应用程序之间复制的内容的复杂性。
Flutter仍然不支持自定义着色器,这阻碍了图像过滤应用程序,大多数创造性的编码用例,限制了游戏开发,并限制了应用程序用户界面的创造性。
与自定义着色器相关,Flutter不支持共享位图内存。因此,如果你想运行像素操作,你必须把整个位图从Flutter引擎移到Dart中,应用像素变化,然后再把整个位图推回到Flutter引擎中。这对任何生产性的图像处理应用程序来说都是绝对不行的。
在Flutter的早期,它以设计世界一流的API而闻名,并提供世界一流的文档,以解决深层次的问题。这就是我们在Flutter的widget树和render树的抽象中看到的。我希望看到Flutter组织回到使他们出名的那种有原则的API设计,我也希望看到他们把这种视角应用到这些更深层次的缺点上,这些缺点位于Flutter开发者和无限的机会之间。