什么时候应该覆盖1个生命周期方法?

use*_*895 3 apache-flex

我在flex开发人员指南中读到你有时需要覆盖其中一个生命周期方法,例如:commitProperties和updateDisplayList,但我写了一些flex应用程序而不需要实现它们.我什么时候需要覆盖它们?

Lan*_*ard 8

首先,我100%建议由EffectiveUI学习这个演讲:

这是来自Digital PrimatesMichael Labriola:

它们会进入您在文档中永远找不到的内容,但这些内容对于理解Flex组件生命周期非常实用.

根据我的经验,您唯一需要担心重写核心生命周期方法的方法是创建组件.我区分了应用程序视图组件.

  • 组件是需要近乎完美,高度优化和极其通用/抽象的东西.
  • 视图是您在一个应用程序中可能只需要的东西,但如果您愿意,可以重复使用(LoginScreen,ContactForm等).

在大多数情况下,视图只是将内容添加到更通用的组件(Canvas,Group,Container,VBox,List等)的显示列表中.作为视图/应用程序开发人员,您并不真正关心"dataProvider"如何创建它的itemRenderers,它只是起作用.

组件是一个不同的故事.创建组件时,您希望它完全适合Flex设置的系统:组件生命周期.当你第一次尝试像他们一样构建一个组件时,这是非常艰难的,但是在你绕过它之后,这非常容易.以下是我在开发组件时对方法的看法:

createChildren()

  1. 构建组件时调用一次
  2. 叫做自上而下.因此,如果是Panel调用createChildren,它的createChildren方法将调用addChild它的所有子节点,即调用initialize哪些调用createChildren.

如果您创建了一个自定义组件,比如StarRatingComponent,则可能需要在构建组件时向舞台添加5颗星.因此,您可以覆盖createChildren()为您所在的组件添加星标.但是,默认情况下,Flex SDK中的所有Container组件都会在此处添加其子项(列表执行方式略有不同),因此您无需执行此操作您正在构建MXML视图或不可重用的东西.

在设置属性后,接下来的3个方法称为1帧.

测量()

  1. 如果父级没有任何大小(百分比或显式),则需要根据子级的大小调整大小.这种情况只能从下往上发生(花了我很长一段时间才能真正地绕过它).
  2. 如果父级具有显式或百分比大小,则会跳过此步骤.

measure如果您想要覆盖:

  1. 拥有measuredWidthmeasuredHeight返回有用的值.因此,如果您构建自定义CoverFlowContainer组件,并且measuredWidth/measuredHeight未设置(因为measure未覆盖),那么如果您未在CoverFlowContainer上指定任何大小,则它将为0宽度0高度.所以相反,覆盖measure并将其设置measuredWidthradius * 2或类似的东西,现在你不需要给它一个大小!
  2. 如果组件没有显式或百分比大小,则将使用measure来调整组件的大小.否则它被跳过了.

的commitProperties

  1. 叫之后measure.
  2. 应用所有属性更改(从组件上的设置属性)到组件(它们存储在第一帧的私有变量中).
  3. 初始属性设置后调用一帧.

在我看来,这是最重要的方法.因此,对于CoverFlowContainer,假设您设置了假设distance,gapselectedItem,以及tilt属性.设置它们时,将它们存储在私有变量中.Flex将等待一帧,并打电话commitProperties.在你被覆盖的时候commitProperties,你可以layout.updateEverything(selectedItem, distance, gap, tilt);这么说.因此,这是您重写的方法,以便立即应用所有属性更改.

的updateDisplayList

  1. 叫之后 commitProperties
  2. 叫做自上而下.

你只覆盖此设置组件的可见性,如setActualSize,graphics等,但现在(因为`的commitProperties),你有你的所有必需的变量更新将显示器设置为正确的价值观.

总体

因此,根据我的经验,在为一百万个项目中使用的内容创建组件库时,我为这些生命周期方法做了大量工作:

  • TitleWindow(我自己的版本)
  • View3D(适用于Away3D/Papervision)
  • Flex 4的树和堆栈
  • TextArea(带提示,可扩展等)
  • 工具提示(更容易皮肤工具提示)

我需要确保所有内容都根据生命周期进行了更新和完美呈现.阅读和理解Flex 4 Spark源代码确实有助于阐明何时覆盖这些方法.和Openflux源代码一样(非常简单,清晰的Flex框架替代方案.不像功能丰富,因此它显示了如何彻底覆盖这些方法来完成一些非常高级的东西).

当我开发的应用程序,使之类的东西AdvertismentView,MenuView而且LoginView,我从来没有去想它,因为所有我使用的部件都已经解决了这些问题(ViewStack,集团,列表等).我基本上只是设置他们在自己的commitProperties覆盖中定义和更新的属性.

我开始在View中重写生命周期方法的唯一一次是当我需要从视图外部访问自定义变量时.所以说我有一个自定义的RichTextEditor,我创建了一些名为showFontControls和的属性showStylePanel.当我设置这些变量时,我可能会做他们在数据绑定演示中描述的内容:访问者设置私有变量并调用失效方法,生命周期方法稍后执行一帧,我已覆盖commitPropertiesupdateDisplayList显示这些面板和字体.但实际上,这可能是一种过度杀伤力,因为它不会为它所需的工作量提供那么多的性能提升.visible在这种情况下,我只是为一个属性设置了一些绑定.然而....

要真正做到这一点,最好的办法就是下载Flex SDK Source并查看它们正在做什么.

希望有所帮助.

长矛