千家信息网

Flutter构建自定义Widgets的方法是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"Flutter构建自定义Widgets的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Flutter构建自定义Widge
千家信息网最后更新 2026年11月01日Flutter构建自定义Widgets的方法是什么

这篇文章主要讲解了"Flutter构建自定义Widgets的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Flutter构建自定义Widgets的方法是什么"吧!

一.组合widget实现

1.android和flutter自定义控件对比

Android中,一般会继承View或已经存在的某个控件,然后覆盖draw方法来实现自定义View。在Flutter中,一个自定义widget通常是通过组合其它widget来实现的,而不是继承。下面看看如何构建持有一个label的CustomButton。这是通过将Text与RaisedButton组合来实现的,而不是继承RaisedButton并重写其绘制方法实现,eg :custombuttontest.dart

import 'package:flutter/material.dart'; class CustomButtonTest extends StatelessWidget{  final String textStr;  CustomButtonTest(this.textStr);   @override  Widget build(BuildContext context) {    return RaisedButton(      onPressed: (){},      child: Text(        textStr,        textAlign: TextAlign.center,      )    );  } }

上面定义好组件之后,可直接在调用build的方法中现实,eg :

@override  Widget build(BuildContext context) {    return new Center(      child: new CustomButton("Custom Button"),    );  }}

二.通过自定义CustomPainter实现widgets

1.CustomPainter主要属性介绍,和Android开发中的自定义View类似,Flutter中的绘制也是依靠Canvas和Paint来实现的

1).Canvas //画布,为开发者提供了点、线、矩形、圆形、嵌套矩形等绘制方法。

2).Paint //画笔,可以设置抗锯齿,画笔颜色,粗细,填充模式等属性,绘制时可以定义多个画笔以满足不同的绘制需求。eg:

Paint _paint = new Paint()..color = Colors.red // 画笔颜色 ..strokeCap = StrokeCap.round //画笔笔触类型,包括(1.round-画笔笔触呈半圆形轮廓开始和结束;2.butt-笔触开始和结束边缘平坦,没有外延;3.square-笔触开始和结束边缘平坦,向外延伸长度为画笔宽度的一半)..isAntiAlias = true //是否启动抗锯齿..style=PaintingStyle.fill //绘画风格,默认为填充,有fill和stroke两种..blendMode=BlendMode.exclusion //颜色混合模式..colorFilter=ColorFilter.mode(Colors.blueAccent, BlendMode.exclusion)//颜色渲染模式..maskFilter=MaskFilter.blur(BlurStyle.inner, 3.0)//模糊遮罩效果..filterQuality=FilterQuality.high//颜色渲染模式的质量..strokeWidth = 15.0;//画笔的宽度

3).Offset //坐标,可以用来表示某个点在画布中的坐标位置。

4).Rect //矩形,在图形的绘制中,一般都是分区域绘制的,这个区域一般都是一个矩形,在绘制中通常使用Rect来存储绘制的位置信息。

5).坐标系 //在Flutter中,坐标系原点(0,0)位于左上角,X轴向右变大,Y轴向下变大。

2.painting.dart中的主要方法,eg:

void drawRect(Rect rect, Paint paint) {...} //画矩形void drawLine(Offset p1, Offset p2, Paint paint) {...} //画线void drawPoints(PointMode pointMode, List points, Paint paint) {...} //画点void drawCircle(Offset c, double radius, Paint paint) {...} //画圆void drawArc(Rect rect, double startAngle, double sweepAngle, bool useCenter, Paint paint) {...} //画圆弧

三.饼状图piechart.dart代码展示

import 'dart:math';import 'package:flutter/material.dart'; class PieChartTest extends StatelessWidget{  const PieChartTest({Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: const Text('pie chart'),      ),      body:Container(        alignment: Alignment.center,        child: CustomPaint(          size: const Size(300, 300),          painter: PieChartPainter(),        ),      )    );  }} class PieChartPainter extends CustomPainter{   Paint getColoredPaint(Color color){    Paint paint=Paint();    paint.color=color;    return paint;  }   @override  void paint(Canvas canvas, Size size) {    double wheelSize=min(size.width, size.height)/2;    double nbElem=8;    double radius=(2*pi)/nbElem;    Rect boundingRect=Rect.fromCircle(center: Offset(wheelSize,wheelSize), radius: wheelSize);    canvas.drawArc(boundingRect, 0, radius, true, getColoredPaint(Colors.orange));    canvas.drawArc(boundingRect, radius, radius, true, getColoredPaint(Colors.black));    canvas.drawArc(boundingRect, radius*2, radius, true, getColoredPaint(Colors.green));    canvas.drawArc(boundingRect, radius*3, radius, true, getColoredPaint(Colors.red));    canvas.drawArc(boundingRect, radius*4, radius, true, getColoredPaint(Colors.blue));    canvas.drawArc(boundingRect, radius*5, radius, true, getColoredPaint(Colors.yellow));    canvas.drawArc(boundingRect, radius*6, radius, true, getColoredPaint(Colors.purple));    canvas.drawArc(boundingRect, radius*7, radius, true, getColoredPaint(Colors.white));  }   @override  bool shouldRepaint(covariant CustomPainter oldDelegate)=>oldDelegate!=this;}

四.实际效果图,eg:

附:Flutter中父widget调用子widget的方法

一、定义globalKey,注意<>中的是State类。

final _childWidgetKey = GlobalKey();

二、在父页面初始化子widget

ChildPage(key:_receiveKey),

三、

class ChildPage extends StatefulWidget {undefinedChildPage({Key key}) : super(key: key);@overrideChildPageState createState() => ChildPageState();}

四、在父界面调用子widget中的方法

_childWidgetKey.currentState.onRefresh();

感谢各位的阅读,以上就是"Flutter构建自定义Widgets的方法是什么"的内容了,经过本文的学习后,相信大家对Flutter构建自定义Widgets的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

方法 画笔 矩形 颜色 坐标 模式 笔触 学习 组合 平坦 位置 内容 坐标系 外延 宽度 属性 控件 效果 画布 边缘 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网 互联网通讯科技 网络科技有限互联网 北京禾田雨橡互联网科技 互联网科技股有哪些 汉立互联网科技有限公司联系电话 济南和联互联网科技有限公司 互联网和高科技公司 玖二柒互联网科技公司待遇 创业天下互联网科技有限公司 互联网时代科技改变生活 黑科技闪耀互联网之光 洛阳昕诺飞互联网科技有限公司 华夏恒生科技与互联网科技 2021互联网科技公司排名 江苏苏星互联网科技有限公司 上海同邻互联网科技有限公司规模 福州德业互联网科技 互联网科技企业商标注意事项 互联网科技对化妆品行业 广州大一互联网络科技有限公司 互联网科技公司华为 互联网科技未来 互联网与新科技 多迪互联网科技有限公司 用友工业互联网科技发展 宇信科技在杭州互联网排第几 上海互联网科技公司ppt 广东鹅鹅鹅互联网科技有限公司 互联网科技品牌
0