文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-26 05:12

关注

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

一.组合widget实现

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

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轴向下变大。

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

void drawRect(Rect rect, Paint paint) {...} //画矩形void drawLine(Offset p1, Offset p2, Paint paint) {...} //画线void drawPoints(PointMode pointMode, List<Offset> 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构建自定义Widgets的方法是什么

附: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的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯