Flutter 自定义组件的最佳实践

发布于:2024-10-24 编辑:匿名 来源:网络

我已经使用 Flutter 一段时间了,并使用 Flutter 做了一些演示项目。我也阅读了一些Flutter的源码,对Flutter的组件系统有了一些了解。

这里总结了 Flutter 自定义组件的最佳实践。最佳实践。

在Flutter上开发自定义组件其实有两种方式,一种是继承StatelessWidget或者StatefulWidget,另一种是使用RenderObject。继承StatelessWidget或StatefulWidget是最常用的方式,因为它们提供了一些现成的方法和属性,可以轻松实现组件生命周期和状态管理。

使用RenderObject时,需要自己实现一些方法和属性,比较复杂,一般用于实现一些复杂的自定义组件。我们分别看一下这两个方法的实现。

1、继承StatelessWidget或StatefulWidget 继承StatelessWidget或StatefulWidget是最常用的方式,因为它们提供了一些现成的方法和属性,可以方便地实现组件生命周期和状态管理。下面是一个实现 Counter 组件的简单示例。

该组件可以显示一个计数器,用户可以单击按钮来增加计数器值。代码语言:javascript copy class Counter extends StatefulWidget { @override _CounterState createState() => _CounterState();} class _CounterState extends State { int _count = 0; } void _increment() { setState(() { _count++; }) ; } @override Widget build(BuildContext context) { return Column( Children: [ Text('Count: $_count'), ElevatedButton( onPressed: _increment, child: Text(' Increment'),????? ),????????????????);???????????????????????????????????在这个例子中,我们定义了一个Counter组件,它继承于StatefulWidget,并实现了一个_CounterState类,它继承于State,用于管理组件的状态。

在_CounterState类中,我们定义了一个_count变量来保存计数器值,并定义了一个_increment方法来递增计数器值。在构建方法中,我们使用 Column 组件来显示计数器值和一个按钮,用户可以单击该按钮来增加计数器值。

2、使用RenderObject 使用RenderObject是一种更底层的方式,它可以让我们更加灵活地控制组件的布局和绘制。下面通过一个简单的例子来实现一个可以显示当前时间的时钟组件。

代码语言:javascript 复制 import ‘dart:async’;import ‘dart:math’ as math;import ‘package:flutter/material.dart’;class Clock 扩展 SingleChildRenderObjectWidget {??Clock({Widget child})?:?super(child: child );??@override??RenderObject?createRenderObject(BuildContext?context)?{????return?RenderClock();??}}类 RenderClock 扩展了 RenderBox {??DateTime?_dateTime?=?DateTime.now();??计时器_timer;??RenderClock()?{????_timer?= Timer.periodic(Duration(秒: 1),?(Timer t)?{??????_dateTime?=?DateTime.now();??????this.markNeedsPaint();????});??}??@override??void?performLayout()?{????尺寸?=?Size(,?);??}??@override??void?paint(PaintingContext?context,?Offset?offset)?{????final?Paint?paint?=?Paint()??????..color?=?Colors.black??????..style?=?PaintingStyle.lines??????..StrokeWidth?= 2.0;????最终中心= size.center(offset);????最终半径 = size.shortestSide / 2;????context.canvas.drawCircle(中心,半径,油漆);????// 绘制 h我们的手。????最终小时手长度=半径*0.5;????最终小时手弧度=((_dateTime.hour%12)+_dateTime.min/60)*2*math.pi/12-math.pi/2;????context.canvas.drawLine(??????center,??????Offset(center.dx?+?hourHandLength?*?math.cos(hourHandRadians),?????????????center.dy?+?hourHandLength?*?math.sin(hourHandRadians)),??????paint..行程宽度?= 6.0,????);????// 绘制分针。

????最终分钟手长度=半径*0.8;????最终分钟手弧度=(_dateTime.分钟+_dateTime.秒/60)*2*math.pi/60-math.pi/2;????context.canvas.drawLine(??????center,??????Offset(center.dx?+ 分钟HandLength?* math.cos(minuteHandRadians),?????????????center.dy?+ 分钟HandLength?*?math.sin(minhHandRadians)),??????paint..StrokeWidth?= 4.0,????);????// 绘制秒针。????最终第二手长度=半径*0.9;????最终 SecondHandRadians = _dateTime.second * 2 * math.pi / 60 - math.pi / 2;????context.canvas.drawLine(??????cent呃,偏移(center.dx + secondaryHandLength * math.cos(secondHandRadians),center.dy + secondaryHandLength * math.sin(secondHandRadians)),paint..color = Colors.red..StrokeWidth = 2.0,); } @override void detach() { _timer.cancel();超级.分离(); }} 效果如下图所示: 图0 上面的图0给出了两个实现自定义组件的例子。

第一种方式是继承 StatelessWidget 或 StatefulWidget,第二种方式是使用 RenderObject。在实际开发中,我们可能需要遵循一些最佳实践来提高组件的性能和可维护性。

这里主要讲组件封装、布局和文档。 1.组件封装 在flutter中,组件封装是很常见的。

虽然大多数时候flutter的组件库已经提供了我们需要的组件,但是有时候我们还是需要自定义一些组件来满足我们的需求。在封装组件时,我们应该遵循以下原则: ? 单一责任原则:一个组件只负责一个功能,不要将多个功能耦合在一个组件中。

? 高内聚和低耦合:组件内的各个部分应具有高内聚性,不同组件之间应具有低耦合性。 ? 易用性:组件的使用应该尽可能简单,用户不应该花费太多的时间和精力学习如何使用组件。

? 可定制性:组件应具有一定程度的可定制性,可以根据用户的需求进行定制。 ? 易于扩展:组件应具有一定的扩展性,能够方便地扩展新功能。

接下来我们举一个简单的例子。例如,我们想要实现一个日历组件,可以显示当月的日历并选择日期。

我们可以将这个日历组件封装成一个Calendar组件,该组件可以接受一个DateTime类型的参数来指定当前月份的日期。此日历组件可以包含 MonthView 组件和 WeekView 组件。

MonthView组件用于显示当月的日历,WeekView组件用于显示星期几。这样我们就将日历组件封装成了Calendar组件。

用户只需要传入一个DateTime类型的参数就可以使用这个日历组件。下面我看看如何按照上述原则来封装这个日历组件。

代码语言: javascript copy class Calendar extends StatelessWidget { Final DateTime date;日历({this.date}); @override Widget build(BuildContext context) { return Column( Children: [ MonthView(date: date), WeekView( ), ] , ); }}类 MonthView 扩展 StatelessWidget { 最终 DateTime 日期; MonthView({this.date}); @override Widget build(BuildContext context) { return Container( child: Text('月视图'), ); }}类 WeekView 扩展 StatelessWidget { @override Widget build(BuildContext context) { return Container( child: Text('Week View'), );我们来看看上述原则在这个例子中的应用:单一职责原则(Calendar、MonthView和WeekView各负责一个功能)、高内聚低耦合(Calendar组件由MonthView和WeekView组成,但它们之间的耦合度很低)、易用性(使用Calendar组件,只需要传入一个DateTime参数即可)、可定制灵活性(可以通过修改MonthView和WeekView的实现来定制组件的性能) )和可扩展性(可以通过添加更多子组件来扩展日历组件的功能)。2. 组件的布局 良好的布局可以提高组件的性能和用户体验。

有些组件需要从一开始就考虑响应式布局,这样才能适应不同的屏幕尺寸和分辨率。在布局组件时,应遵循以下原则: 灵活性:组件的布局应具有一定的灵活性,能够适应不同的屏幕尺寸和分辨率。

? 性能:组件的布局应尽可能简单,没有过多的嵌套和无用的布局。 ? 响应能力:组件的布局应该能够响应并根据屏幕尺寸和分辨率进行调整。

? 可访问性:组件的布局应具有一定程度的可访问性,以便用户轻松交互。接下来,我们来看另一个例子。

现在大家都喜欢玩大型语言模型的聊天对话应用,需要同时支持图片和文字。我们可以封装一个ChatMessage组件,它可以显示用户发送的消息。

它可以是文字或图片。该ChatMessage组件可以包括TextMessage组件和ImageMes??sage组件。

TextMessage 组件用于显示文本消息,ImageMes??sage 组件用于显示图片消息。这样我们就将聊天消息组件封装成了一个ChatMessage组件。

用户只需要传入一个Message对象就可以使用这个聊天消息组件。下面我就按照上面的原则来看看如何布局这个聊天消息组件。

代码语言:javascript复制类ChatMessage扩展StatelessWidget{最终Message消息;??ChatMessage({this.message});??@override??Widget?build(BuildContext?context)?{????return?Flexible(??????child:?message.type?==?MessageType.text????????????TextMessage(text:?message.text)??????????:?ImageMes??sage(image:?message.image),????);??}}类 TextMessage 扩展 StatelessWidget { 最终字符串文本;??TextMessage({this.text});??@override??Widget?build(BuildContext?context)?{????return?Semantics(??????child:?Text(text),??????label:?'短信',????);??}}类 ImageMes??sage 扩展 StatelessWidget { 最终字符串图像;??ImageMes??sage({this.image});??@override??Widget?build(BuildContext?context)?{????return?Semantics(??????child:?Image.network(image),??????label:?'图像消息',????);??}}在这个例子中,ChatMessage组件使用了灵活来自动调整其大小,以适应不同的屏幕尺寸和分辨率(灵活和响应方式)。同时,我们避免了不必要的预留和容器使用,另外,我们使用了语义组件来提供辅助功能,以提高可访问性。

3.组件的文档 当一个组件开发完成后,我们应该为该组件编写文档,以便其他开发人员能够快速了解??该组件的用法和功能。没有文档,没有人敢使用组件。

现在的开发者太懒了,不愿意花太多的时间和精力去学习如何使用组件。在编写组件文档时,我们应该遵循以下原则:? 简洁明了:文档应该简洁明了,不应该包含太多废话和无用的信息。

? 示例代码:文档应包含示例代码,以便开发人员能够快速了解??组件的用法。 ? 参数说明:文档中应包含参数说明,以便开发人员了解组件的参数和功能。

? 返回值描述:文档应包含返回值描述,以便开发人员能够了解组件的返回值和功能。 ? 效果演示:文档中应包含效果演示,以便开发人员了解组件的效果和功能。

今天就讲到这里,希望对大家有帮助。

Flutter 自定义组件的最佳实践

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 钢铁行业景气度有所改善,中钢国际预计一季度利润115-1.4亿,

    钢铁行业景气度有所改善,中钢国际预计一季度利润115-1.4亿,

    中钢国际(28.SZ)发布今年一季度业绩预告,预计一季度实现归属于上市公司股东的净利润1.15亿元。 元-1.4亿元,同比增长0.22%-.75%。

    06-18

  • 蘑菇物联完成B轮融资,由纪源资本领投,

    蘑菇物联完成B轮融资,由纪源资本领投,

    据投资界2月11日消息,通用工业设备一站式AIoT SaaS服务商蘑菇物联近日宣布获得纪源资本领投投资。 B轮融资由老股东元和源电、银杏谷资本共同投资。 本轮融资将用于人才扩充、产品研发、业务拓展和扩大品牌影响力。 蘑菇物联成立于2015年,致力于通过新一代信息技术与制造应

    06-17

  • 投资世界24小时 -字节跳动成立抖音集团或在香港上市;欧莱雅在中国成立第一家投资公司;可口可乐100年涨幅超过50万倍

    投资世界24小时 -字节跳动成立抖音集团或在香港上市;欧莱雅在中国成立第一家投资公司;可口可乐100年涨幅超过50万倍

    时间:2020年5月9日星期一重要消息字节跳动成立抖音集团,或可能在香港上市。 据投资界5月8日消息,从香港公司注册处网站发现,字节跳动(香港)有限公司已更名为抖音集团(香港)有限公司,生效时间是今年的5月6日。 此外,字节跳动旗下的其他几家公司也纷纷更名为“抖音”。

    06-18

  • 阿里云刘伟光:“高质量云迁移”给互联网带来新动能

    阿里云刘伟光:“高质量云迁移”给互联网带来新动能

    某红星美凯龙店,10分钟即可在云端完成一套全屋家居设计效果图;四川三星堆考古遗址在云端以1:1的比例还原为虚拟场景,供网友身临其境体验;在网易瑶台的虚拟活动中,每个参与者都可以塑造自己的形状来远程参与会议……这些体验的背后都是云计算。 7月25日,阿里巴巴集团副总

    06-18

  • 去东南亚,是寻找“金子”,还是解决ToB问题的新途径?

    去东南亚,是寻找“金子”,还是解决ToB问题的新途径?

    雷锋网简介:如今,中国互联网企业在成长的道路上不可避免地会遇到一个无解的选择题:被巨头??收购,被VC收购,还是死亡。 去东南亚不仅是淘金,更是寻找解决问题的新思路。 过去几年,在中国海外扩张东南亚和互联网金融创业的交汇点,ADVANCE.AI无疑是一支明星团队。 受到高

    06-18

  • 原创创新生物制药企业鸿云华宁完成7800万美元C轮融资

    原创创新生物制药企业鸿云华宁完成7800万美元C轮融资

    鸿云华宁近日完成1万美元C轮融资。 投资方为招商致远资本、中原投资、紫曜基金、柏龄医疗、老虎药业、东莞集团、华亚博瑞资本、同创伟业。 听,中小企业反馈平台。 倾听用户需求,倾听创业者声音,解决中小企业痛点。 点击立即参与调查并获得礼物。

    06-17

  • 传闻苹果新显示器将由 LG 代工,可能支持 Mini LED 背光显示

    传闻苹果新显示器将由 LG 代工,可能支持 Mini LED 背光显示

    苹果爆料人 Dylan 周四(16 日)透露,苹果计划推出三款新显示器,并将由 LG 代工。 Dylan 在推特上表示,LG 正在生产基于 24 英寸和 27 英寸 iMac 的新显示器,以及带有内置芯片的 32 英寸显示器。 Dylan 表示,这三个显示屏目前没有品牌,但至少可以假设 32 英寸显示屏是苹

    06-08

  • 斑马管家云完成8000万元A+轮融资,重新定义家政行业

    斑马管家云完成8000万元A+轮融资,重新定义家政行业

    投资圈(ID:pedaily)据1月20日消息,家政行业龙头企业斑马管家云召开“重新定义”品牌战略升级南京发布会并宣布完成A+轮融资,金额1万元。 本轮融资由金域茂物投资管理有限公司领投,永达传媒等公司跟投。 本轮融资将用于提升培训学校教学能力、打造服务供应链能力、投资技

    06-17

  • 【全球财经24小时】2024年5月13日投融资事件汇总及详情

    【全球财经24小时】2024年5月13日投融资事件汇总及详情

    欢迎订阅《全球财经24小时》系列文章,动起你的小手指,帮助我们更好更快地获取资讯给你~ 点击此处输入表格摘要。 今日全球市场共发生14起投资披露事件,其中境内9起,境外5起。 其中,国内先进制造业5起,医疗健康行业2起,电商行业1起,金融行业1起。 国外区块链行业1个案例

    06-18

  • 冷链机器人云工厂“粤仕机器人”完成数千万元天使轮融资

    冷链机器人云工厂“粤仕机器人”完成数千万元天使轮融资

    投资界(ID:pedaily)10月16日消息,冷链云工厂平台“粤仕机器人”近日完成数千万元天使轮融资本轮融资由海逸投资领投,TPT资本提供财务顾问服务。 本轮融资将用于研发和业务拓展。 广东施机器人由北京大学、浙江大学、香港大学的博士团队联合创立。 其将人工智能、环境感知

    06-17

  • 人形机器人太受欢迎了!但人形比狗形酷吗? | 橙子真多

    人形机器人太受欢迎了!但人形比狗形酷吗? | 橙子真多

    人形机器人太受欢迎了!但人形比狗形酷吗? |橘子计数原创 Judy IT 橘子IT 橘子微信IDitjuzi关于专题 新经济权威创投数据服务商,洞察创投数据趋势 06-07 13:08 北京 封面图片 | Pexels 通俗地说,它是一个人形机器人。 说得更高级一点,就是体现智能——一个在业界突然爆火的

    06-18

  • 【每日投资事件】华平投资马富麟:赴美上市靠实力

    【每日投资事件】华平投资马富麟:赴美上市靠实力

    华平马富麟:中概股危机是周期性事件。 在美国上市需要更强的实力  对于规模较小的公司,尤其是通过反向收购在美国上市的中国公司来说,由于对美国市场缺乏足够的了解以及个别公司的欺诈行为,美国投资者投资中国企业的热情大幅下降,美国资本市场分析师也失去了注意力。 动

    06-17