【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");
  }
}





目录
相关文章
|
1天前
Flutter 组件(二)文本 与 输入框组件
Flutter 组件(二)文本 与 输入框组件
86 0
|
1天前
|
容器
Flutter 组件(一)组件概述
Flutter 组件(一)组件概述
62 0
|
1天前
|
前端开发 搜索推荐 开发者
【Flutter前端技术开发专栏】Flutter中的自定义主题与暗黑模式
【4月更文挑战第30天】本文介绍了如何在Flutter中自定义主题和实现暗黑模式。通过`ThemeData`类定义应用的外观,包括颜色、字体和样式。示例展示了如何设置主色、强调色及文本、按钮主题。暗黑模式可通过`darkTheme`属性启用,结合`ThemeData.dark()`方法定制。利用`MediaQuery`监听系统亮度变化,动态调整暗黑模式状态。Flutter的这些特性有助于开发者创建独特且用户友好的界面。
【Flutter前端技术开发专栏】Flutter中的自定义主题与暗黑模式
|
1天前
|
缓存 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义绘制与Canvas API
【4月更文挑战第30天】Flutter允许开发者通过`CustomPaint`和`CustomPainter`进行自定义绘制,以实现丰富视觉效果。`CustomPaint` widget将`CustomPainter`应用到画布,而`CustomPainter`需实现`paint`和`shouldRepaint`方法。`paint`用于绘制图形,如示例中创建的`MyCirclePainter`绘制蓝色圆圈。Canvas API提供绘制形状、路径、文本和图片等功能。注意性能优化,避免不必要的重绘和利用缓存提升效率。自定义绘制让Flutter UI更具灵活性和个性化,但也需要图形学知识和性能意识。
【Flutter前端技术开发专栏】Flutter中的自定义绘制与Canvas API
|
1天前
|
前端开发 搜索推荐 UED
【Flutter前端技术开发专栏】Flutter中的高级UI组件应用
【4月更文挑战第30天】探索Flutter的高级UI组件,如`TabBar`、`Drawer`、`BottomSheet`,提升应用体验和美观度。使用高级组件能节省开发时间,提供内置交互逻辑和优秀视觉效果。示例代码展示了如何实现底部导航栏、侧边导航和底部弹出菜单。同时,自定义组件允许个性化设计和功能扩展,但也带来性能优化和维护挑战。参考Flutter官方文档和教程,深入学习并有效利用这些组件。
【Flutter前端技术开发专栏】Flutter中的高级UI组件应用
|
1天前
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
|
1天前
|
前端开发 开发者 UED
Flutter的自定义Painter:深入探索自定义绘制Widget的技术实现
【4月更文挑战第26天】Flutter的自定义Painter允许开发者根据需求绘制独特UI,通过继承`CustomPaint`类和重写`paint`方法实现。在`paint`中使用`Canvas`绘制图形、路径等。创建自定义Painter类后,将其作为`CustomPaint` Widget的`painter`属性使用。此技术可实现自定义形状、渐变、动画等复杂效果,提升应用视觉体验。随着Flutter的进化,自定义Painter将提供更丰富的功能。
|
1天前
|
Dart
Flutter 中优雅切换应用主题的组件
【Flutter】使用adaptive_theme组件优雅切换应用主题:封装MaterialApp,支持light/dark/system模式,自定义色彩,保存选择,含调试按钮。安装配置、设置主题、监听切换、自定义颜色、读取配置步骤详细。代码示例与学习路径推荐。[查看完整教程](https://flutter.ducafecat.com/blog/flutter-app-theme-switch)
Flutter 中优雅切换应用主题的组件
|
1天前
|
运维 监控 定位技术
应用研发平台EMAS常见问题之flutter插件不支持自定义图标如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
80 0
|
1天前
|
开发者 索引 容器
Flutter开发笔记:Flutter 布局相关组件
Flutter开发笔记:Flutter 布局相关组件
138 0

热门文章

最新文章