【Flutter学习笔记】10.1 自定义组件方法简介
参考资料:《Flutter实战·第二版》 10.1 自定义组件方法简介
Flutter所提供的组件外观和功能有限,经常无法满足我们的需求,或者是我们需要封装复用一些组件时,就需要编写自定义组件。Flutter中自定义组件共有3种方法:组合其它组件、自绘和实现RenderObject。
10.1.1 组合多个Widget
这种方法是通过组合多个组件成一个新的组件,是较为常见的自定义组件方法。例如Container
就是一个组合组件,其由DecoratedBox
、ConstrainedBox
、Transform
、Padding
、Align
等组件组成。我们在开发的过程中,也是通过组合组件来实现的布局。
10.1.2 通过CustomPaint自绘
如果遇到无法通过现有组件来实现需要的UI时,需要通过自绘组件的方式实现。Flutter所提供的CircularProgressIndicator
并不支持在显示精确进度时对进度条应用渐变色,这是就需要通过Flutter中提供的CustomPaint
和Canvas
来实现UI自绘。
10.1.3 通过RenderObject自绘
Flutter提供的自身具有UI外观的组件,如文本Text
、Image
都是通过相应的RenderObject
渲染出来的,如Text
是由RenderParagraph
渲染;而Image
是由RenderImage
渲染。RenderObject
是一个抽象类,它定义了一个抽象方法paint(...)
:
void paint(PaintingContext context, Offset offset)
其中,PaintingContext
是组件的绘制上下文,通过PaintingContext.canvas
可获得Canvas
对象,绘制逻辑是通过Canvas
中的API实现的。子类需要重写这个方法来实现绘制逻辑,例如RenderParagraph
需要实现文本绘制逻辑,而RenderImage
需要实现图片绘制逻辑。
实现RenderObject: 也就是自定义组件 → RenderObject
→ paint()
方法 → PaintingContext
→ Canvas
的API → 自定义UI绘制
其与CustomPaint
和Canvas
自绘的方式不同,CustomPaint
只是为了方便开发者封装的一个代理类,它直接继承自SingleChildRenderObjectWidget
,通过RenderCustomPaint
的paint()
方法将Canvas
和画笔Painter
连接起来。