Flutter - UIKit开发相关指南 - 概览
环境
Flutter 3.29
macOS Sequoia 15.4.1
Xcode 16.3
概览
UIView与Widgets的比较
在UIKit使用UIView类的对象进行页面开发,布局也是UIView类的对象,在Flutter中使用的是Widget,在概念上Widget可以理解成UIView。
差异:
- 有效期: Widgets是不可变的,它的生存期只到被改变前。当Widgets或它们的状态改变了。Flutter’s 框架会创建一个widget的实例,而UIKit中的UIView是不会重新创建,它是可变的,绘制一次并且在使用setNeedDisplay()使其失效之前不会重新绘制
- 轻量: Widgets相对更轻量,一个原因是它们是不可变,而且它们不负责显示和绘制,更多的是一种语义的描述。
Flutter 包含 Matterial 组件库,其中的Widgets都符合了Material设计指引。Material设计是个适配多平台的设计系统,也支持iOS
但如果想用iOS的UI风格,可以使用Cupertino widgets libray
更新Widgets
使用UIKit开发时可以直接改变对应的视图。就像上面提到的,因为Flutter的Widgets是不可变的,可以通过更新Widget的状态来更新Widget。
这就是有状态 widget 与无状态 widget 的概念。StatelessWidget是没有附加状态的 widget。
当需要实现HTTP请求获取数据后根据数据动态改变的UI,可以使用StatefulWidget。
无状态和有状态 widget 之间的重要区别在于,StatefulWidgets 有一个 State 对象,用于存储状态数据并在树重建中传递数据,因此它不会丢失。
Text Widget是常见的无状态的Widget
class Text extends StatelessWidget {const Text(String this.data, {...
Text('I like Flutter!',style: TextStyle(fontWeight: FontWeight.bold),
);
初始化时并没有传递状态,要实现动态的修改Text Widget的内容,可以通过包装到一个StatefulWidget中
import 'package:flutter/material.dart';void main() {// 1. 创建MainApp WidgetrunApp(MainApp());
}class MainApp extends StatelessWidget {const MainApp({super.key}); Widget build(BuildContext context) {// 2.调用return MaterialApp(title: 'Sample App', home: CustomStatefulPage());}
}class _CustomStatefulePageState extends State<CustomStatefulPage> {String text = 'I Like Flutter';// 5.点击按钮触发_updateTextvoid _updateText() {// 6.通知Flutter更新setState(() {text = "Flutter is Awesome!";});}// 7.调用build方法,刷新页面// 4.调用build方法,按钮点击方法绑定_updateText方法Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Sample App')),body: Center(child: Text(text)),floatingActionButton: FloatingActionButton(onPressed: _updateText,tooltip: 'Update Text',child: const Icon(Icons.update),),);}
}class CustomStatefulPage extends StatefulWidget {const CustomStatefulPage({super.key});// 3.创建_CustomStatefulePageState对象State<StatefulWidget> createState() => _CustomStatefulePageState();
}
Widget 布局
在UIKit中可以使用Storyboard和用代码去更新View的约束。在Flutter中,通过组合Widget树来展示布局。
build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Sample App')),body: Center(child: CupertinoButton(onPressed: () {},// 指定内边距padding: const EdgeInsets.only(left: 10, right: 10),child: const Text('Hello'),),),);
}
Widget
移除Widget
在UIKit中使用addSubview()
或removeFromSuperview()
来动态的添加或移除视图。在Flutter中Widget是不可变,没有那种类似addSubview()
的方法。可以在父Widget传一个函数,然后控制显示的效果
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';void main() {// 1. 创建MainApp WidgetrunApp(MainApp());
}class MainApp extends StatelessWidget {// This widget is the root of your application.const MainApp({super.key}); Widget build(BuildContext context) {// 2. 创建SampleAppPagereturn const MaterialApp(title: 'Sample App', home: SampleAppPage());}
}class SampleAppPage extends StatefulWidget {const SampleAppPage({super.key});// 3. 调用_SampleAppPageState方法创建State<SampleAppPage>State<SampleAppPage> createState() => _SampleAppPageState();
}class _SampleAppPageState extends State<SampleAppPage> {// Default value for toggle.bool toggle = true;// 5.点击按钮触发void _toggle() {// 6.通知Flutter更新togglesetState(() {toggle = !toggle;});}Widget _getToggleChild() {// 8.根据toggle的值显示不同页面效果if (toggle) {return const Text('Toggle One');}return CupertinoButton(onPressed: () {}, child: const Text('Toggle Two'));}// 4. 触发build方法,FloatingActionButton点击绑定_toggle// 7. 重新执行_getToggleChildWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Sample App')),body: Center(child: _getToggleChild()),floatingActionButton: FloatingActionButton(onPressed: _toggle,tooltip: 'Update Text',child: const Icon(Icons.update),),);}
}
动画
在UIKit中,通过UIView的animate(withDuration:animations:)
执行动画。在Flutter中,使用动画库将Widget包装在动画Widget内。
Flutter中使用AnimationController
来控制动画的暂停,进度,停止。在屏幕刷新的每一帧,就会生成一个新的值。默认情况下,AnimationController在给定的时间段内会线性的生成从0.0到1.0的数字。
import 'package:flutter/material.dart';void main() {// 1. 创建MainApp WidgetrunApp(MainApp());
}class MainApp extends StatelessWidget {const MainApp({super.key}); Widget build(BuildContext context) {return const MaterialApp(title: 'Fade Demo',// 2. 创建MyFadeTesthome: MyFadeTest(title: 'Fade Demo'),);}
}class MyFadeTest extends StatefulWidget {const MyFadeTest({super.key, required this.title});final String title;// The framework can call this method multiple times over the lifetime of a [StatefulWidget].// For example, if the widget is inserted into the tree in multiple locations,// the framework will create a separate [State] object for each location.// 添加到tree中的每个MyFadeTest Widget都会创建对应的State<MyFadeTest>对象// 3.创建_MyFadeTestState<MyFadeTest> createState() => _MyFadeTest();
}class _MyFadeTest extends State<MyFadeTest>// 单个 AnimationController 的时候使用 SingleTickerProviderStateMixinwith SingleTickerProviderStateMixin {late AnimationController controller;late CurvedAnimation curve;// Called when this object is inserted into the tree.// 添加到tree中时调用// 4. 调用initState,指定AnimationControllervoid initState() {super.initState();controller = AnimationController(duration: const Duration(milliseconds: 2000),// TickerProvider(抽象类),用于接收动画变化过程中的通知,类似于接口回调vsync: this,);// 指定生成0.0到1.0的规则curve = CurvedAnimation(parent: controller, curve: Curves.easeIn);}// Called when this object is removed from the tree permanently.void dispose() {// 8.当对象对tree中移除时,回收AnimationController的资源controller.dispose();super.dispose();} Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title)),body: Center(child: FadeTransition(// 5. 应用透明效果,opacity的变化规则指定为上面创建的curveopacity: curve,// 6. 动画包装的Widgetchild: const FlutterLogo(size: 100),),),floatingActionButton: FloatingActionButton(onPressed: () {// Starts running this animation forwards (towards the end).// 7. 正向播放动画controller.forward();},tooltip: 'Fade',child: const Icon(Icons.brush),),);}
}
绘图
在UIKit中使用CoreGraphics
在手机屏幕上绘制线条和凸显。Flutter使用Canvas
,CustomPaint
,CustomPainter
来实现绘制操作。
import 'package:flutter/material.dart';void main() => runApp(const MaterialApp(home: DemoApp()));class DemoApp extends StatelessWidget {const DemoApp({super.key}); Widget build(BuildContext context) => const Scaffold(body: Signature());
}class Signature extends StatefulWidget {const Signature({super.key}); State<Signature> createState() => SignatureState();
}class SignatureState extends State<Signature> {List<Offset?> _points = <Offset?>[]; Widget build(BuildContext context) {return GestureDetector(// 绘制时移动的回调onPanUpdate: (details) {setState(() {// 当前Widget关联的RenderObjectRenderBox? referenceBox = context.findRenderObject() as RenderBox;// 坐标转换: 全局坐标转换为局部坐标// globalPosition表示当前手势触点在全局坐标系位置与对应组件顶点坐标的偏移量// localPosition则就表示当前手势触点在对应组件坐标系位置与对应组件顶点坐标的偏移量Offset localPosition = referenceBox.globalToLocal(details.globalPosition,);_points = List.from(_points)..add(localPosition);});},// 绘制结束时调用onPanEnd: (details) => _points.add(null),child: CustomPaint(// 具体的绘制操作调用Canvaspainter: SignaturePainter(_points),// 不限制长度size: Size.infinite,),);}
}class SignaturePainter extends CustomPainter {SignaturePainter(this.points);final List<Offset?> points;void paint(Canvas canvas, Size size) {final Paint paint =//「..」意思是 「级联 操作符」,为了方便配置而使用。//「..」和「.」不同的是 调用「..」后返回的相当于是 thisPaint()..color = const Color.fromARGB(255, 29, 25, 25)..strokeCap = StrokeCap.round..strokeWidth = 5;for (int i = 0; i < points.length - 1; i++) {// 起点与终点都不为null,说明是一个线段,然后执行绘制if (points[i] != null && points[i + 1] != null) {canvas.drawLine(points[i]!, points[i + 1]!, paint);}}} bool shouldRepaint(SignaturePainter oldDelegate) =>oldDelegate.points != points;
}
透明度
UIKit中使用.opactiy
或者.alpha
实现。Flutter中使用Opacity
组件来实现
import 'package:flutter/material.dart';void main() {runApp(MainApp());
}class MainApp extends StatelessWidget {const MainApp({super.key}); Widget build(BuildContext context) {return MaterialApp(title: 'Flutter layout demo',home: CustomStatefulPage(),);}
}class CustomStatefulPage extends StatefulWidget {const CustomStatefulPage({super.key}); State<StatefulWidget> createState() => _CustomStatefulePageState();
}class _CustomStatefulePageState extends State<CustomStatefulPage> {double opacity = 0.3;String text = "透明度"; Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(text)),body: Center(child: Opacity(opacity: opacity, child: Text("透明度:$opacity")),),floatingActionButton: FloatingActionButton(onPressed: () {setState(() {opacity = 1.0;});},tooltip: 'Update Text',child: const Icon(Icons.update),),);}
}
自定义 Widgets
在UIKit中通过继承UIView来自定义组件,而在Flutter中定义自定义组件通常使用组合的方式
import "package:flutter/material.dart";void main() {runApp(MaterialApp(home: CustomWidget()));
}class CustomWidget extends StatelessWidget {const CustomWidget({super.key}); Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Custom Widget")),body: Center(child: CustomButton("自定义按钮")),);}
}/// 自定义按钮
class CustomButton extends StatelessWidget {const CustomButton(this.label, {super.key});final String label; Widget build(BuildContext context) {return ElevatedButton(onPressed: () {}, child: Text(label));}
}
管理依赖
iOS中使用CocoaPods管理时,可以通过配置Podfile文件。Flutter 是用pubspec.yaml 来管理依赖的库。iOS端需要的库写在Podfile里
/// 包名 此属性表示包名(package name),此属性是非常重要的,引入其他文件时需要使用此包名:
/// import 'package:uikit/home_page.dart';
name: uikit
/// description 属性是一个可选配置属性,是对当前项目的介绍
description: "A new Flutter project."
publish_to: 'none'
// 此属性应用程序的版本和内部版本号,格式为 x.x.x+x,例如:1.0.0+1,这个版本号称为 语义版本号(semantic versioning )
// 版本号 + 前面到部分,叫做 version number,由 2 个小点隔开,后面的部分叫做 build number。
// 在 Android 中 version number 对应 versionName,build number 对应 versionCode,在 android/build.gradle 下有相关配置,
version: 0.1.0/// Environment 属性下添加 Flutter 和 Dart 版本控制。
environment:sdk: ^3.7.2/// dependencies 和 dev_dependencies 下包含应用程序所依赖的包,dependencies 和 dev_dependencies 就像其名字一样,dependencies 下的所有依赖会编译到项目中,而 dev_dependencies 仅仅是运行期间的包,比如自动生成代码的库/// 可以通过四种方式依赖包
dependencies:/// 1. 依赖pub.devflutter:sdk: flutter/// 2. 依赖本地库flutter_local_pacakge:path: /path/to/flutter_local_package/// 3. 依赖git repository/// url:github 地址/// ref:表示git引用,可以是 commit hash, tag 或者 branch/// path:如果 git 仓库中有多个软件包,则可以使用此属性指定软件包bloc:git:url:https://wwww.xxx.gitref: bloc_fixes_issue_100path: package/bloc/// 4. 依赖私有仓dependencies:bloc: hosted:name: blocurl: http://your-package-server.comversion: ^6.0.0dev_dependencies:flutter_test:sdk: flutterflutter_lints: ^5.0.0/// Flutter 下面的配置都是 Flutter 的相关配置。
flutter:/// 应用程序中包含Material Icons字体uses-material-design: true/// 是对当前资源的配置,比如图片,字体等本地图片assets:- images/a_dot_burr.jpeg- images/a_dot_ham.jpegflutter:/// 插件plugin:platforms:android:package: com.flutter.app_marketpluginClass: AppMarketPluginios:pluginClass: AppMarketPlugin
参考
- 给 UIKit 开发者的 Flutter 指南
- 【Flutter 实战】pubspec.yaml 配置文件详解
- No Directionality widget found错误背后的原理
- Flutter - Dart中(.)、(…)、(…)语法使用
相关文章:
Flutter - UIKit开发相关指南 - 概览
环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 概览 UIView与Widgets的比较 在UIKit使用UIView类的对象进行页面开发,布局也是UIView类的对象,在Flutter中使用的是Widget,在概念上Widget可以理解成UIView。 差异: 有效期: Widgets是不可变的,它的生存期只…...
扩容 QCOW2 磁盘镜像文件
🌈 个人主页:Zfox_ 目录 ✅ 一、扩展 QCOW2 文件大小✅ 二、启动虚拟机后扩展分区和文件系统方式一:如果使用的是标准分区(如 /dev/vda1)方式二:使用 gparted(图形工具) ✅ 总结 &am…...
【ts】for in对象时,ts如何正确获取对应的属性值
第一种:for…in keyof:适合需要遍历对象属性键并动态访问值的场景。 keyof typeof obj是ts的类型操作符,用于获取对象obj的所有属性键的联合类型(“name” | “age” | “city”)通过obj[key keyof typeof obj]&…...
软考 系统架构设计师系列知识点之杂项集萃(55)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(54) 第89题 某软件公司欲开发一个Windows平台上的公告板系统。在明确用户需求后,该公司的架构师决定采用Command模式实现该系统的界面显示部分,并设计UML类图如…...
绑定 SSH key(macos)
在 macOS 上绑定 Gitee 或 GitHub 的 SSH Key,通常分为以下几步操作,包括生成 SSH key、添加到 ssh-agent,并配置到 Gitee 或 GitHub 平台。 1. 检查是否已有 SSH Key ls -al ~/.ssh 看看是否已有 id_rsa 或 id_ed25519 等文件。如果没有就…...
PyTorch API 6 - 编译、fft、fx、函数转换、调试、符号追踪
文章目录 torch.compiler延伸阅读 torch.fft快速傅里叶变换辅助函数 torch.func什么是可组合的函数变换?为什么需要可组合的函数变换?延伸阅读 torch.futurestorch.fx概述编写转换函数图结构快速入门图操作直接操作计算图使用 replace_pattern() 进行子图…...
Unreal 从入门到精通之VR常用操作
文章目录 前言1.如何设置VRPawn视角的位置。2.如何播放视频3.如何播放VR全景视频。4.如何打开和关闭VR模式。前言 我们使用Unreal5 开发VR 项目的时候,会遇到很多常见问题。 比如: 1.如何设置VRPawn视角的位置。 2.如何播放视频。 3.如何播放VR全景视频。 4.如何打开和关闭V…...
Dify使用总结
最近完成了一个Dify的项目简单进行总结下搭建服务按照官方文档操作就行就不写了。 进入首页之后由以下组成: 探索、工作室、知识库、工具 探索: 可以展示自己创建的所有应用,一个应用就是一个APP,可以进行测试使用 工作室包含…...
事务连接池
一、事务概述 (一)事务的定义 事务是数据库提供的一种特性,用于确保数据操作的完整性和一致性。事务将多个数据操作组合成一个逻辑单元,这些操作要么全部成功,要么全部失败。 (二)事务的特性…...
如何用AWS Lambda构建无服务器解决方案:实战经验与场景解析
一、为什么开发者都在关注Serverless? 一、为什么开发者都在关注Serverless? 在云计算高速发展的今天,“无服务器架构”正成为技术新宠。根据Gartner预测,到2025年全球将有50%企业采用Serverless技术。而作为无服务器领域的领头…...
Android Compose 框架物理动画之捕捉动画深入剖析(29)
Android Compose 框架物理动画之捕捉动画深入剖析 一、引言 在 Android 应用开发中,动画是提升用户体验的关键元素之一。它能够让界面更加生动、交互更加自然。Android Compose 作为新一代的声明式 UI 框架,为开发者提供了强大且灵活的动画能力。其中&…...
Jmeter中的Json提取器如何使用?
在JMeter中使用JSON提取器可以方便地从JSON格式的响应数据中提取特定字段的值。以下是详细步骤和示例: 1. 添加JSON提取器 右击目标HTTP请求 -> 选择 添加 -> 后置处理器 -> JSON提取器。 2. 配置JSON提取器参数 变量名称(Names of created…...
STM32中断
STM32 GPIO外部中断简图 中断向量表 定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址 中断向量表定义在启动文件,当发生中断,CPU会自动执行对应的中断服务函数 中断向量表以及中断函数 NVIC嵌套向量中断控制…...
navicat 如何导出数据库表 的这些信息 字段名 类型 描述
navicat 如何导出数据库表 的这些信息 字段名 类型 描述 数据库名字 springbootmt74k 表名字 address SELECT COLUMN_NAME AS 字段名,COLUMN_TYPE AS 类型,COLUMN_COMMENT AS 描述 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA springbootmt74k AND TABLE_NAME a…...
LangGraph(三)——添加记忆
目录 1. 创建MemorySaver检查指针2. 构建并编译Graph3. 与聊天机器人互动4. 问一个后续问题5. 检查State参考 1. 创建MemorySaver检查指针 创建MemorySaver检查指针: from langgraph.checkpoint.memory import MemorySavermemory MemorySaver()这是位于内存中的检…...
数仓-可累计,半累加,不可累加指标,是什么,举例说明及解决方案
目录 1. 可累计指标定义:举例:解决方案: 2. 半累加指标定义:举例:解决方案: 3. 不可累加指标定义:举例:解决方案: 4. 总结对比5. 实际场景中的注意事项 这是数据仓库设计…...
Java ClassLoader双亲委派机制
Java ClassLoader双亲委派机制 1 什么是双亲委派模型 “类加载体系”及ClassLoader双亲委派机制。java程序中的 .java文件编译完会生成 .class文件,而 .class文件就是通过被称为类加载器的ClassLoader加载的,而ClassLoder在加载过程中会使用“双亲委派…...
upload-labs靶场通关详解:第四关
一、分析源代码 可以看出这一关仍然是黑名单验证,但是它禁止了更多的后缀。像php3,php4这类后缀也被加入了黑名单,第三关的方法在这里显然就失效了。那么我们想一想,既然配置文件中存在将php3当作php来执行的功能,那么…...
Webug4.0通关笔记25- 第30关SSRF
目录 一、SSRF简介 1.SSRF原理 2.渗透方法 二、第30关SSRF渗透实战 1.打开靶场 2.渗透实战 (1)Windows靶场修复 (2)Docker靶场修复 (3)获取敏感文件信息 (4)内网端口与服务…...
【 Redis | 实战篇 缓存 】
目录 前言: 1.认识缓存 2.添加Redis缓存 2.1.根据id查询商铺缓存 2.2.优化根据id查询商铺缓存 3.缓存更新策略 3.1.三种策略 3.2.策略选择 3.3.主动更新的方案 3.4. Cache Aside的模式选择 3.5.最佳实践方案 4.缓存三大问题 4.1.缓存穿透 4.1.1.介绍 …...
数字果园管理系统的设计与实现(Tensorflow的害虫识别结合高德API的害虫定位与Websocket的在线聊天室)
文章目录 技术栈主要功能害虫识别与定位害虫识别的实现训练与测试评估代码模型转化为TFLite预测脚本PredictController预测控制器害虫识别过程展示 害虫定位实现害虫定位代码害虫定位过程展示 专家咨询功能在线咨询聊天室主要前端代码如下主要后端代码如下 技术栈 Spring Boot…...
信息检索(包含源码)
实验目的 掌握逻辑回归模型在二分类问题中的应用方法熟悉机器学习模型评估指标PR曲线(精确率-召回率曲线)和ROC曲线(受试者工作特征曲线)的绘制与分析学习使用Python的scikit-learn库进行数据预处理、模型训练与评估理解特征选择…...
【金仓数据库征文】金仓数据库KingbaseES: 技术优势与实践指南(包含安装)
目录 前言 引言 一 : 关于KingbaseES,他有那些优势呢? 核心特性 典型应用场景 政务信息化 金融核心系统: 能源通信行业: 企业级信息系统: 二: 下载安装KingbaseES 三:目录一览表: 四:常用SQL语句 创建表: 修改表结构…...
Java数据结构——二叉树
二叉树 树的概念二叉树满二叉树和完全二叉树二叉树的性质二叉树的遍历 题目练习前序遍历中序遍历后序遍历 前言 已经知道了数据结构中的线性结构,那有没有非线性结构呢? 当然有就像我们文件夹,一个文件夹中有有另一个文件夹,这就是…...
用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本2
在版本1中,虽然系统能够满足基本需求,但随着连接数的增加和处理请求的复杂度上升,性能瓶颈逐渐显现。为了进一步提升系统的稳定性、并发处理能力以及资源的高效利用,版本2引入了三个重要功能:客户端连接池、服务器长连…...
drf 使用jwt
安装jwt pip install pyJwt 添加登录url path("jwt/login",views.JwtLoginView.as_view(),namejwt-login),path("jwt/order",views.JwtOrderView.as_view(),namejwt-order), 创建视图 from django.contrib.auth import authenticateimport jwt from jw…...
202536 | KafKa生产者分区写入策略+消费者分区分配策略
KafKa生产者分区写入策略 1. 轮询分区策略(Round-Robin Partitioning) 轮询分区策略 是 Kafka 默认的分配策略,当消息没有指定 key 时,Kafka 会采用轮询的方式将消息均匀地分配到各个分区。 工作原理: 每次生产者发…...
《自动驾驶封闭测试场地建设技术要求》 GB/T 43119-2023——解读
目录 一、标准框架与核心内容 二、重点技术要求 三、实施要点与建议 四、实施时间与参考依据 原文链接:国家标准|GB/T 43119-2023 (发布:2023-09-07;实施:2024-01-01) 一、标准框架与核心内容 适用范围…...
【C++ Qt】容器类(GroupBox、TabWidget)内附思维导图 通俗易懂
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” ✍️绪论: 本章主要介绍了 Qt 中 QGroupBox 与 QTabWidget 控件。QGroupBox 是带标题的分组框,能容纳其他控件,有标题、对齐方式、是否…...
【SpringBoot】从环境准备到创建SpringBoot项目的全面解析.
本篇博客给大家带来的是SpringBoot的知识点, 包括Idea的干净卸载… 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要…...
基于ESP32控制的机器人摄像头车
DIY Wi-Fi 控制的机器人摄像头车:从零开始的智能探索之旅 在当今科技飞速发展的时代,机器人技术已经逐渐走进了我们的生活。今天,我将带你一起探索如何制作一个 Wi-Fi 控制的机器人摄像头车,它不仅可以远程操控,还能通…...
Excel图表 vs 专业可视化工具:差距有多大?内容摘要
你是不是还在用 Excel 做图表,觉得它已经够用了?但你知道吗,Excel 和专业的可视化工具之间其实有着巨大的差距!Excel 是办公必备,但它的图表功能真的能满足复杂的数据展示需求吗?而那些听起来高大上的专业可…...
Nacos源码—7.Nacos升级gRPC分析三
大纲 5.服务变动时如何通知订阅的客户端 6.微服务实例信息如何同步集群节点 5.服务变动时如何通知订阅的客户端 (1)服务注册和服务订阅时发布的客户端注册和订阅事件的处理 (2)延迟任务的执行引擎源码 (3)处理客户端注册和订阅事件时发布的服务变动和服务订阅事件的处理 (…...
量化学习DAY2-开始批量提交alpha!
量化学习第二天笔记 一、World Quant平台的Alpha概念 在World Quant平台中,alpha本质上是一个数学公式,它是**operator(操作)与Data(数据)**的组合。 (一)Data相关 Data…...
【Qwen3_ 4b lora xinli 】 task完成实践记录
task 我需要 基于llamafactory框架选取基本上相同的数据集用lora微调Qwen3_ 4b两次并保存lora参数然后分别合并这两个lora参数到基座模型。再换个数据集上接着进行微调。并且保存新的lora参数,然后我们匹配这里面的特征值和特征向量,如果这两个新的lora…...
文旅田园康养小镇规划设计方案PPT(85页)
1. 项目背景与定位 背景:位于长三角经济圈,依托安吉丰富的自然与文化资源,旨在打造集康养、度假、文化体验于一体的综合小镇。 定位:成为浙北地区知名的康养旅游目的地,融合“一溪两岸”规划理念,实现全面…...
[Windows] 能同时打开多个图片的图像游览器JWSEE v2.0
[Windows] 能同时打开多个图片的图像游览器JWSEE 链接:https://pan.xunlei.com/s/VOPpO86Hu3dalYLaZ1ivcTGIA1?pwdhckf# 十多年前收藏的能同时打开多个图片的图像游览器JWSEE v2.0,官网已没有下载资源。 JWSEE v2.0是乌鲁木齐金维图文信息科技有限公司…...
低成本自动化改造技术锚点深度解析
执行摘要 本文旨在深入剖析四项关键的低成本自动化技术,这些技术为工业转型提供了显著的运营和经济效益。文章将提供实用且深入的指导,涵盖老旧设备联网、AGV车队优化、空压机系统智能能耗管控以及此类项目投资回报率(ROI)的严谨…...
23盘古石决赛
一,流量分析 1. 计算流量包文件的SHA256值是?[答案:字母小写][★☆☆☆☆] 答案:2d689add281b477c82b18af8ab857ef5be6badf253db1c1923528dd73b3d61a9 解压出来流量包计算 2. 流量包长度在“640 - 1279”之间的的数据包总共有多少…...
C语言—指针3
1. 数组名的理解 观察以下代码 可以观察到pa指向的地址与数组首元素地址相同,那么可以说明数组就是首元素地址吗? 这种说法是不严谨的,观察以下代码: 程序输出的结果为16,此时的arr表示的是整个数组的大小。 观察以…...
操作系统 第2章节 进程,线程和作业
一:多道程序设计 1-多道程设计的目的 for:提高吞吐量(作业道数/处理时间),我们可以从提高资源的利用率出发 2-单道程序设计缺点: 设备的利用率低,内存的利用率低,处理机的利用率低 比如CPU去访问内存,CPU空转.内存等待CPU访问也是没有任何操作的.要是有多个东西要去访问不冲…...
数字化转型-4A架构之数据架构
系列文章 数字化转型-4A架构(业务架构、应用架构、数据架构、技术架构) 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数据架构 Data Architecture(DA) 1. 定义 数据架构,是组织管理数据资产的科学之…...
Java中的反射
目录 什么是反射 反射的核心作用 反射的核心类 反射的基本使用 获取Class对象 创建对象 操作字段(Field) 调用方法(Method) 反射的应用场景 反射的优缺点 优点 缺点 示例:完整反射操作 总结 什么是反射 …...
LINUX CFS算法解析
文章目录 1. Linux调度器的发展历程2. CFS设计思想3. CFS核心数据结构3.1 调度实体(sched_entity)3.2 CFS运行队列(cfs_rq)3.3 任务结构体中的调度相关字段 4. 优先级与权重4.1 优先级范围4.2 权重映射表 (prio_to_weight[])优先级计算4.3.1. static_prio (静态优先级)4.3.2. n…...
内网渗透——红日靶场三
目录 一、前期准备 二、外网探测 1.使用nmap进行扫描 2.网站信息收集 3.漏洞复现(CVE-2021-23132) 4.disable_function绕过 5.反弹shell(也,并不是) 6.SSH登录 7.权限提升(脏牛漏洞) 8.信息收集 9.上线msf 三…...
The 2024 ICPC Kunming Invitational Contest G. Be Positive
https://codeforces.com/gym/105386/problem/G 题目: 结论: 从0开始每四个相邻数的异或值为0 代码: #include<bits/stdc.h> using namespace std; #define int long long void solve() {int n;cin >> n;if(n1||n%40){cout &…...
CommunityToolkit.Mvvm详解
属性可视化 给一个属性添加ObservableProperty就可以可视化了 [ObservableProperty] private string currentNameInfo;[ObservableProperty] private string currentClassInfo;[ObservableProperty] private string currentPhoneInfo;xaml中只需要绑定大写的属性就可以了 &l…...
密码学--AES
一、实验目的 1、完成AES算法中1轮加密和解密操作 2、掌握AES的4个基本处理步骤 3、理解对称加密算法的“对称”思想 二、实验内容 1、题目内容描述 (1)利用C语言实现字节代换和逆向字节代换,字节查S盒代换 (2)利…...
操作系统的初步了解
目录 引言:什么是操作系统? 一、设计操作系统的目的 二、操作系统是做什么的: 操作系统主要有四大核心任务: 1. 管理硬件 2. 运行软件 3. 存储数据 4. 提供用户界面 如何理解操作系统的管理呢? 1. 什么是操作…...
边缘计算:技术概念与应用详解
引言 随着物联网(IoT)、5G 和人工智能(AI)的快速发展,传统的云计算架构在处理海量数据和实时计算需求时逐渐显现出瓶颈。边缘计算(Edge Computing)作为一种新兴的计算范式,通过将计…...