当前位置: 首页 > news >正文

Flutter入门,Flutter基础知识总结。

Flutter是Google推出的一种移动应用开发框架,它允许开发者使用一套代码库同时开发Android和iOS应用。以下是对Flutter知识点的详细总结:

一、Flutter概述

特点:跨平台、高保真、高性能。
编程语言:使用Dart语言编写。
设计理念:“everything is a widget”。不论是按钮、字体、颜色、布局,甚至是整个应用程序,都是由一个个Widget组合而成。

二、Flutter架构

框架层:直接面向开发者的最顶层,提供了Material和Cupertino两种视觉风格的组件库,分别实现了Material和iOS设计规范。
引擎层:主要由C++编写,负责实现Flutter的高性能渲染和底层逻辑。包括Skia图形引擎(用于高效地渲染应用中的图形和动画)和Dart运行时(提供内存管理、垃圾回收等关键服务)。
嵌入层:负责将Flutter引擎嵌入到不同的平台(如Android和iOS)中。

三、Dart语言基础

变量类型:Dart中的所有变量都是引用类型,未初始化的变量的值是null。包括Object(所有类的基类)、dynamic(运行时确定类型)等。

编译模式:

  • JIT(Just In Time)即时编译:在程序执行期间实时编译为本地机器码,开发阶段采用此模式,避免每次改动都进行编译,节省开发时间。
  • AOT(Ahead Of Time)静态编译:程序运行前编译成本地机器码,发布时采用此模式,生成高效的ARM代码以保证应用性能。
  • 垃圾回收:采用多生代无锁垃圾回收器,专门为UI框架中常见的大量Widgets对象创建和销毁进行优化。

四、Widget基础

概念:Widget是Flutter中用于描述用户界面和交互的模块。一个Widget可以定义结构元素(如按钮或菜单)和样式元素(如字体或颜色模式)。

类型:
  • StatelessWidget:无状态Widget,一旦构建后不能改变,当属性改变时会重新构建
  • StatefulWidget:可以在生命周期内改变状态的Widget,实现一个StatefulWidget至少需要两个类:一个StatefulWidget类和一个State类。
常用Widget:

Flutter 提供了丰富的内置 widgets,开发者可以利用这些 widgets 来快速构建用户界面。以下是一些常用的 Flutter widgets:

1. 布局类 Widgets
  • Container:用于包含和装饰其他 widgets,可以设置边距、填充、背景颜色、边界等。
  • Row 和 Column:用于水平(Row)或垂直(Column)排列子 widgets。
  • Stack:允许子 widgets 堆叠在一起,并可以使用 Positioned 控制子 widget 的位置。
  • Flex 和 Expanded:用于在 Row 或 Column 中分配剩余空间给子 widgets。
  • ListView:创建一个可滚动的列表,支持动态加载更多内容。
  • GridView:创建一个二维的网格布局,类似于表格。
2. 文本与输入
  • Text:显示一段文本,可以自定义字体大小、颜色、样式等。
  • TextField 和 TextFormField:用于接收用户输入的文本框,TextFormField 还提供了表单验证功能。
  • RichText:用于显示带有格式化的文本,比如不同部分有不同的样式。
3. 按钮
  • ElevatedButton:带阴影效果的按钮,通常有颜色填充。
  • TextButton:无填充颜色的按钮,通常用于次要操作。
  • OutlinedButton:具有边框但无填充颜色的按钮。
  • IconButton:用于显示图标按钮。
  • FloatingActionButton:浮动在屏幕上的圆形按钮,常用于强调主要动作。
4. 图片与图标
  • Image:用于显示图片资源,支持本地图片和网络图片。
  • Icon:显示 Material Design 图标。
5. 卡片与对话框
  • Card:提供一种将相关内容分组的方式,带有圆角和阴影效果。
  • Dialog:用于显示模态对话框,如 AlertDialogSimpleDialog
  • BottomSheet:从屏幕底部滑出的面板,适用于菜单或选项选择。
6. 表单
  • Form:用于创建表单,结合 TextFormField 实现输入验证。
  • Checkbox 和 Radio:用于多选和单选。
7. 进度指示器
  • CircularProgressIndicatorLinearProgressIndicator:用于显示加载状态,分别是环形和线性进度条。
8. 交互式 Widgets
  • GestureDetector:添加手势识别到任何 widget 上,如点击、长按、拖拽等。
  • Dismissible:实现可以被滑动移除的 widget,如删除列表项。
  • Draggable 和 DraggableTarget:用于创建可拖拽的元素和目标区域。
9. 动画
  • AnimatedOpacityAnimatedContainer 等:用于创建简单的动画效果。
  • AnimationControllerTween:用于更复杂的动画控制。
10. 导航与路由
  • Navigator:管理页面之间的导航。
  • PageRouteBuilderMaterialPageRoute:用于创建自定义和默认的页面切换动画。
11. InheritedWidget
特性:
  • 高效传递数据,支持跨级访问
  • 性能优化,只有当 InheritedWidget 的状态改变时,依赖它的子 widget 才会重新构建,而不是整个 widget 树。
  • 提供了依赖监听机制,当数据变化时,可以通知依赖该数据的子Widget进行更新。
常见使用场景:
  • 管理全局或共享数据:如用户身份认证状态、设置数据等。
  • 依赖注入:向Widget子树提供依赖项,如服务或存储库。
  • 配置数据:将配置数据(如本地化或主题样式)传播到所有相关Widget。Flutter 的 Theme 就是基于 InheritedWidget 实现的。
注意事项:
  • 不要滥用 InheritedWidget,因为它们可以使数据流变得不清晰。
  • 确保 updateShouldNotify 的实现是正确的,以避免不必要的 widget 重建。
  • 考虑使用更高级的状态管理解决方案如 Provider、Riverpod 或 Bloc,这些方案可以提供更好的可维护性和扩展性。

除以上介绍之外,Flutter 还提供了丰富的widgets,每个 widget 都有自己的特性和用途。Flutter 的文档中还提供了详细的 API 参考,帮助开发者了解如何正确地使用这些 widgets。

状态管理

  • Provider:一种简单易用的状态管理方案。
  • Riverpod:Provider 的增强版本,提供了更好的依赖注入支持。(Google推荐使用)
    类型:Riverpod提供了多种类型的Provider,如:Provider、StateProvider、StateNotifierProvider等。
    监听:在需要读取Provider状态的组件中,使用ConsumerWidgetConsumer来监听Provider的变化。
  • Bloc:业务逻辑组件模式,适合处理复杂的状态流。
  • Redux:基于 Flux 架构,适用于大型应用。

性能优化

UI渲染优化:
  • 扁平化 widget 树:减少不必要的重叠元素,确保界面简洁明了,以减少构建和布局的时间。
  • 使用 ListView.builder 和 GridView.builder:当列表项数量较多时,使用 builder 方法按需创建子 widgets,而不是一次性创建所有子 widgets。
  • 合理缓存:利用Flutter的缓存机制,避免重复创建和加载资源。例如,使用CachedNetworkImage来缓存网络图片。
  • 使用IndexedStack:当有多个子组件需要同时显示时,可以考虑使用IndexedStack,它只会绘制当前显示的子组件,而不是所有子组件,从而减少了不必要的绘制。
  • 使用Offstage来隐藏组件:如果有一些不经常显示或只在特定条件下显示的组件,可以考虑使用Offstage来将它们从渲染树中移除,以减少布局和绘制开销。
Widget 优化:
  • shouldRebuild:使用shouldRebuild方法来确定一个小部件是否需要重建,以减少不必要的重建次数。
  • 使用const:使用const关键字来创建不需要根据父组件重新构建的小部件。
  • 使用StatelessWidget:无状态小部件的构建速度比有状态小部件快,因为它们不需要维护任何可变状态。
  • 避免在build方法中执行耗时操作:如需要重新计算数据或创建新的对象,可以在initState中进行,以避免不必要的重建。
其他优化:
  • 图片优化:优化资源文件大小,使用 FadeInImage(渐显效果) 或 CachedNetworkImage(缓存)
  • 动画优化:AnimatedBuilder、TickerMode。
  • 代码拆分:使用代码拆分来减小应用的大小并提高性能。

五、Flutter程序结构

一个基本的Flutter程序通常包括以下部分:

  • main函数:应用的入口点。
  • MyApp类:StatelessWidget,返回一个包含应用主题、路由和主页的MaterialApp Widget。
  • 主页类:可为StatelessWidget或StatefulWidget,包含应用主体部分。
  • 其他Widget类:自定义的Widget,可被主页类或其他Widget类使用。

六、Flutter其他知识点

  • 屏幕适配:可以采用flutter_screen_util插件进行屏幕适配,通过传入设计尺寸,在调用时使用screen_util转换后的宽和高进行长度和高度的赋值。
  • 原生集成:Flutter提供了与原生平台深度集成的能力。开发者可以使用特定的平台通道与原生代码交互,访问设备特有的功能。
  • 热重载:Flutter引入了热重载功能,允许开发者在应用运行时动态更改代码并立即看到结果,极大地提高了开发效率。

相关文章:

Flutter入门,Flutter基础知识总结。

Flutter是Google推出的一种移动应用开发框架,它允许开发者使用一套代码库同时开发Android和iOS应用。以下是对Flutter知识点的详细总结: 一、Flutter概述 特点:跨平台、高保真、高性能。 编程语言:使用Dart语言编写。 设计理念&…...

weight decay 和L2是一个东西吗

weight decay和L2正则化本质上是相同的概念。 weight decay(权重衰减)和L2正则化在深度学习中都是用来防止模型过拟合的常用技术。它们通过对损失函数添加一个正则项来限制模型参数的大小,从而控制模型的复杂度。具体来说,L2正则…...

JavaScript系列(8)-- Array高级操作

JavaScript Array高级操作 📚 在前七篇文章中,我们探讨了JavaScript的语言特性、ECMAScript标准、引擎工作原理、数值类型、字符串处理、Symbol类型和Object高级特性。今天,让我们深入了解JavaScript中的Array高级操作。数组是最常用的数据结…...

Harmony开发【笔记1】报错解决(字段名写错了。。)

在利用axios从网络接收请求时,发现返回obj的code为“-1”,非常不解,利用console.log测试,更加不解,可知抛出错误是 “ E 其他错误: userName required”。但是我在测试时,它并没有体现为空,…...

MAC环境安装(卸载)软件

MAC环境安装(卸载)软件 jdknode安装node,并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净,可以再细分删除验证删除结果 在macOS下创建home目录 jdk 1.下载jdk 先…...

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)

文章目录 Section 4:The Vim Help System(Vim 帮助系统)S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…...

Multisim更新:振幅调制器+解调器(含仿真程序+文档+原理图+PCB)

前言 继3年前设计的:Multisim:振幅调制器的设计(含仿真程序文档原理图PCB),有读者表示已经不能满足新需求,需要加上新的解调器功能😂😂😂,鸽了很久这里便安排…...

CentOS — 群组管理

文章目录 一、查看群组二、添加群组三、删除群组四、修改群组 Linux 系统中每个用户都属于一个特定的群组。 若不设置用户的群组,默认会创建一个和用户名一样的群组,并将用户分到该群组。 一、查看群组 groups 用户名:查看用户所属群组。 二…...

【pytorch】注意力机制-1

1 注意力提示 1.1 自主性的与非自主性的注意力提示 非自主性提示: 可以简单地使用参数化的全连接层,甚至是非参数化的最大汇聚层或平均汇聚层。 自主性提示 注意力机制与全连接层或汇聚层区别开来。在注意力机制的背景下,自主性提示被称为查…...

html 元素中的data-v-xxxxxx 是什么?为什么有的元素有?有的没有?

data-v-xxxxxx 在 HTML 中,data-v 属性通常与 Vue.js 或其他前端框架一起使用,特别是当这些框架结合 CSS 预处理器(如 Sass、Less)和单文件组件(Single File Components, SFCs)时。data-v 属性的主要目的是…...

第27周:文献阅读及机器学习

目录 摘要 Abstract 一、文献阅读 发现问题 研究方法 CNN-LSTM DT SVR 创新点 案例分析 数据准备 模型性能 预测模型的实现 仿真实验及分析 二、LSTM 1、基本结构 2、具体步骤 3、举例说明 4、原理理解 总结 摘要 本周阅读文献《Short-term water qua…...

回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测

回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测 目录 回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、极限学习机(ELM) 极限学习机是一种单层前馈神经网络,具有训练速…...

Swift Protocols(协议)、Extensions(扩展)、Error Handling(错误处理)、Generics(泛型)

最近在学习 Swift,总结相关知识 1. Protocols(协议) 1.1 协议的定义和实现 协议(protocol) 是一种定义方法和属性的蓝图,任何类、结构体或枚举都可以遵循协议。遵循协议后,需要实现协议中定义…...

.NET中的强名称和签名机制

.NET中的强名称(Strong Name)和签名机制是.NET Framework引入的一种安全性和版本控制机制。以下是关于.NET中强名称和签名机制的详细解释: 强名称 定义: 强名称是由程序集的标识加上公钥和数字签名组成的。程序集的标识包括简单文…...

使用 NestJS 构建高效且模块化的 Node.js 应用程序,从安装到第一个 API 端点:一步一步指南

一、安装 NestJS 要开始构建一个基于 NestJS 的应用,首先需要安装一系列依赖包。以下是必要的安装命令: npm i --save nestjs/core nestjs/common rxjs reflect-metadata nestjs/platform-express npm install -g ts-node包名介绍nestjs/coreNestJS 框…...

2025年大模型技术发展趋势展望:高速旋转的飞轮

2025年大模型技术发展趋势展望 引言1. 多模态大模型(MMM):从单一模态到高级模态融合2. 轻量化大模型:从大参数模型到小参数模型3. 强推理大模型:从概率生成到逻辑推理4. 移动端/边缘端Agent:从云端到本地5.…...

java中类的加载过程及各个阶段与运行时数据区中堆和方法区存储内容

java中类的加载过程 Java 类的加载是 JVM 将 字节码文件(.class 文件)加载到内存并最终转化为运行时数据的过程。它分为以下 五个主要阶段:加载、验证、准备、解析、初始化,每个阶段都有对应的内存位置存储相关信息。以下是类加载…...

渗透测试--Web基础漏洞利用技巧

渗透测试--Web基础漏洞利用技巧 本文章写了Web基础漏洞中一些不那么常见的利用技巧,而不谈及漏洞的原理以及常见用法。 SQL 俺是SQLmap党,哈哈,所以这块就不多讲了。详情可见文章《渗透测试--SQLmap_渗透测试sqlmap-CSDN博客》 XXE XXE组成…...

SpringBoot下载文件的几种方式

小文件:直接将文件一次性读取到内存中,文件大可能会导致OOM GetMapping("/download1")public void download1(HttpServletResponse response) throws IOException {// 指定要下载的文件File file new File("C:\\Users\\syd\\Desktop\\do…...

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站:https://www.jetbrains.com/pycharm/。下载社区版(免费)或专业版(收费,提供更多功能)。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm,并根…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...