聊一聊Flutter自定义组件

自定义组件介绍

  • 何时需要自定义组件
    • Flutter提供的现有组件无法满足业务需求,或者需要封装一些通用组件,多处复用时
  • Flutter中自定义组件有三种方式:
    • 通过组合其它组件
    • 自绘组件
    • 实现RenderObject

自定义组件类型

  • 组合其它Widget
    • 该方式通过拼装其它组件来组合成一个新的组件。
  • 自绘组件
    • 若遇到无法通过现有的组件来实现需要的UI时,可以通过自绘组件的方式来实现,例如一个颜色渐变的圆形进度条。
  • 实现RenderObject
    • Flutter提供的自身具有UI外观的组件,如TextImage都是通过相应的RenderObject渲染出来的。

自绘组件

  • 对于一些复杂或不规则的UI,可能无法通过组合其它组件的方式来实现
    • 比如需要一个渐变的圆形进度条、一个棋盘等。
  • 几乎所有的UI系统都提供一个自绘UI的接口,该接口通常会提供一块2D画布Canvas
    • Canvas内部封装一些基本绘制的API,开发者可以通过Canvas绘制各种自定义图形。
    • 在Flutter中,提供了一个CustomPaint 组件,可结合画笔CustomPainter来实现自定义图形绘制。

CustomPaint类

  • CustomPaint构造函数:
    CustomPaint({Key key,this.painter, this.foregroundPainter,this.size = Size.zero, this.isComplex = false, this.willChange = false, Widget child, //子节点,可以为空})
  • 阐述一下参数含义
    • painter: 背景画笔,会显示在子节点后面;
    • foregroundPainter: 前景画笔,会显示在子节点前面
    • size:当child为null时,代表默认绘制区域大小,如果有child则忽略此参数,画布尺寸则为child尺寸。如果有child但是想指定画布为特定大小,可以使用SizeBox包裹CustomPaint实现。
    • isComplex:是否复杂的绘制,如果是,Flutter会应用一些缓存策略来减少重复渲染的开销。
    • willChange:和isComplex配合使用,当启用缓存时,该属性代表在下一帧中绘制是否会改变。

示例:五子棋盘

  • 下面是五子棋游戏中棋盘和棋子的绘制来演示自绘UI的过程:
    import 'package:flutter/material.dart';import 'dart:math';class CustomPaintRoute extends StatelessWidget {@overrideWidget build(BuildContext context) {return Center(child: CustomPaint(size: Size(300, 300), //指定画布大小painter: MyPainter(),),);}}class MyPainter extends CustomPainter {@overridevoid paint(Canvas canvas, Size size) {double eWidth = size.width / 15;double eHeight = size.height / 15;//画棋盘背景var paint = Paint()..isAntiAlias = true..style = PaintingStyle.fill //填充..color = Color(0x77cdb175); //背景为纸黄色canvas.drawRect(Offset.zero & size, paint);//画棋盘网格paint..style = PaintingStyle.stroke //线..color = Colors.black87..strokeWidth = 1.0;for (int i = 0; i <= 15; ++i) {double dy = eHeight * i;canvas.drawLine(Offset(0, dy), Offset(size.width, dy), paint);}for (int i = 0; i <= 15; ++i) {double dx = eWidth * i;canvas.drawLine(Offset(dx, 0), Offset(dx, size.height), paint);}//画一个黑子paint..style = PaintingStyle.fill..color = Colors.black;canvas.drawCircle(Offset(size.width / 2 - eWidth / 2, size.height / 2 - eHeight / 2),min(eWidth / 2, eHeight / 2) - 2,paint,);//画一个白子paint.color = Colors.white;canvas.drawCircle(Offset(size.width / 2 + eWidth / 2, size.height / 2 - eHeight / 2),min(eWidth / 2, eHeight / 2) - 2,paint,);}//在实际场景中正确利用此回调可以避免重绘开销,本示例我们简单的返回true@overridebool shouldRepaint(CustomPainter oldDelegate) => true;}

绘制性能问题

  • 在实现自绘控件时应该考虑到性能开销,下面是关于性能优化的建议:
    • 利用好shouldRepaint返回值;在UI树重新build时,控件在绘制前都会先调用该方法以确定是否有必要重绘;若绘制的UI不依赖外部状态,就应该始终返回false,因为外部状态改变导致重新build时不会影响UI外观;
    • 若绘制依赖外部状态,则应该在shouldRepaint中判断依赖的状态是否改变,如果已改变则应返回true来重绘,反之则应返回false不需要重绘。
    • 绘制尽可能多的分层;在上面五子棋示例中,将棋盘和棋子的绘制放在了一起,这样会有一个问题:由于棋盘始终是不变的,用户每次落子时变的只是棋子,但是如果按照上面的代码来实现,每次绘制棋子时都要重新绘制一次棋盘,是没必要的。优化的方法就是将棋盘单独抽为一个组件,并设置其shouldRepaint回调值为false,将棋盘组件作为背景。将棋子的绘制放到另一个组件中,这样每次落子时只需要绘制棋子。
  • 自绘控件理论上可以实现任何2D图形外观
    • Flutter提供的所有组件最终都是通过调用Canvas绘制出来的,只不过绘制的逻辑被封装起来。

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
img
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27955.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复旦团队大模型 MOSS 开源了,有哪些技术亮点值得关注?

来源&#xff1a;知乎 孙天祥&#xff08;AWS应用科学家&#xff09;回答&#xff1a; 新上传3个gptq量化版模型权重本回答新增对线区 首先解释一下我们的MOSS版本&#xff0c;目前开源的版本我们称为MOSS 003&#xff0c;二月份公开邀请内测的版本为MOSS 002&#xff0c;一月份…

Google杀入AI聊天机器人领域,暴跌千亿?错哪了?

大家好&#xff0c;ChatGPT 现在被大家玩坏了&#xff0c;甚至在用户的不断逼问之下&#xff0c;露出了鸡脚&#xff0c;原来 ChatGPT 也是小黑子 ChatGPT 太火了&#xff0c;火的谷歌都坐不住了。 为了应对爆火的ChatGPT&#xff0c;谷歌推出的Bard&#xff0c;但是谷歌翻车了…

不满足当 ChatGPT “接口侠”?轻松可视化 Fine-tuning 训练你的模型!

项目地址&#xff1a;https://github.com/ltyzzzxxx/gpt-web-terminal 欢迎大家Star、提出PR&#xff0c;一起快乐地用 GPT Terminal 玩耍吧&#xff5e; 前言 距 ChatGPT 问世已经过去半年多啦&#xff0c;大家一定有些审美疲劳了&#xff0c;不满足于 ChatGPT 提供的对话服…

PyCaret:低代码自动化的机器学习工具

PyCaret简介 随着ChatGPT和AI画图的大火&#xff0c;机器学习作为实现人工智能的底层技术被大众越来越多的认知&#xff0c;基于机器学习的产品也越来越多。传统的机器学习实现方法需要较强的编程能力和数据科学基础&#xff0c;这使得想零基础尝试机器学习变得非常困难。 机器…

Science子刊带来新遗传证据:早期人类驯化了自己

来源&#xff1a;中国生物技术网 在开始驯化狗、猫、绵羊和牛等动物前&#xff0c;人类可能已经有了驯化一种完全不同动物的传统&#xff0c;就是我们人类自己。近日&#xff0c;发表在《Science Advances》上的一项新研究引用从某种程度上反映驯化元素的一种疾病的遗传证据表明…

人类早期驯化VS2019的珍贵记录

代码自动补全 在输入符号的时候VS会自动把代码补全&#xff0c;比如我想写一个函数名mai()&#xff0c;但是在我打出括号“&#xff08; ”的时候&#xff0c;VS自动把代码补成了main( 解决方法&#xff1a; 打开选项窗口&#xff0c;按图找到那个“成员列表提交字符”的栏&am…

Chart GPT 暗黑版上线,网络安全问题已经显现

前言 Chart GPT刚刚发布&#xff0c;一位不知名的作者将它的孪生兄弟“DAN”就在世界上最黑暗的暗网上线了。 这个黑化的GPT刚刚上线的一周后&#xff0c;就已经有组织利用“DAN”犯罪了。 他们利用虚拟电话号码注册各种交友平台的账号&#xff0c;然后再模仿有魅力的男女人…

2023最新网络安全岗位面试题汇总

前言 一、渗透测试 如何绕过CDN找到真实IP&#xff0c;请列举五种方法 (★★★) redis未授权访问如何利用&#xff0c;利用的前提条件是&#xff1f;(★★★) mysql提权方式有哪些?利用条件是什么? (★) windowsmysql&#xff0c;存在sql注入&#xff0c;但是机器无外网权…

Bito AI——智能编程辅助软件,提升10倍开发效率!(New)

目录 前言 [Bito News] Updates更新于2023-06-15 1、Bito融资320万美元&#xff0c;加速下一代版本的研发 2、支持自定义设置输出语言&#xff08;超过17种语言&#xff09; 3、IDE 上下文菜单中自定义模板 4、Bito CLI中引入上下文记忆 5、自定义模板&#xff08;Prompt…

干货渗透测试面试题汇总

干货|渗透测试面试题汇总 以下为信息安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;没有填答案是希望大家如果不懂能自己动手找到答案&#xff0c;祝各位都能找到满意的工作:) 注:做这个List的目标不是全&#xff0c;因为无论如何都不可能…

ChatGPT模型大战:讯飞星火认知大模型、百度文心一言能否击败GPT-4(含个人内测体验测试邀请码获取方法,2小时申请成功,亲测有效)

目录 前言讯飞星火内测申请申请方式内测体验登录界面 百度内测申请内测对比基本问答事实性问答科普文写作小红书文案项目计划撰写古文理解模型的常识能力和反事实推理代码理解法律相关广告话术数字排序数值计算推理解题跨语言能力文生图 总结个人感受一、你有使用过这种对话式A…

OpenAI

OpenAI ChatGPT OpenAI: https://openai.com 禾斗 ChatGPT ChatGPT: https://chat.openai.com/chat zhuce 接码(zhuce需要国外手机号接收验证码) SMS-Activate: https://sms-activate.org zhuce登录 接码 登录 ChatGPT: https://chat.openai.com/chat

Aleo隐私智能合约__火箭准备发射

文章目录 走进误区大哥大时代 点对点电子现金系统智能机时代 去中心化状态机月球与地心引力火箭Aleo 我们&#xff0c;都是站在巨人的肩膀上&#xff0c;进行不断地探索、创新&#xff0c;完善这个人类生态。在此&#xff0c;感谢前人们对去中心化技术的不断探索。 走进误区 …

讯飞版大模型来了,现场发布四大行业应用成果

文章目录 人工智能福利文章前言SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写亲自体验写在最后 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的…

美国版权局《AI生成作品版权申请指南》:大利好!

真的非常有意思。 2月22日&#xff0c;无界AI发布了《文生文、文生图……狂飙的AIGC&#xff0c;会先在哪里落地&#xff1f;》提到当时文生文大模型还没有一家选择开源&#xff0c;导致小模型生态难以发展。结果3月2日&#xff0c;ChatGPT就开放了API&#xff0c;甚至在3月14日…

[Python+Django]Web图书管理系统毕业设计之数据库及系统实现源码篇

前排提醒,本文干货超多,为避免消化不良建议配合目录食用 本系列博文献给即将毕业的程序猿们,系列文章共三篇,在编写的过程中可以说几乎是参照毕业设计目录样式来进行的. 相关图表和截图也都几乎按照毕业设计论文的要求来编制,完整阅读消化此系列博文套上一个毕业论文的目录和格…

SpringBoot + Websocket + Vue 构建聊天室

前言 关于 WebSocket: 1、WebSocket 是 html5 提供的通讯协议 2、特点是建立在单个 tcp 连接上的全双工协议 3、浏览器向服务器发起 WebSocket 连接请求&#xff0c;当成功获取到连接后&#xff0c;就可以实现浏览器和服务器之间的数据传输版本 后端: springboot 2.0 前端: vu…

Geoffrey Hinton、姚期智、张钹、Sam Altman等专家共话AI安全与对齐丨2023智源大会议程公开...

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请AI领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、OpenAI创始人Sam Altman、图灵奖得主Ge…

In-context learning如何工作?斯坦福学者用贝叶斯方法解开其奥秘

译者 | 黄灿安 单位 | 东北大学自然语言处理实验室 来自 | 机器翻译学堂 进NLP群—>加入NLP交流群 作者&#xff1a;Sang Michael Xie和 Sewon Min 引言 去年底&#xff0c;OpenAI研发的ChatGPT一经面世&#xff0c;在引起了大家惊讶的同时&#xff0c;也纷纷引发大家的思考…

chatgpt赋能python:Python动态规划详解:从入门到精通

Python动态规划详解&#xff1a;从入门到精通 什么是动态规划&#xff1f; 动态规划是一种常用的算法思想&#xff0c;它可以解决一类优化问题&#xff0c;例如路径规划、序列匹配等问题。动态规划算法的基本思路是将复杂的问题分解成若干个子问题&#xff0c;并对每个子问题…