Flutter组件开发过程完整讲解

首先统一一个概念,不管是component(组件),widget(控件),module(android的模块)在我的理解能力范围内,都是为了抽离某个特定的功能,对外接受参数,对内实现功能的某一个代码块。

它是一个颗粒化的实体,是相对于建筑物的钢筋,水泥,砖头。他们个有特点,相互独立,各有特性,同时又提供了某种可以内聚融合的对外接口。component(组件),widget(控件)下面都统称组件,对component,widget有不同理解的朋友,希望能在评论区收到你们的见解和建议。

在前端开发中,不管vue,react,jquery,原生(html,js,css组合)都提供了或可封装组件的功能。那其它们都是存在共性的,只有深入浅出之后,抽象出这种通用的概念,我们才可以轻松的在不同的框架,语言之中,快速实现我们所想要的功能。

那为什么今天会记录一下flutter的组件开发呢?因为我需要用flutter的方式去实现一个component。flutter是我不熟悉的一个ui框架。那些已经抽象出来的组件概念,需要使用flutter框架以及dart语言特性去把它实现出来。

熟悉vue,react的童鞋们,对组件可以会有一下的一些概念:

1,组件要接受prop

2,组件要有默认的prop

3,组件内部有自己维护的变量

4,组件的prop可选

5,组件的prop有特定的值,如果不匹配到的属性值无效(枚举)

6,组件同一个prop属性的不同值会有不同的样式(例如antd button的type)

7,组件的多个prop会组成不同的样式 例如antd button的type和status(warn,danger,loading)

8,组件有必传的prop

9,组件有可选的且无默认值的prop

那接下来我们用flutter一步步的实现上面的功能

【3,组件内部有自己维护的变量】

所以这个组件是个有自己状态的组件,所以要继承StatefulWidget

【1,组件要接受prop】

【2,组件要有默认的prop;】

代码如下:

class Button extends StatefulWidget {
  double height = 48;//默认prop
State<Button> createState() => _ButtonState();
}
class _ButtonState extends State<Button>{}

【8,组件有必传的prop】,text参数必传

class Button extends StatefulWidget {
final String text;
Button(
      {
super.key,
      required this.text
});
State<Button> createState() => _ButtonState();
}
class _ButtonState extends State<Button>{}

【9,组件有可选的且无默认值的prop】,okTxt可选

【4,组件的prop可选】

class Button extends StatefulWidget {
final String? okTxt;
Button(
      {
super.key,
       this.okTxt
});
State<Button> createState() => _ButtonState();
}
class _ButtonState extends State<Button>{}

Oktext使用实话判断是否为null即可

【6,组件同一个prop属性的不同值会有不同的样式(例如antd button的type)】

【7,组件的多个prop会组成不同的样式 例如antd button的type和status(warn,danger,loading)】

这两个更多是内部逻辑,根据特定的prop来重新赋值内部状态的其他变量的值,这两个变量一般是用枚举的方式让外面传入

//按钮类型:默认,边框,危险,文字
enum Type { primary, dashed, warn, text }
//按钮状态:默认,加载中,禁用,点击中
enum Status { primary, loading, disabled }
class Button extends StatefulWidget {
Type type = Type.primary;
  Status status = Status.primary;
Color color =Colors.red;
Button(
      {super.key,
      this.type = Type.primary,
      this.status = Status.primary,
       required this.text}
);
}
class _ButtonState extends State<Button>{
  @override
  void initState() {
    super.initState();
//根据type来维护另外一个变量的值
     switch (widget.type) {
      case Type.primary:
        widget.color = Color.blue;
        break;
default:
        break;
    }
}
}

最后一个疑问?_ButtonState是干嘛的,它内部如何访问Button内声明的变量呢?

_ButtonState是一个提供可访问该组件的生命周期和实现组件具体页面渲染内容的类,而不只是state管理。只是名字看起来让人感觉像是vue的vuex或者react的state,也有可能页面渲染dom在StatefulWidget内也算是个状态吧。

通过widget[变量名](例如widget.type)的方式可以访问到Button class的内部申明的变量(prop)

到此为止,如果能够理解上面的概念,就可以使用flutter写出一个满足日常工作需要的基础组件。

附加一个内容,如果组件需要用到动画,那需用用到混入,用过vue的童鞋可以很容易理解。flutter通过width的语句来混入其他功能,代码:

class _ButtonState extends State<Button> with SingleTickerProviderStateMixin {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->

到此这篇关于Flutter组件开发过程完整讲解的文章就介绍到这了,更多相关Flutter组件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Flutter使用 input chip 标签组件示例详解

    目录 前言 正文 类构造 属性 如何在 Dart 文件中实现代码 全部代码 结论 前言 这里有一些拥有属性的 chip,其中之一就是 input chip.input chip 通常用于以保守的结构处理客户端输入或向客户端提供想法.除了 label 和 avtar 之外,input chip 还可以有一个删除图标.在 Flutter 中,您可以利用 InputChip widget 制作这种 chip. InputChip 是一个 material widget ,它以保守的结构处理令人难以置信

  • Flutter之可滚动组件实例详解

    目录 正文 Scrollable 主轴和纵轴 Viewport Sliver 可滚动组件的通用配置 ScrollController 子节点缓存 Scrollbar 总结 正文 当内容超过显示视口(ViewPort)时,如果没有特殊处理,Flutter则会提示Overflow错误.为此,Flutter提供了多种可滚动widget(Scrollable Widget)用于显示列表和长布局. Flutter中有两种布局模型: 基于 RenderBox 的盒模型布局. 基于 Sliver ( Rend

  • Flutter控制组件显示和隐藏三种方式详解

    目录 方式一:if语句控制 方式二:Offstage组件 方式三: Visibility Offstage和Visibility的区别: 方式一:if语句控制 // 例如: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ if(a=="显示") Text("显示"), Offstage( offstage: false, child: Text("显示"), ),

  • Flutter组件适配方法实现详解

    目录 Flutter 适配组件 1. MediaQuery 2. LayoutBuilder 3. OrientationBuilder 4. Expanded 和 Flexible 5. FractionallySizedBox 6. AspectRatio Flutter 适配组件 在 Flutter 我们只需要掌握一些 Widget 即可,实际的开发过程中,我们也只需要在合适的地方使用它们即可. 1. MediaQuery 第一个 Widget 即是 MediaQuery,通过它可以直接获

  • Flutter之 ListView组件使用示例详解

    目录 ListView的默认构造函数定义 默认构造函数 ListView.builder ListView.separated 固定高度列表 ListView 原理 实例:无限加载列表 添加固定列表头 总结 ListView的默认构造函数定义 ListView是最常用的可滚动组件之一,它可以沿一个方向线性排布所有子组件,并且它也支持列表项懒加载(在需要时才会创建).我们看看ListView的默认构造函数定义: ListView({ ... //可滚动widget公共参数 Axis scrollD

  • Android Flutter实现上拉加载组件的示例代码

    前言 在此之前对列表下拉刷新做了调整方案,具体介绍可以阅读下拉刷新组件交互调整.既然列表有下拉刷新外当然还有上拉加载更多操作了,本次就来介绍如何为列表增加上拉加载更多的交互实现. 实现方案 上拉刷新实现形式上可以有多种实现方式,若不带交互形式可采用NotificationListener组件监听滑动来实现上拉加载更多:如果对操作交互上有一定要求期望上拉刷新带有直观动画可操作性就需要实现一定样式来实现了. 监听NotificationListener实现 NotificationListener(

  • Flutter组件开发过程完整讲解

    首先统一一个概念,不管是component(组件),widget(控件),module(android的模块)在我的理解能力范围内,都是为了抽离某个特定的功能,对外接受参数,对内实现功能的某一个代码块. 它是一个颗粒化的实体,是相对于建筑物的钢筋,水泥,砖头.他们个有特点,相互独立,各有特性,同时又提供了某种可以内聚融合的对外接口.component(组件),widget(控件)下面都统称组件,对component,widget有不同理解的朋友,希望能在评论区收到你们的见解和建议. 在前端开发中

  • Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)

    在git命令行下,执行以下命令完成环境的搭建: 1,npm install --global vue-cli 安装vue命令行工具 2,vue init webpack vue-demo 使用vue命令生成一个webpack项目,项目名称为vue-demo 3,cd vue-demo 切入项目 4,npm install安装package.json中的所有依赖包 5,npm run dev运行项目 一.父组件向子组件传递数据 然后删除默认的Hello.vue组件,把App.vue整理成以下样子:

  • 基于Django框架的权限组件rbac实例讲解

    1.基于rbac的权限管理 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,一个角色拥有若干权限.这样,就构造成"用户-角色-权限"的授权模型.在这种模型中,用户与角色之间,角色与权限之间都是多对多的关系. 简单的模型图示如下: 2.Rbac组件的基本目录结构: 3.按照写的流程,来讲解rbac组件中的各个部分,以及功能, 3.1 models数据库表设计(models.py). 为了在

  • vue输入框组件开发过程详解

    本文实例为大家分享了vue输入框组件开发过程的具体代码,供大家参考,具体内容如下 input-number.js function isValueNumber(value) {     return(/(^-?[0-9]+\.{1}\d+$)|(^-?[1-9]*$)|(^-?0{1}$)/).test(value + ''); } Vue.component('input-number',{     template: '\     <div class=input-number>\   

  • Android开发中Flutter组件实用技巧

    目录 正文 简化 Assert 管理 更容易 imports 从按钮上移除飞溅效果 更简单的平台小工具 可见性小工具 正文 今天我将向您展示 4 个非常有用的 Flutter 技巧,您可以立即应用到您的项目.我不会向您展示任何包或扩展,就像我通常做的那样,但是非常简单,但是非常有用的提示! 简化 Assert 管理 管理 Assert 可能非常困难.如果你想在你的应用程序中多次使用一个图像,你必须一次又一次地指定路径.但是有一个简单得多的解决方案.创建一个 App Assets 类,用于存储所有

  • Android开发Jetpack组件ViewModel使用讲解

    目录 前言 ViewModel概述 ViewModel使用 ViewModel源码 前言 学习ViewModel之前首先我们得简单了解下MVP和MVVM,因为ViewModel是MVVM中的一个元素 MVP MVVM 在MVP中View想要调用Model数据层,需要经过中间层Presenter, 这样就实现了View和Model的解耦,这也是MVP和MVC的差别: 但是如果一个Activity中有太多交互,那么我们的View接口数量就会很庞大达到十几个也不足为奇,并且在View层调用了Prese

  • Android开发Jetpack组件Room使用讲解

    目录 简介 Room使用步骤 1 添加依赖 2 创建Entity实体类 3 声明Dao对象 4 声明Database对象 5 获取数据 6 最终使用 简介 Room 是 Google 官方推出的数据库 ORM 框架.ORM 是指 Object Relational Mapping,即对象关系映射,也就是将关系型数据库映射为面向对象的语言.使用 ORM 框架,我们就可以用面向对象的思想操作关系型数据库,不再需要编写 SQL 语句. Room使用步骤 1 添加依赖 build.gradle {app

  • Android开发Jetpack组件LiveData使用讲解

    目录 LiveData概述 LiveData优势 共享资源 LiveData使用 1 LiveData基本使用 2 Transformations.map() 3 Transformations.switchMap() 4 MediatorLiveData.addSource()合并数据 LiveData概述 LiveData 是一种可观察的数据存储器类: 与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity.Fragment 或 Servi

  • SpringBoot嵌入式Servlet容器与定制化组件超详细讲解

    目录 嵌入式Servlet容器 1.原理分析 2.Servlet容器切换 3.定制Servlet容器配置 定制化组件 嵌入式Servlet容器 在Spring Boot中,默认支持的web容器有 Tomcat, Jetty, 和 Undertow 1.原理分析 那么这些web容器是怎么注入的呢?我们一起来分析一下 当SpringBoot应用启动发现当前是Web应用,它会创建一个web版的ioc容器ServletWebServerApplicationContext 这个类下面有一个createW

  • Java中序列化和反序列化的完整讲解

    目录 一.序列化 二.序列化和反序列化的应用 三.序列化和反序列化地实现 3.1.JDK类库提供的序列化API 3.2.序列化要求 3.3.实现java序列化和反序列化的三种方法 四.CustomerForm 类序列化和反序列化演示 五.Externalizable接口实现序列化与反序列化 5.1.Externalizable 的不同点 5.2.CustomerForm 实现类 Externalizable 5.3.Externalizable 实现序列化和反序列化 总结 一.序列化 1.1.S

随机推荐