Flutter中组件Widget的粗解

深入理解Flutter生命周期函数之StatefulWidget(一) 在Flutter中,生命周期函数是管理StatefulWidget状态的关键机制。通过生命周期函数,我们可以控制Widget的初始化、更新和销毁过程,使得应用的状态管理和资源控制更加灵活。本文将详细介绍Flutter中的生命周期函数,帮助你更好地掌握Flutter应用的生命周期。 阅读详情

Flutter 中是通过 Widget 嵌套 Widget 的方式来构建UI和进行事件处理的,所以记住,Flutter 中万物皆为Widget。

widget 的功能是“描述一个UI元素的配置信息”。就是说, Widget 其实并不是表示最终绘制在设备屏幕上的显示元素。

编写方式

通常widget 的构造函数参数应使用命名参数,命名参数中的必需要传的参数要添加required关键字,这样有利于静态代码分析器进行检查;在继承 widget 时,第一个参数通常应该是Key。另外,如果 widget 需要接收子 widget ,那么child或children参数通常应被放在参数列表的最后。同样是按照惯例, widget 的属性应尽可能的被声明为final,防止被意外改变。

class Echo extends StatelessWidget  {
  const Echo({
    Key? key,  
    required this.text,
    this.backgroundColor = Colors.grey, //默认为灰色
  }):super(key:key);
    
  final String text;
  final Color backgroundColor;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: backgroundColor,
        child: Text(text),
      ),
    );
  }
}

StatelessWidget

用于不需要维护状态的场景,它通常在build方法中通过嵌套其他 widget 来构建UI。

class ContextRoute extends StatelessWidget  {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Context测试"),
      ),
      body: Container(
        child: Builder(builder: (context) {
          // 在 widget 树中向上查找最近的父级`Scaffold`  widget 
          Scaffold scaffold = context.findAncestorWidgetOfExactType<Scaffold>();
          // 直接返回 AppBar的title, 此处实际上是Text("Context测试")
          return (scaffold.appBar as AppBar).title;
        }),
      ),
    );
  }
}

Context

build方法有一个context参数,它是BuildContext类的一个实例,表示当前 widget 在 widget 树中的上下文,每一个 widget 都会对应一个 context 对象(因为每一个 widget 都是 widget 树上的一个节点)。实际上,context是当前 widget 在 widget 树中位置中执行”相关操作“的一个句柄(handle),比如它提供了从当前 widget 开始向上遍历 widget 树以及按照 widget 类型查找父级 widget 的方法。

StatefulWidget

和StatelessWidget一样,StatefulWidget也是继承自widget类,并重写了createElement()方法,不同的是返回的Element 对象并不相同;另外StatefulWidget类中添加了一个新的接口createState()。

  • StatefulElement 间接继承自Element类,与StatefulWidget相对应(作为其配置数据)。StatefulElement中可能会多次调用createState()来创建状态(State)对象。

  • createState() 用于创建和 StatefulWidget 相关的状态,它在StatefulWidget 的生命周期中可能会被多次调用。例如,当一个 StatefulWidget 同时插入到 widget 树的多个位置时,Flutter 框架就会调用该方法为每一个位置生成一个独立的State实例,其实,本质上就是一个StatefulElement对应一个State实例。

State

一个 StatefulWidget 类会对应一个 State 类,State表示与其对应的 StatefulWidget 要维护的状态,State 中的保存的状态信息可以:

  1. 在 widget 构建时可以被同步读取。
  2. 在 widget 生命周期中可以被改变,当State被改变时,可以手动调用其setState()方法通知Flutter 框架状态发生改变,Flutter 框架在收到消息后,会重新调用其build方法重新构建 widget 树,从而达到更新UI的目的。

State 中有两个常用属性:

  1. widget,它表示与该 State 实例关联的 widget 实例,由Flutter 框架动态设置。注意,这种关联并非永久的,因为在应用生命周期中,UI树上的某一个节点的 widget 实例在重新构建时可能会变化,但State实例只会在第一次插入到树中时被创建,当在重新构建时,如果 widget 被修改了,Flutter 框架会动态设置State. widget 为新的 widget 实例。

  2. context。StatefulWidget对应的 BuildContext,作用同StatelessWidget 的BuildContext。

State生命周期

  • initState:当 widget 第一次插入到 widget 树时会被调用,对于每一个State对象,Flutter 框架只会调用一次该回调,所以,通常在该回调中做一些一次性的操作,如状态初始化、订阅子树的事件通知等。不能在该回调中调用BuildContext.dependOnInheritedWidgetOfExactType(该方法用于在 widget 树上获取离当前 widget 最近的一个父级InheritedWidget,关于InheritedWidget我们将在后面章节介绍),原因是在初始化完成后, widget 树中的InheritFrom widget也可能会发生变化,所以正确的做法应该在在build()方法或didChangeDependencies()中调用它。

  • didChangeDependencies():当State对象的依赖发生变化时会被调用;例如:在之前build() 中包含了一个InheritedWidget (第七章介绍),然后在之后的build() 中Inherited widget发生了变化,那么此时InheritedWidget的子 widget 的didChangeDependencies()回调都会被调用。典型的场景是当系统语言 Locale 或应用主题改变时,Flutter 框架会通知 widget 调用此回调。需要注意,组件第一次被创建后挂载的时候(包括重创建)对应的didChangeDependencies也会被调用。

  • build():它主要是用于构建 widget 子树的,会在如下场景被调用:

    1. 在调用initState()之后。
    2. 在调用didUpdateWidget()之后。
    3. 在调用setState()之后。
    4. 在调用didChangeDependencies()之后。
    5. 在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其他位置之后。
  • reassemble():此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。

  • didUpdateWidget():在 widget 重新构建时,Flutter 框架会调用widget.canUpdate来检测 widget 树中同一位置的新旧节点,然后决定是否需要更新,如果widget.canUpdate返回true则会调用此回调。正如之前所述,widget.canUpdate会在新旧 widget 的 key 和 runtimeType 同时相等时会返回true,也就是说在在新旧 widget 的key和runtimeType同时相等时didUpdateWidget()就会被调用。

  • deactivate():当 State 对象从树中被移除时,会调用此回调。在一些场景下,Flutter 框架会将 State 对象重新插到树中,如包含此 State 对象的子树在树的一个位置移动到另一个位置时(可以通过GlobalKey 来实现)。如果移除后没有重新插入到树中则紧接着会调用dispose()方法。

  • dispose():当 State 对象从树中被永久移除时调用;通常在此回调中释放资源。

Flutter面试中常问到的问题 注意,这些问题只是作为参考,实际面试中可能会根据公司和职位的不同而有所不同。 前10个带答案,后面的我再慢慢补充。 因此,建议根据自己的经验和技能,对这些问题进行更深入的学习和理解,以便在面试中更好地回答问题。 同时,也要注意在回答问题时,注重表达清晰、简洁、准确,让面试官对你的能力和技术水平有一个清晰的了解。 阅读详情

相关推荐

【Flutter 组件】001-关于 Widget 的一切

Flutter 中的 Widget 是用来秒数 UI 元素的配置信息的,那么真正的布局绘制由谁来完成呢?Flutter 框架的的处理流程:根据 Widget 树生成 Element 树,根据 Element 树生成 Render 树,根据 Render 树生成 Layer 树。1.根据 Widget 树生成一个 Element 树,Element 树中的节点都继承自Element类。2.根据 Element 树生成 Render 树(渲染树),渲染树中的节点都继承自类。

郊眠寺 794

flutter自定义控件 - StatefulWidget获取当前State

StatefulWidget作为一种状态可变的控件,其状态的改变通常是由State.setState进行的,但当我们需要在StatefulWidget之外改变它的状态时,因Widget的重新构造并不一定使得State重新构造,所以我们难以直接获取当前Widget所绑定的State,从而改变StatefulWidget的状态。因此当只使用该StatefulWidget的一个实例时(即页面上只有一个该自定义的StatefulWidget控件),可以通过静态字段来引用State实例。...

Dream It Possible 2131

Flutter之Widget层级介绍

在flutter中,一切皆Widget。无论是显示界面的UI元素,如Text、Image、Icon等;还是功能性组件,如手势检测的GestureDetector组件、应用主题数据传递的Theme组件、移除系统组件自带Padding的MediaQuery组件等。可以说,flutter界面就是由一个个粒度非常细的Widget组合起来的。 由于Widget是不可变的,所以当视图更新时,flutter会创...

大逗的博客 3476

Flutter中的StatelessWidget和StatefulWidget简介与使用

是Flutter中的一个基础类,用于构建不可变的用户界面。这意味着一旦创建,的状态就不会再改变。通常,用于展示静态内容,如显示文本、图像或图标。与不同,是一个有状态的小部件,其状态可以在运行时发生变化。这使得非常适用于需要动态更新的用户界面,如用户输入、网络请求等。

爱喝水程序员的博客 1753

Flutter快速上车之Widget

Flutter作为一种全新的响应式,跨平台,高性能的移动开发框架。从开源以来,已经得到越来越多开发者的喜爱。闲鱼是最早一批与谷歌展开合作,并在重要的商品详情页中使用上线的公司。一路走来,积累了大量的开发经验。虽然越来越多的技术大牛在flutter世界中弄得风声水起,但是肯定有很多的flutter小白希望能快速上手,享受flutter编程的乐趣。本文就是面向刚刚踏上futter的同学,从Flutte...

阿里云云栖号 2714

【Flutter】基础入门:自定义Widget

在 Flutter 开发中,除了使用丰富的内置 Widgets 构建界面外,**自定义 Widget** 是让你的应用更灵活和个性化的重要手段。Flutter 允许你根据需求自定义 `StatelessWidget` 和 `StatefulWidget`,以实现复杂的 UI 组件或功能模块。

2303_80346267的博客 2017

Flutter开发入门——Widget和常用组件

1、什么是Widget?在Flutter中几乎所有的对象都是一个 widget。与原生开发中“控件”不同的是,Flutter 中的 widget 的概念更广泛,它不仅可以表示UI元素,也可以表示一些功能性的组件如:用于手势检测的、用于APP主题数据传递的Theme等等,而原生开发中的控件通常只是指UI元素。可以说,万物皆可Widget。用于不需要维护状态的场景,它通常在build方法中通过嵌套其他 widget 来构建UI,在构建过程中会递归的构建其嵌套的 widget。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 2881

Flutter之Widget大小与位置

在某些需求下,我们需要获取Widget的大小或位置信息。但Widget对象本身没有大小及位置数据,那么想要拿到Widget的大小及位置信息,就需要通过与Widget对象相关联的RenderBox对象来获取。 下面就开始来获取Widget的大小与位置。 1、获取RenderBox对象 要想获取RenderBox对象,其实很简单。只需要调用BuildContext的findRenderObject方法...

大逗的博客 4045

Flutter-Widget组件

记录flutter中的一些实用组件,持续更新

MIILN的博客 2054

关于 StatefulWidget,你不得不知道的原理和要点

深入了解原理,不要一个 setState 打天下!

Flutter 跨平台技术研究 508

Flutter-你还在滥用StatefulWidget吗

对于万物皆Widget的Fultter,同样的事情一般都有多种控件可以实现,太多的选择总是会让人陷入或多或少的选择纠结症和对性能的忧虑上。初次接触Flutter,首先必然要面对的两座大山:StatelessWidget&StatefulWidget。 而在这两个控件的选择上,大部分人给出的解释就是:“就像他们的名字一样,无状态静态的视图展示使用StatelessWidget,而有交互,需要动态变化的使用StatefulWidget.”这样的解释正确,但过于模糊,似乎Sta

Flutter学习笔记-Widget

在 widget 构建时可以被同步读取。在 widget 生命周期中可以被改变,当State被改变时,可以手动调用其setState()方法通知Flutter 框架状态发生改变,Flutter 框架在收到消息后,会重新调用其build方法重新构建 widget 树,从而达到更新UI的目的。widget,它表示与该 State 实例关联的 widget 实例,由Flutter 框架动态设置。

weixin_37188071的博客 1272

退火朗之万动力学采样

退火朗之万动力学采样(Simulated Annealing Langevin Dynamics Sampling)结合了退火技术和朗之万动力学,是一种用于分子模拟和统计物理中的计算方法。这种方法可以帮助系统从局部最小值中逃逸,以找到全局最小值或进行有效的配置空间探索。

weixin_39699362的博客 1947

给Flutter中的Widget设置透明度

给Flutter中的Widget设置透明度 在项目开发中,需要经常用到透明度;比如在app中弹出一个提示框,这个时候的提示框就需要上下左右离边距有一定的距离,然后背景色舍黑色,需要设置透明度为0.4;这在app开发中是很常见的一个功能,如果在Flutter中,我们该如何做到设置透明度。 Opacity使用 在flutter中,可以使用Opacity来设置一个Widget的透明度,并且Opacity...

lvsonghai的博客 6962

Sparse4Dv3

instance_feature也设置为nn.Parameter。修正分支2*(linear->relu->linear->relu->layernorm)->linear->scale,分类分枝2*(linear->relu->layernorm)->linear(256,9),质量评估分枝2*(linear->relu->layernorm)->linear(256,2)。每组两类instance,1是加上范围(-x,x)内均匀分布噪声,2是加上(-2x,-x)U(x,2x)范围内均匀分布噪声。

yuanl15的博客 1351

【ubuntu】【VirtualBox】VirtualBox无法加载USB移动设备的解决方法(支持U盘启动盘)

提示:测试可用。

联系方式:927632640 2439

Flutter Widget

​ 从flutter的架构图中不难看出widget是整个视图描述的基础,Flutter 的核心设计思想便是 everything is a widget. 即一切为Widget,与原生开发中“控件”不同的是,Flutter中的Widget的概念更广泛,它不仅可以表示UI元素,也可以表示一些功能性的组件如:用于手势检测的 GestureDetector widget、用于APP主题数据传递的Theme等等,而原生开发中的控件通常只是指UI元素。​ Flutter 中的 widget 可以用两条规则来约束:

ghroosk的博客 4718

SpringBoot 整合 Drools:从环境搭建到复杂业务落地,精通规则引擎实战指南

本文介绍了Drools规则引擎的基础概念及其与SpringBoot的整合方法。首先概述了规则引擎的核心价值,包括业务规则解耦、可维护性提升等。重点讲解了Drools的核心组件(规则、事实、会话等)及其工作原理。随后详细说明了在SpringBoot项目中集成Drools的步骤,包括添加依赖、配置自动加载规则文件、创建KieContainer等关键配置类。文章还提供了完整的DRL规则文件示例和SpringBoot集成配置代码,为开发人员提供了从理论到实践的完整指导。通过这种方式,可以轻松实现业务规则与系统代码的

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1431

Flutter Widget 体系结构解析

Flutter 是 Google 开发的一款跨平台 UI 框架,它基于 Dart 语言,能够在 iOS、Android、Web、桌面等多个平台运行。Flutter 采用 声明式 UI,并依赖其强大的 Widget 体系来构建界面。本文将深入解析 Flutter 的 Widget 体系结构,帮助开发者理解其运行原理,并掌握构建高效 UI 的方法。

帅次的博客 1544

QML教程04 - Image:搞定界面上的所有图片

本文是QML教程系列的第四篇,重点讲解Image控件的实战用法。文章从图片显示常见的变形、卡顿等问题入手,详细介绍了Image的核心属性和使用技巧。主要内容包括:图片路径的三种写法(相对路径、qrc资源、网络URL)、最重要的fillMode属性解析(PreserveAspectFit、PreserveAspectCrop、Stretch的适用场景)、性能优化方法(sourceSize设置)、异步加载(asynchronous)以及圆形头像的实现方案。

BenBierBa的博客 1608

全志平台camera驱动开发(3)MIPI接口camera驱动开发

详细沟通: 请加video_D 目前开发过的allwinner平台: V5/V3/V3S/V40/T3/T7/A64等 开发过的mipi sensor: sony:imx317、imx477、imx274、imx258、imx286、imx307、imx385等 ov:ov2718、ov12895、ov2710等 ar: ar0238等 国产:gc1024、gc1034...

jzwjzw19900922的博客 9028

Flutter Widget详解

Flutter Widget详解 Widget是Flutter应用程序用户界面的基本构建块。每个Widget都是用户界面一部分的不可变声明。 与其他将视图、控制器、布局和其他属性分离的框架不同,Flutter具有一致的统一对象模型:widget。 Flutter Widget采用现代响应式框架构建,这是从 React 中获得的灵感,中心思想是用widget构建你的UI。 Widget描述了他们的视图在给定其当前配置和状态时应该看起来像什么。当widget的状态发生变化时,widget会重新构建UI,Flu

卜大爷的博客 2万+

YOLO26涨点改进 | 损失函数改进篇 | 引入SlideLoss,适配尺度变化+遮挡+难易样本不平衡,手把手配置+实战案例

COCO-Hard是COCO数据集的复杂场景子集,包含80个类别,重点筛选多尺度、遮挡密集样本,其中小尺度目标(<32×32像素)占比42%,大尺度目标(>128×128像素)占比28%,遮挡目标占比57%,场景涵盖人群密集、车流拥堵、复杂工业环境,完美模拟真实复杂检测场景,适合验证SlideLoss的适配性。

qq_36130719的博客 157

Flutter笔记(2)flutter的widget一切皆为组件

一切皆为组件 Flutter的核心理念:一切皆为Widget。手机应用里的所有东西(按钮、输入框、卡片、列表、布局方式、动画处理等)都可以作为组件Widget,开发者通过可组合的空间集合、丰富的动画库实现了富有感染力应用界面设计。 所以:Flutter具有一只的统一对象模型:Widget。 Widget可以定义为: ......

向着太阳迎着光 974

基于STM32的室内环境监测系统设计与实现

摘要 本文设计了一种基于STM32的室内环境监测系统,通过传感器实时采集温湿度、空气质量、烟雾浓度等数据,并利用Wi-Fi模块上传至云服务器。系统采用STM32F103C8T6作为主控芯片,结合DHT11、MQ系列传感器及BMP280气压传感器实现数据采集,通过ESP8266模块实现远程数据传输。用户可通过手机APP实时查看环境参数,并在数据超标时触发报警。实验表明,系统运行稳定,监测精度高,具有低成本、易扩展等特点,为改善室内环境质量提供了有效解决方案。 关键词:STM32;室内环境监测;传感器;Wi-F

3254968421的博客 221

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ParlAI 中的 Beat The Bot:一个让智能体在线学习交互的 Messenger 聊天机器人游戏

本文聚焦 ParlAI 仓库中 [projects/beat_the_bot/README.md](https://link.gitcode.com/i/0933e0fc629f57022021a4da28e75b37) 所介绍的项目 **Beat The Bot**——一个基于 Facebook Messenger 的聊天机器人游戏,用于在真实世界中收集人机对话数据并评估模型表现。你将了解到该项

gitblog_00240的博客 1096

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 学会这些思维框架,提高综合决策能力
下一篇: StatelessWidget处理网络请求
jsPao
博客等级 码龄7年 549粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值