Flutter for React / React Native开发人员

这篇文章对那些在React / React Native堆栈上进行编写并希望自己掌握一项新技术的人具有启发性。不,我们不会在此框架上编写应用程序!如果您正在等待另一个待办事项列表-此材料不适合您。



图片



相反,这是另一个关于我如何切换到新框架的故事。该



材料并不表示最终真理。这里只介绍我自己选择的那些解决方案,这些解决方案在React&React Native开发中具有很大的背景,对我来说最容易应用于实际项目。



语境



首先,我将描述上下文。订单已经出现-编写一个小的(约15个屏幕)跨平台移动应用程序。自然,出于习惯,我开始在React Native中进行操作。在两周内,该应用程序的实施率约为80%。



上周末,我阅读了哈布雷(Habé)Surf上的另一篇有关调查结果的文章想法来了,为什么不尝试呢?我是否可以为我重复关于新框架的内容?决定度过一个周末尝试一下。结果,在接下来的一周中,不仅重写了之前的80%,而且还重写了剩余的20%。开发时间减少了一半以上!



优点



首先,优点是布局速度。屏幕铆钉非常快。线性渐变,SVG,GIF-几乎全部可用。重叠的组件(位置:绝对)-完全没有问题。只需单击一下手指,任何导致React Native疼痛的事情都可以完成。动画通常是童话!在Flutter上,具有不断变化的动画的相同屏幕所花费的时间减少了几倍。



缺点



有两个明显的缺点。首先是文档。俄语很少。官方英语的结构不是很好,是的,它提供了很多有用的代码示例,但是很难理解应用程序的一般体系结构中的一些有意义的内容。



第二个缺点是包装。那里仍然一片混乱。为您想要的软件包选择一个非常好的软件包并不是一件容易的事。在某处某个功能不起作用的地方,在其他地方。很多时间花在选择上。作为一种选择-自己添加一些东西,但这是我习惯的时候)



经验:钩



我对React的了解可以追溯到普通课程刚刚出现的日子。现在我无法想象他没有钩子,已经忘记了上课。对于flutter,有一个很棒的flutter_hooks,它允许您将熟悉的钩子带入项目。对我来说,它完全取代了StatefulWidget。有很多钩子,您可以编写自己的钩子,但是在我的代码中最经常使用useEffectuseStateuseMemoized。对于动画,请使用AnimationController



也许这不是最好的解决方案(我已经准备好阅读注释中的弊端),但是它允许您自己在新框架中使用React的背景。我什至看不出任何理由提供示例代码-所有React开发人员都以我们为父而闻名!



经验:国家管理



一次,我不得不使用reduxmobx甚至是外来工具,例如storeon。似乎它(redux / mobx)也在Flutter之下,但是,坦率地说,我没有掌握它)。我认为,与React相比,那里的一切都太复杂了。您当然可以花更多的时间来解决问题,但是为什么当我找到一个更好的解决方案:riverpod时



从库雷米Rousselet,作者flutter_hooks -他们自然都工作很好)。实际上,它是一个修改的Provider。只需添加到您的runApp(ProviderScope(...))包装其他所有内容,并获得整个应用程序的全局范围,可从任何小部件访问。这是足以写入useProvider(的providerName 中的构建方法HookWidget,我们必须从指定的供应商提供的数据。



库中有很多提供程序选项,但是最基本的是ChangeNotifyProviderStateNotifyProvider。可以从小部件中安全删除所有业务逻辑,并将其转移到这些提供程序。而且,它们彼此完美地结合在一起,从一个方法访问另一个方法和数据并不困难。



图案与redux鸭子非常相似就我个人而言,这种方法已成为React世界中最接近的方法。只有“鸭子”更小。这里要记住的主要事情是,有许多小型提供程序将用在不同的小部件中,而不是大型的小提供商,因为实际上已更改的那些小部件将被重绘。



令人失望:网络



在开发了移动应用程序后(对我自己而言)取得了压倒性的成功之后,我像任何自重的完整​​堆栈一样,决定接触Flutter进行网络开发。同样,重写真正有效的公司应用程序之一。



当然,Flutter Web仍处于beta版本,下面描述的所有内容专门适用于beta版本。我真的希望,随着版本的发布,情况会有所改善。但是,尽管如此,Flutter让我感到失望。



您需要了解Flutter Web的第一件事不是关于网站,而是关于应用程序!那些。有必要以与移动设备相同的方式进行书写。所有小部件都相同。您不能在代码中使用第三方JS。仅通过dart:js访问它。也可以通过dart访问html :html... 这几乎切断了网络世界中已经完成的所有工作。如果您想在CSS + JS中某个地方实现酷炫的动画,则不能这样做,在flutter上编写一个模拟或使用dart:js并不总是那么容易。轻松使用现成的JS / css库是不可能的。



第二个缺点是包装!尽管在pub.dev上,大多数都被标记为同时支持Web,Android和ios,但通常一个或另一个都可以工作。那些。您将无法创建完全跨平台的代码。



Web程序包通常是js对应程序的包装。但是几乎总是他们不跟上他们包装的包装的版本。



例:



任务是通过MS进行授权并接收用户数据。



在旧的JS中,一切都很简单:以msal微软/ microsoft-graph-client-并享受结果。



Flutter中找到msal_flutter,连接...原来该Web软件包不支持。好的,我们找到了msal_js-这是对普通msal的包装,因此您需要通过良好的旧脚本标记将其包含在index.html中。但是,如果msal已更新至1.4.2,则此软件包最多支持1.3.0!



好吧,好了,我们悲伤地得到了一半的令牌,那么用户数据呢?有一个软件包microsoft_graph-没有任何文档。要找到所需的方法,您需要进入程序包代码并在其中进行戳戳。最终发现只有一对实现的用于处理任务!查找其他msgraph-因此通常唯一的方法支持!



幸运的是,该协议本身并没有那么复杂,您可以在需要工作时快速编写自己的东西,而无需编写库)



环境



第三个也是最大的缺点是无法设置环境。Flutter Web在浏览器中或作为Web服务器运行。您仍然可以通过命令行参数设置将在其上旋转的端口(这也不是很方便,config在哪里!!)但是我如何使用自签名证书将其作为https运行呢?这样一来,热负载就可以正常工作并进行调试,而其他通常正常工作的芯片又可以工作?你好!伙计们,2k20结束了,您还有http吗?真?!



结论



毫无疑问,Flutter作为跨平台移动开发的框架,正在将React Native撕成碎片。我很满意,客户也很高兴-您还需要什么?



但是,作为编写Web应用程序的工具,它仍然很潮湿且太费力。准备好在几秒钟内连接第三方js包的地方,这里将为它写几天的包装,或者甚至在Flutter上编写自己的类似物。



聚苯乙烯



对于那些从本文开头忘记的人,我将再次重复。我描述的适用解决方案和结论是一个在Flutter具有1周背景并且在React中具有3年背景的人的结论。因此,不要以他们为最终真理。我准备在与专家的评论中讨论我做错了什么。



All Articles