目录

  • 1. 什么是Widget?Flutter中的Widget分为哪几类?
  • 2. StatelessWidget和StatefulWidget的区别
  • 3. StatefulWidget生命周期
  • 4. 什么是BuildContext?
  • 5. 如何优化Widget重建?
  • 6. Flutter布局机制
  • 7. Row/Column的主轴和交叉轴
  • 8. Expanded vs Flexible
  • 9. Key的作用与使用场景
  • 10. 国际化(i18n)实现

1. 什么是Widget?Flutter中的Widget分为哪几类?

Widget:Flutter应用的基础构建单元,描述UI元素的配置(如布局、样式等)。

  • 不可变性:Widget不可变,重建时生成新实例
  • 声明式UI:通过嵌套Widget树描述界面

主要分类

类别特点示例
StatelessWidget无状态,属性不可变Text
, Icon
, Container
StatefulWidget有状态,可动态更新Checkbox
, TextField
, Slider
InheritedWidget数据共享,跨层级传递Theme
, MediaQuery
ProxyWidget父Widget代理ParentDataWidget
RenderObjectWidget底层渲染控制Opacity
, Transform
// Widget树示例
Container( // 布局Widgetpadding: EdgeInsets.all(10),child: Column( // 布局Widgetchildren: [Text('Hello', style: TextStyle(fontSize: 20)), // 无状态WidgetStatefulCounter() // 有状态Widget],),
)

2. StatelessWidget和StatefulWidget的区别

特性StatelessWidgetStatefulWidget
状态管理❌ 无内部状态✅ 可维护可变状态
重建机制完全重建通过State
对象保留状态
生命周期简单(仅build)复杂(initState/didUpdateWidget等)
性能更高较低(需维护State)
使用场景静态内容交互式组件(表单/动画)

典型场景

  • Stateless:显示静态文本/图标
  • Stateful:计数器、开关按钮

3. StatefulWidget生命周期

createState
initState
didChangeDependencies
build
didUpdateWidget?
deactivate
dispose

关键方法

  1. initState:初始化状态(调用一次)
  2. didChangeDependencies:依赖变化时调用(如InheritedWidget更新)
  3. build:构建UI(必实现)
  4. didUpdateWidget:父Widget重建时触发
  5. setState:通知框架状态变化(触发rebuild)
  6. deactivate:从树中移除(可能重新插入)
  7. dispose:永久销毁,释放资源

⚠️ 注意:避免在build()中做耗时操作!


4. 什么是BuildContext?

BuildContext是Widget在树中位置的引用,核心作用:

查找祖先Widget

ThemeData theme = Theme.of(context); // 获取最近的Theme

导航操作

Navigator.push(context, MaterialPageRoute(...));

Widget状态管理

ScaffoldState scaffold = Scaffold.of(context);
scaffold.openDrawer(); // 打开抽屉

重要原则

  • 每个Widget有独立BuildContext
  • Context在Element创建时生成
  • 不可缓存Context(可能失效)

5. 如何优化Widget重建?

优化方案实现方式效果
const构造函数const Text('Hello')避免重复创建相同实例
拆分Widget树将易变部分拆为子Widget减少重建范围
使用StatelessWidget优先用于静态内容降低状态管理开销
Keys的正确使用为列表项/状态Widget设置Key精确控制更新
shouldRebuild@override bool updateShouldNotify控制InheritedWidget更新范围

代码示例

// 优化前:整个Card重建
Widget build() {return Card(child: HeavyContent(), // 重组件);
}// 优化后:仅变化部分重建
Widget build() {return const Card(  // const避免重建child: _HeavyContent(), // 拆分为独立Widget);
}

6. Flutter布局机制

布局流程(自顶向下):

  1. 父Widget传递约束(constraints: min/max宽高)
  2. 子Widget确定自身尺寸
  3. 父Widget定位子Widget(根据alignment/offset)

核心原则

  • 约束驱动:父给子约束,子不能超出约束
  • 递归布局:深度优先遍历Widget树
  • 单次布局:每帧最多布局一次
// 布局示例
ConstrainedBox(constraints: BoxConstraints(minWidth: 100, maxHeight: 200), // 父约束child: Container(width: 150,  // 子确定尺寸(在约束范围内)height: 180,),
)

7. Row/Column的主轴和交叉轴

布局组件主轴方向交叉轴方向
Row水平(X轴)垂直(Y轴)
Column垂直(Y轴)水平(X轴)

主轴对齐mainAxisAlignment):

  • start/end/center/spaceBetween

交叉轴对齐crossAxisAlignment):

  • stretch/baseline/start
Row(mainAxisAlignment: MainAxisAlignment.spaceAround, // 主轴均匀分布crossAxisAlignment: CrossAxisAlignment.center, // 交叉轴居中children: [ ... ],
)

8. Expanded vs Flexible

特性ExpandedFlexible
继承关系Flexible的子类基础类
flex默认值flex=1flex=1(可自定义)
空间占用强制填满剩余空间按需占用空间
fit行为固定FlexFit.tight可配置FlexFit.loose

使用场景

Row(children: [Container(width: 50), // 固定宽度Expanded( // 占满剩余宽度child: Text('Expanded Content'),),Flexible( // 按内容宽度占用fit: FlexFit.loose,child: Text('Flexible'),)],
)

9. Key的作用与使用场景

Key的作用
唯一标识Widget,帮助框架在重建时区分相同类型的Widget

使用场景

Key类型适用场景
ValueKey列表项(值唯一时)
ObjectKey复杂对象的列表
UniqueKey强制重建(如动画重置)
GlobalKey跨组件访问状态

示例

ListView.builder(itemBuilder: (ctx, index) {return ListTile(key: ValueKey(items[index].id), // 基于id标识title: Text(items[index].name),);}
)

何时需要Key

  • 动态列表(增删改操作)
  • 保留状态(如表单输入框)
  • 需要跨组件访问状态

10. 国际化(i18n)实现

实现步骤

  1. 添加依赖
dependencies:flutter_localizations:sdk: flutterintl: ^0.17.0
  1. 创建ARB文件**lib/l10n/app_en.arb**
{"hello": "Hello!","@hello": {"description": "欢迎语"}
}
  1. 生成本地化类
flutter gen-l10n
  1. 配置MaterialApp
MaterialApp(localizationsDelegates: AppLocalizations.localizationsDelegates,supportedLocales: AppLocalizations.supportedLocales,
)
  1. 使用翻译
Text(AppLocalizations.of(context)!.hello)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88023.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88023.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88023.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式笔记_创建型_建造者模式

1. 建造者模式介绍 建造者模式是一种创建型设计模式,旨在通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它通常用于构造步骤固定但具体实现可能变化的对象。 1.1 功能: 封装复杂对象的创建过程:适…

【ROS2 自动驾驶学习】03-ROS2常用命令

目录 1. ros2 pkg list 2. ros2 node list 3. ros2 node info 节点名称 4. ros2 topic list 5. ros2 topic info 话题名 6. ros2 topic type 话题名 7. ros2 topic find 消息类型 8. ros2 service list 9. ros2 service type 服务名称 10. ros2 service find 服…

MyBatis-Plus:提升数据库操作效率的利器

在Java开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作,提供了灵活的SQL映射功能。然而,随着项目规模的扩大和业务复杂度的增加,开发者需要更高效、更便捷的方式来处理数据库操作。MyBatis-Plus应运而生…

App爬虫实战篇-以华为真机手机爬取集换社的app为例

前言 在开始学习这篇文章之前,建议你先按照之前2篇文章(App爬虫工具篇-Appium安装和App爬虫工具篇-appium配置),配置必要的环境,才可以继续完成本章节内容。 电脑连接手机 可以通过usb连接电脑。如果通过adb devices命令,发现没有连接上,就需要手动配置一些信息 华为…

Vue3组合式API应用:状态共享与逻辑复用最佳实践

Vue3组合式API应用:状态共享与逻辑复用最佳实践 在Vue3中,组合式API的引入为我们提供了一种全新的方式来编写Vue组件,并有效地解决了混入和繁琐逻辑复用的问题。本文将为您介绍如何在Vue3中使用组合式API来实现状态共享与逻辑复用的最佳实践&…

在linux 上使用tcpdump监听http 端口的报文并分析

这里写目录标题 1. 使用 tcpdump(原始报文捕获)观察:报文翻译与分析(按行解释)第一段:客户端请求报文HTTP 请求头JSON 请求体第二段:服务器响应报文HTTP 响应头响应体关键问题分析在 Linux 上监听 HTTP 端口的报文,有多种工具可以实现。以下是几种常用方法的详细说明:…

XSStrike 进行 XSS 漏洞测试

XSStrike 是一个功能强大的 XSS 漏洞测试工具,专为检测、验证和利用反射型、存储型、DOM型 XSS 漏洞而设计,适合配合手工测试,也可用于自动化发现。 🛠️ 1. 安装 XSStrike 确保系统中有 Python3 和 git: git clone ht…

any实现(基于LLVM中libcxx实现分析)

本文根据LLVM中libcxx的实现,分析了std::any和std::variant的具体实现。 1 简介 在 C17 标准中,std::any提供了一种类型安全的方式来存储任意类型的值。它使用类型擦除(type erasure)技术实现,使得一个对象可以包含任…

网安系列【13】之渗透测试:前期信息收集

文章目录 前期信息收集信息收集的分类信息收集的内容域名信息收集Whois备案信息whois反查SSL证书查询域名收集工具IP收集CDN信息收集CDN判断CDN绕过 端口信息收集常见端口介绍FTP-21SSH-22WWW-80NetBlOSSessionService-139/445MySQL-3306RDP-3389Redis-6379Tomcat-8080 端口扫描…

自动驾驶传感器的标定与数据融合

目录 IMU的标定 相机的标定 激光雷达和组合惯导标定 相机和激光雷达标定 传感器数据融合 多传感器融合数据处理 传感器数据融合算法 环境感知与预测 应用实例——车道线识别 应用实例——车辆行人识别 应用实例——交通标志识别 定位系统 基于惯性导航仪的定位技术…

27.移除元素(快慢指针)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改…

Spring AI:ETL Pipeline

提取、转换和加载(ETL)框架是检索增强生成(RAG)用例中数据处理的支柱。ETL管道协调从原始数据源到结构化向量存储的流程,确保数据以最佳格式供AI模型检索。RAG用例是文本,通过从数据体中检索相关信息来增强…

26.安卓逆向2-frida hook技术-解密响应

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 工具下载: 链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

人工智能与人工智障———仙盟创梦IDE

<!-- 桌面导航 -->&#x3C;nav class&#x22;hidden md:flex items-center space-x-8&#x22;&#x3E;&#x3C;a href&#x22;#home&#x22; class&#x22;nav-link text-gray-700 hover:text-primary font-medium&#x22;&#x3E;&#x9996;&…

车载通信架构 --- 以太网相关网络安全

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

行业实践案例:金融行业数据治理体系全景解析

“金融行业是数据治理的试金石。” ——高密度数据、高合规要求、高业务依赖,决定了金融治理的复杂度和先进性。 📘 本文目录 为什么金融行业对数据治理要求高? 金融行业数据治理的独特挑战 金融行业治理框架搭建实践 典型治理能力案例详解 工具与平台选型经验 总结与启示 …

C#读取modbus值,C#读写modbus,支持读写uint32值,Modbus TCP工具类

C#读取modbus值&#xff0c;C#读写modbus&#xff0c;支持读写uint32值&#xff1b;Modbus TCP工具类 需要首先安装nuget包Modbus using Modbus.Device; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Text; us…

Oracle注释详解

在Oracle SQL中&#xff0c;注释是用于解释代码逻辑、提高可读性的文本&#xff0c;不会被数据库执行。Oracle支持两种类型的注释语法&#xff1a; 1. 单行注释&#xff08;--&#xff09; 使用双连字符--在一行中添加注释&#xff0c;从--开始到行末的所有内容都会被视为注释。…

关于 scrapy框架 详解

scrapy 是一个纯 Python 编写的异步爬虫框架&#xff0c;具备以下特点&#xff1a;优势说明异步高效基于 Twisted&#xff0c;非阻塞 IO模块化各部分可灵活配置/替换中间件机制支持代理、UA、cookie 控制等强大的解析内置 XPath、CSS 提取器自动去重Scheduler 内部维护请求 fin…

DHCP中继实验及其核心原理

DHCP 中继&#xff08;DHCP Relay&#xff09;是一种允许跨网段分配 IP 地址的技术&#xff0c;无需在每个子网部署 DHCP 服务器。以下是其原理和配置方法的详细说明&#xff1a;一、核心原理1. 为什么需要 DHCP 中继&#xff1f;问题&#xff1a;DHCP 客户端通过广播&#xff…