Flutter教程到处都使用“Widget”一词。在那种情况下什么是小部件?我可以在SO上找到最接近的问题在这里:What is a widget in Android?

但这是关于Android的,而不是Flutter(后者针对Android和iOS进行构建,因此在两种情况下都定义了小部件),答案有点令人困惑。一个人说一个小部件就像一个按钮(所以我在想一些Ui包/框架的Ui组件),另一个人说它就像一个应用程序,因为它可以在任何地方运行并占据整个屏幕。因此,来自WebDevelopment,我是否可以假定Widget类似于WebComponent?

它是一段独立的代码,不依赖于其他组件,但需要在环境中引导?这个假设是真的吗?对于Android和iOS?

最佳答案

strict definition of WebComponent无论您在哪里看都略有不同,但基本上可以归结为(用我自己的话说)“一组标准,这些标准允许以html标签的形式定义自定义,封装,可重复使用的元素”。

Flutter的strict definition of a widget是:

描述元素的配置

Element is defined as:

Widget在树中特定位置的实例化

但是,当您谈论WebComponents时,您可能会考虑的是“自定义,封装,可重用的元素”,而不是严格的定义。

当您开始以这种方式考虑它们时,flutter的Widget变得非常相似。定义窗口小部件时(通过扩展窗口小部件类之一),您可以允许某些输入,并定义其显示方式。只要知道小部件的“接口”,就可以或多或少地使用小部件而不知道其内部功能。实例化它时,将创建Flutter选择调用元素的窗口小部件的实例。小部件听起来与WebComponent元素非常相似!

此外,当您在Flutter中创建Widget时,您可以封装其他小部件,从而不必从头开始编写视觉定义(Flutter使用RenderObject表示呈现,而WebComponents类似物将编写纯HTML5而没有其他元素) 。 Flutter包含许多小部件,例如按钮,列表,容器,网格等,与在各种WebComponent库中可以找到的小部件类似(例如Polymer的铁组件)。

Flutter对Widget的定义还有一些额外的折痕-它们具有各种类型,包括InheritedWidgetStatefulWidgetStatelessWidget(还有一些其他特殊类型),每种类型都有其自己的用法;在某些方面,Flutter的组件实际上比WebComponent更接近React的组件(实际上,flutter的设计基于相同的反应性理想)。这种“相对”性是Flutter Widgets和WebComponent elemnt之间的最大区别-它们主要通过将状态传递到树下而起作用,而WebComponent元素更可能具有您的widget可以在其​​子元素上调用的方法,并且更改是通过定义小部件的方式传播到树上,而不必调用函数。

并非每个flutter Widget都必须具有视觉定义(也不是所有WebComponent都具有视觉定义)。例如,InheritedWidget实际上用于在小部件的树上跳过状态,而无需实际将信息向下传递到每一层-它用于在整个应用程序中共享ThemeData。而且,无需过多考虑细节,Flutter进行了优化,主要用于在发生更改时主要构建不可变的窗口小部件,而不是重新使用和修改现有窗口小部件。

TLDR是这样的,是的,浮动的“类似” WebComponent元素中的小部件带有一些警告。您将主要以一组小部件的形式编写应用程序,其中一些小部件封装了其他小部件。 Flutter的工作方式是使用其自己的跨平台渲染器(Skia),该渲染器位于android或iOS的相应可视容器中(Activity,我相信UIView(控制器?))-因此,您永远不会从 Activity 切换为 Activity 或从UIViewController到本机android / iOS端的UIViewController。

07-24 09:44
查看更多