【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )(一)

简介: 【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )(一)

文章目录

一、Flutter 组件简介

二、Flutter 自定义 StatelessWidget 组件流程

1、导入父类包

2、选择继承的父类

3、设置成员变量及构造函数

4、重写 build 方法

5、完整代码示例

三、Flutter 自定义 StatefulWidget 组件流程

四、使用 final 修饰 Widget 组件成员变量分析

五、调用自定义组件

1、主要方法

2、完整代码

3、效果展示

六、博客资源





一、Flutter 组件简介


Flutter 开发中 , 组件可以是一个 Button 按钮 , Text 文本 , 也可以是封装好的一大块区域 ; 组件由 Widget 组成 ;






二、Flutter 自定义 StatelessWidget 组件流程



1、导入父类包


自定义组件需要继承 StatefulWidget 或 StatelessWidget , 这两个父类组件都在 material.dart 中 , 因此这里先把依赖导入 ;


import 'package:flutter/material.dart';



2、选择继承的父类


自定义组件继承 StatefulWidget 还是 StatelessWidget , 继承哪个组件 , 由组件的性质决定 ;


如果 组件 只是纯展示 , 没有交互操作 , 那么继承 StatelessWidget ;

如果 组件 需要根据交互内容 , 动态修改内容 , 那么继承 StatefulWidget ;


3、设置成员变量及构造函数


声明组件的成员变量 , 注意成员变量使用 final 修饰 ;


/// 组件属性必须使用 final 修饰
  ///   所有的 Widget 组件都是不可变的
  final String name;
  final int? age;
  /// Dart 构造函数中 , {} 内的是可选参数 , 可选参数必须在参数的最后
  ///   这里注意 , 可选参数如果定义为非空类型 , 那么必须有一个默认值
  ///   可选参数如果定义为可空类型 , 可以不用进行初始化
  const StudentStatelessWidget({this.name = "Tom", this.age});



4、重写 build 方法


StatelessWidget 中的 build 方法是抽象方法 , 必须实现 Widget build(BuildContext context) 方法 ;


abstract class StatelessWidget extends Widget {
  const StatelessWidget({ Key? key }) : super(key: key);
  @override
  StatelessElement createElement() => StatelessElement(this);
  @protected
  Widget build(BuildContext context);
}



继承 StatefulWidget 或 StatelessWidget 后 , 需要重写其 build 构造方法 ,


在该构造方法中 , 自定义组件行为 , 在这里拼装组件即可 ;


@override
  Widget build(BuildContext context) {
    return Text("$name : $age");
  }


5、完整代码示例


import 'package:flutter/material.dart';
/// 自定义组件继承 StatefulWidget 还是 StatelessWidget
///   由组件的性质决定
///   如果 组件 只是纯展示 , 没有交互操作 , 那么继承 StatelessWidget
///   如果 组件 需要根据交互内容 , 动态修改内容 , 那么继承 StatefulWidget
///   StatelessWidget 和 StatefulWidget 都需要导入如下包
///   import 'package:flutter/material.dart';
class StudentStatelessWidget extends StatelessWidget{
  /// 组件属性必须使用 final 修饰
  ///   所有的 Widget 组件都是不可变的
  final String name;
  final int? age;
  /// Dart 构造函数中 , {} 内的是可选参数 , 可选参数必须在参数的最后
  ///   这里注意 , 可选参数如果定义为非空类型 , 那么必须有一个默认值
  ///   可选参数如果定义为可空类型 , 可以不用进行初始化
  const StudentStatelessWidget({this.name = "Tom", this.age});
  @override
  Widget build(BuildContext context) {
    return Text("$name : $age");
  }
}





三、Flutter 自定义 StatefulWidget 组件流程


自定义 StatefulWidget 组件 , 导入的包 定义 final 成员变量 与 StatelessWidget 组件相同 ;


StatefulWidget 中 State createState() 方法是抽象的 ;


因此 , StatefulWidget 组件不再实现 Widget build(BuildContext context) 方法 , 而是实现 State createState() 方法 ;


abstract class StatefulWidget extends Widget {
  const StatefulWidget({ Key? key }) : super(key: key);
  @override
  StatefulElement createElement() => StatefulElement(this);
  @protected
  @factory
  State createState(); // ignore: no_logic_in_create_state, this is the original sin
}



State<StatefulWidget> createState() 方法返回值类型 State 需要设置一个泛型 , 说明该 State 是用于哪个 StatefulWidget 组件的 ; 该泛型必须是 StatefulWidget 的子类 ;


@optionalTypeArgs
abstract class State<T extends StatefulWidget> with Diagnosticable {
  @protected
  Widget build(BuildContext context);
}


自定义 State 类必须实现 Widget build(BuildContext context) 抽象方法 ;



实现的 StatefulWidget 的 createState 方法返回值 , 一般需要自定义 State<StatefulWidget> 实现类 ;


State<StatefulWidget> createState()


在该 State<StatefulWidget> 实现类中 , 实现 build 方法 , 返回要显示的组件 ;


/// 该类用于管理组件中的状态
///   需要继承 createState 方法返回值类型 State<StatefulWidget>
///   在该类中 , 调用 setState 方法 , 可以更新组件
class _StudentStatefulWidgetState extends State<StatefulWidget> {
  /// 成员变量
  String name;
  int age;
  /// 构造函数
  _StudentStatefulWidgetState(this.name, this.age);
  @override
  Widget build(BuildContext context) {
    return Text("$name : $age");
  }
}



完整代码示例 :




import 'package:flutter/material.dart';
/// 自定义组件继承 StatefulWidget 还是 StatelessWidget
///   由组件的性质决定
///   如果 组件 只是纯展示 , 没有交互操作 , 那么继承 StatelessWidget
///   如果 组件 需要根据交互内容 , 动态修改内容 , 那么继承 StatefulWidget
///   StatelessWidget 和 StatefulWidget 都需要导入如下包
///   import 'package:flutter/material.dart';
class StudentStatefulWidget extends StatefulWidget{
  /// 组件属性必须使用 final 修饰
  ///   所有的 Widget 组件都是不可变的
  final String name;
  final int? age;
  /// Dart 构造函数中 , {} 内的是可选参数 , 可选参数必须在参数的最后
  ///   这里注意 , 可选参数如果定义为非空类型 , 那么必须有一个默认值
  ///   可选参数如果定义为可空类型 , 可以不用进行初始化
  const StudentStatefulWidget({this.name = "Tom", this.age});
  @override
  State<StatefulWidget> createState() => _StudentStatefulWidgetState(name, age!);
}
/// 该类用于管理组件中的状态
///   需要继承 createState 方法返回值类型 State<StatefulWidget>
///   在该类中 , 调用 setState 方法 , 可以更新组件
class _StudentStatefulWidgetState extends State<StatefulWidget> {
  /// 成员变量
  String name;
  int age;
  /// 构造函数
  _StudentStatefulWidgetState(this.name, this.age);
  @override
  Widget build(BuildContext context) {
    return Text("$name : $age");
  }
}





目录
相关文章
|
11天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
141 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
24天前
|
Dart 前端开发 容器
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
75 18
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
27天前
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
116 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
3月前
|
UED 开发者 容器
Flutter&鸿蒙next 的 Sliver 实现自定义滚动效果
Flutter 提供了强大的滚动组件,如 ListView 和 GridView,但当需要更复杂的滚动效果时,Sliver 组件是一个强大的工具。本文介绍了如何使用 Sliver 实现自定义滚动效果,包括 SliverAppBar、SliverList 等常用组件的使用方法,以及通过 CustomScrollView 组合多个 Sliver 组件实现复杂布局的示例。通过具体代码示例,展示了如何实现带有可伸缩 AppBar 和可滚动列表的页面。
173 1
|
3月前
|
开发工具
Flutter&鸿蒙next中封装一个列表组件
Flutter&鸿蒙next中封装一个列表组件
69 0
|
3月前
Flutter 自定义组件继承与调用的高级使用方式
本文深入探讨了 Flutter 中自定义组件的高级使用方式,包括创建基本自定义组件、继承现有组件、使用 Mixins 和组合模式等。通过这些方法,您可以构建灵活、可重用且易于维护的 UI 组件,从而提升开发效率和代码质量。
160 1
|
3月前
|
前端开发 开发者
深入探索 Flutter 鸿蒙版的画笔使用与高级自定义动画
本文深入探讨了 Flutter 中的绘图功能,重点介绍了 CustomPainter 和 Canvas 的使用方法。通过示例代码,详细讲解了如何绘制自定义图形、设置 Paint 对象的属性以及实现高级自定义动画。内容涵盖基本绘图、动画基础、渐变动画和路径动画,帮助读者掌握 Flutter 绘图与动画的核心技巧。
100 1
|
3月前
|
Dart UED 开发者
Flutter&鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面的重要组成部分。Flutter提供了多种内置按钮组件,但有时这些样式无法满足特定设计需求。因此,封装一个自定义按钮组件变得尤为重要。自定义按钮组件可以确保应用中所有按钮的一致性、可维护性和可扩展性,同时提供更高的灵活性,支持自定义颜色、形状和点击事件。本文介绍了如何创建一个名为CustomButton的自定义按钮组件,并详细说明了其样式、形状、颜色和点击事件的处理方法。
112 1
|
索引
【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )(二)
【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )(二)
125 0
【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )(二)
|
Dart 开发者 索引
【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )(三)
【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )(三)
118 0
【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )(三)

热门文章

最新文章

  • 1
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 6
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 7
    零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
  • 8
    flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
  • 9
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 10
    【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    14
  • 2
    零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
    58
  • 3
    flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
    38
  • 4
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    141
  • 5
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 6
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 7
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121
  • 8
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    75
  • 9
    flutter开发中Use ‘const’ with the constructor to improve performance. Try adding the ‘const’ keyword to the constructor invocation.报错如何解决-优雅草卓伊凡
    18
  • 10
    【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    27