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

自定义Widget开发:自定义布局实现

自定义Widget开发:自定义布局实现

一、Flutter布局系统基础

1. 布局约束(Constraints)

在Flutter中,布局系统基于约束(Constraints)的概念。每个widget都会接收来自其父widget的约束,并根据这些约束确定自己的大小。约束包含四个重要的值:

  • minWidth:最小宽度
  • maxWidth:最大宽度
  • minHeight:最小高度
  • maxHeight:最大高度
class BoxConstraints {const BoxConstraints({this.minWidth = 0.0,this.maxWidth = double.infinity,this.minHeight = 0.0,this.maxHeight = double.infinity,});
}

2. 布局流程

  1. 父widget向子widget传递约束
  2. 子widget根据约束确定自己的大小
  3. 父widget根据子widget的大小和自身逻辑确定子widget的位置

3. RenderObject与布局

Flutter的布局系统底层是通过RenderObject来实现的。RenderObject负责:

  • 布局计算(layout)
  • 绘制(paint)
  • 命中测试(hit test)

二、自定义布局Widget实现

1. 创建自定义布局Widget

实现自定义布局Widget需要继承RenderObjectWidget,并实现createRenderObject方法:

class WaterfallFlow extends RenderObjectWidget {final List<Widget> children;final int crossAxisCount;final double crossAxisSpacing;final double mainAxisSpacing;WaterfallFlow({Key? key,required this.children,this.crossAxisCount = 2,this.crossAxisSpacing = 10,this.mainAxisSpacing = 10,}) : super(key: key);RenderObject createRenderObject(BuildContext context) {return RenderWaterfallFlow(crossAxisCount: crossAxisCount,crossAxisSpacing: crossAxisSpacing,mainAxisSpacing: mainAxisSpacing,);}void updateRenderObject(BuildContext context, RenderWaterfallFlow renderObject) {renderObject..crossAxisCount = crossAxisCount..crossAxisSpacing = crossAxisSpacing..mainAxisSpacing = mainAxisSpacing;}
}

2. 实现RenderObject

class RenderWaterfallFlow extends RenderBoxwith ContainerRenderObjectMixin<RenderBox, WaterfallFlowParentData>,RenderBoxContainerDefaultsMixin<RenderBox, WaterfallFlowParentData> {RenderWaterfallFlow({required int crossAxisCount,required double crossAxisSpacing,required double mainAxisSpacing,}): _crossAxisCount = crossAxisCount,_crossAxisSpacing = crossAxisSpacing,_mainAxisSpacing = mainAxisSpacing;int _crossAxisCount;double _crossAxisSpacing;double _mainAxisSpacing;void performLayout() {if (childCount == 0) {size = constraints.smallest;return;}// 计算每列的宽度final double availableWidth = constraints.maxWidth;final double itemWidth = (availableWidth - (_crossAxisCount - 1) * _crossAxisSpacing) / _crossAxisCount;// 存储每列当前的高度List<double> columnHeights = List.filled(_crossAxisCount, 0.0);RenderBox? child = firstChild;while (child != null) {final WaterfallFlowParentData parentData = child.parentData as WaterfallFlowParentData;// 找到高度最小的列int targetColumn = 0;double minHeight = columnHeights[0];for (int i = 1; i < _crossAxisCount; i++) {if (columnHeights[i] < minHeight) {targetColumn = i;minHeight = columnHeights[i];}}// 计算子widget的约束和位置child.layout(BoxConstraints(maxWidth: itemWidth),parentUsesSize: true,);// 设置子widget的位置final double x = targetColumn * (itemWidth + _crossAxisSpacing);final double y = columnHeights[targetColumn];parentData.offset = Offset(x, y);// 更新列高度columnHeights[targetColumn] += child.size.height + _mainAxisSpacing;child = parentData.nextSibling;}// 设置瀑布流的整体大小size = Size(constraints.maxWidth,columnHeights.reduce(max) - _mainAxisSpacing,);}void paint(PaintingContext context, Offset offset) {defaultPaint(context, offset);}bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {return defaultHitTestChildren(result, position: position);}
}

三、实战案例:图片瀑布流

1. 使用自定义瀑布流布局

class WaterfallFlowDemo extends StatelessWidget {final List<String> images = ['https://picsum.photos/200/300','https://picsum.photos/200/200','https://picsum.photos/200/400',// ... 更多图片];Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('瀑布流布局示例')),body: WaterfallFlow(crossAxisCount: 2,crossAxisSpacing: 10,mainAxisSpacing: 10,children: images.map((url) => Image.network(url)).toList(),),);}
}

2. 性能优化

  1. 图片预加载和缓存
class CachedNetworkImageWrapper extends StatelessWidget {final String imageUrl;CachedNetworkImageWrapper({required this.imageUrl});Widget build(BuildContext context) {return CachedNetworkImage(imageUrl: imageUrl,fit: BoxFit.cover,placeholder: (context, url) => Center(child: CircularProgressIndicator()),errorWidget: (context, url, error) => Icon(Icons.error),);}
}
  1. 懒加载实现
class LazyLoadWaterfallFlow extends StatefulWidget {_LazyLoadWaterfallFlowState createState() => _LazyLoadWaterfallFlowState();
}class _LazyLoadWaterfallFlowState extends State<LazyLoadWaterfallFlow> {final List<String> _loadedImages = [];final ScrollController _scrollController = ScrollController();bool _isLoading = false;void initState() {super.initState();_scrollController.addListener(_onScroll);_loadMoreImages();}void _onScroll() {if (_scrollController.position.pixels >=_scrollController.position.maxScrollExtent - 200) {_loadMoreImages();}}Future<void> _loadMoreImages() async {if (_isLoading) return;setState(() => _isLoading = true);// 模拟加载更多图片await Future.delayed(Duration(seconds: 1));setState(() {_loadedImages.addAll(['https://picsum.photos/200/300','https://picsum.photos/200/200',]);_isLoading = false;});}Widget build(BuildContext context) {return SingleChildScrollView(controller: _scrollController,child: WaterfallFlow(crossAxisCount: 2,children: _loadedImages.map((url) => CachedNetworkImageWrapper(imageUrl: url)).toList(),),);}
}

四、常见问题与解决方案

1. 布局溢出处理

class SafeWaterfallFlow extends StatelessWidget {Widget build(BuildContext context) {return LayoutBuilder(builder: (context, constraints) {return WaterfallFlow(crossAxisCount: constraints.maxWidth > 600 ? 3 : 2,children: [...],);},);}
}

2. 动态调整列数

class ResponsiveWaterfallFlow extends StatelessWidget {Widget build(BuildContext context) {return OrientationBuilder(builder: (context, orientation) {return WaterfallFlow(crossAxisCount: orientation == Orientation.portrait ? 2 : 3,children: [...],);},);}
}

五、面试题解析

1. Flutter布局系统的工作原理是什么?

答:Flutter布局系统基于以下核心概念:

  1. 约束传递:父widget向子widget传递BoxConstraints
  2. 大小确定:子widget在约束范围内确定自己的大小
  3. 位置确定:父widget决定子widget的位置

布局过程是自上而下传递约束,自下而上确定大小的过程。

2. 如何优化自定义布局的性能?

答:可以从以下几个方面优化:

  1. 缓存布局结果
  2. 合理使用relayoutBoundary
  3. 避免不必要的重新布局
  4. 使用RepaintBoundary隔离重绘区域
  5. 实现shouldRelayout方法判断是否需要重新布局

3. 自定义布局Widget和RenderObject的关系是什么?

答:

  • Widget是配置信息的载体,描述UI的结构
  • RenderObject负责实际的布局、绘制和命中测试
  • Widget通过createRenderObject创建对应的RenderObject
  • RenderObject通过performLayout等方法实现具体的布局逻辑

六、总结

本文详细介绍了Flutter自定义布局的实现方法,从布局系统基础到实战案例,再到性能优化和问题解决。通过学习本文内容,你应该能够:

  1. 理解Flutter布局系统的核心概念
  2. 掌握自定义布局Widget的实现方法
  3. 学会处理布局相关的常见问题
  4. 能够开发高性能的自定义布局

记住,好的布局实现需要注意:

  • 正确处理布局约束
  • 优化性能
  • 处理边界情况
  • 响应式适配

参考资源:

  1. Flutter官方文档:https://flutter.dev/docs/development/ui/layout
  2. Flutter布局约束:https://flutter.dev/docs/development/ui/layout/constraints
  3. RenderObject文档:https://api.flutter.dev/flutter/rendering/RenderObject-class.html

相关文章:

自定义Widget开发:自定义布局实现

自定义Widget开发&#xff1a;自定义布局实现 一、Flutter布局系统基础 1. 布局约束&#xff08;Constraints&#xff09; 在Flutter中&#xff0c;布局系统基于约束&#xff08;Constraints&#xff09;的概念。每个widget都会接收来自其父widget的约束&#xff0c;并根据这…...

MyBatis(进阶)(xml标签)

本节⽬标 1. 学习MyBatis的动态SQL查询 2. 掌握MyBatis在项⽬中的应⽤, 可以使⽤Spring MVC完成⼀些基础的功能 1. 动态SQL&#xff08;XML&#xff09; 动态 SQL 是Mybatis的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接 可以参考官⽅⽂档&#xff1a; M…...

英皇娱乐X乐华娱乐携手造星!“英皇乐华青少年艺人培训班”正式启动!

2025年5月8日&#xff0c;英皇娱乐集团与乐华娱乐集团联合宣布&#xff0c;双方将在北京市燕京实验中学合作开设“英皇乐华青少年艺人培训班”&#xff0c;为8至18岁的青少年提供专业的演艺及才艺学习平台。此次合作旨在集合两大娱乐公司在演艺行业的资源与优势&#xff0c;共同…...

Linux云计算训练营笔记day04(Rocky Linux中的命令)

mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件&#xff0c;没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录&#xff0c;没有改名 mv /opt/gongli tedu 移动目录&#xff0c;改名了 …...

枚举 · 例13-【模板】双指针

登录—专业IT笔试面试备考平台_牛客网 代码区&#xff1a; #include<algorithm> #include<iostream> #include<vector> #include<unordered_set> using namespace std;struct INTER{int left,right; }; bool compare(const INTER&a,const INTER&a…...

Linux网络编程day7 线程池and UDP

线程池 typedef struct{void*(*function)(void*); //函数指针&#xff0c;回调函数void*arg; //上面函数的参数 }threadpool_task_t; //各子线程任务的结构体/*描述线程池相关信息*/struct threadpool_t{pthread_mutex_t lock; …...

WHAT - ahooks vs swr 请求

文章目录 ahooks特点常用 Hooks 示例1. useRequest — 封装网络请求逻辑&#xff08;比 SWR / React Query 更轻量&#xff09;2. useDebounce — 防抖值3. useLocalStorageState — 本地存储的状态4. useBoolean — 快速管理布尔状态5. useEventListener — 添加事件监听 ahoo…...

算法训练营第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

150. 逆波兰表达式求值 题目 思路与解法 第一思路&#xff1a; 比较简单 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …...

可视化图解算法35:在二叉树中找到两个节点的最近公共祖先(二叉树的最近公共祖先)

1. 题目 描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2&#xff0c;请找到 o1 和 o2 的最近公共祖先节点。 数据范围&#xff1a;树上节点数满足 1≤n≤105 , 节点值val满足区间 [0,n) 要求&#xff1a;时间复杂度 O(n) 注&#xff1a;本题保…...

如果说开启的TIM3定时器有ccr1,ccr2,ccr3,我想要关闭ccr2的PWM输出,怎么通过代码实现

目录 作用概述&#xff1a; 具体原理&#xff1a; 代码的操作细节&#xff1a; 实际效果&#xff1a; 示意全文&#xff1a; 小结&#xff1a; TIM3->CCER & ~TIM_CCER_CC2E; 作用概述&#xff1a; 作用是禁用 TIM3 的通道 2&#xff08;CCR2&#xff09;的捕获…...

高能数造全固态电池干法电极高品质原纤化技术:驱动干法和全固态电池制造新进程

技术背景 传统湿法电极制备工艺的局限:传统的湿法电极制备工艺需要使用大量的溶剂来溶解粘结剂和分散活性物质&#xff0c;后续还需要复杂的干燥工序来去除溶剂。这不仅增加了生产成本和能源消耗&#xff0c;溶剂的使用和处理还会带来环境污染和安全隐患。 新能源产业发展的需…...

AI驱动的制造工艺:系统化探索与创新

DeepSeek 技术全景 在当今 AI 技术蓬勃发展的时代,DeepSeek 已成为该领域中一颗耀眼的明星。自 2023 年 7 月 17 日成立以来,这家由知名私募巨头幻方量化孕育而生的公司,迅速在 AI 领域崭露头角 。DeepSeek 的目标是开发顶尖的大语言模型(LLM),并利用数据蒸馏技术打造更精…...

Mac 平台获取地区标识符号

以下是添加了详细中文注释的代码版本&#xff0c;解释每一行代码的作用&#xff1a; #include <CoreFoundation/CoreFoundation.h> #include <vector> #include <string> #include <iostream>// 将 Core Foundation 的字符串(CFStringRef)转换为标准 …...

PyTorch 实战:从 0 开始搭建 Transformer

导入必要的库 python import math import torch import torch.nn as nn from LabmL_helpers.module import Module from labml_n.utils import clone_module_List from typing import Optional, List from torch.utils.data import DataLoader, TensorDataset from torch imp…...

Java 显式锁与 Condition 的使用详解

Java 显式锁与 Condition 的使用详解 在多线程编程中&#xff0c;线程间的协作与同步是核心问题。Java 提供了多种机制来实现线程同步&#xff0c;除了传统的 synchronized 关键字外&#xff0c;ReentrantLock 和 Condition 是更灵活且功能强大的替代方案。本文将详细介绍显式…...

【MySQL】存储引擎 - CSV详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

LeetCode算法题(Go语言实现)_62

题目 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如 “L” 的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不…...

矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践

矿井设备通信破局&#xff1a;ModbusTCP转DeviceNet网关应用实践 在500米深的金属矿井中&#xff0c;传统人工操控采掘设备存在高风险、低效率问题。某矿业集团引入海希无线遥控器远程控制掘进机&#xff0c;却因通信协议冲突陷入困局&#xff1a;海希遥控器采用DeviceNet协议…...

GrassRoot备份项目

Windows服务项目 Grass.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http.Headers; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Time…...

多级路由器如何避免IP冲突

在多级路由器架构中&#xff0c;避免IP冲突的核心在于合理规划子网、正确配置路由器角色与功能。以下是综合多个搜索结果的解决方案及操作步骤&#xff1a; 一、划分不同子网段 修改LAN口IP地址 主路由器默认LAN口IP为192.168.1.1&#xff0c;次级路由器需更改为不同网段&#…...

VGGNet详解

VGGNet 由牛津大学视觉几何组&#xff08;Visual Geometry Group&#xff09;在2014年提出&#xff0c;凭借极简的 33卷积核堆叠设计 成为经典模型&#xff0c;影响了后续大量网络架构。 1. 网络结构 VGGNet 的核心思想是 通过多层小卷积核&#xff08;33&#xff09;替代大卷…...

TDengine 在新能源行业应用

简介 在当前可再生能源迅速发展的浪潮中&#xff0c;分布式光伏和可再生能源的装机容量已经达到相当可观的规模。尽管新能源的发展得到政策的鼎力扶持&#xff0c;但其并网后对电网的运行调度、供电可靠性以及系统的安全稳定带来诸多新挑战。 分布式光伏&#xff0c;即分布式…...

[人机交互]设计,原型建立和构造

一.建立和构造原型 1.1理解用户需要和技术之间的关系 用户需要和技术之间是一个鸡和蛋的问题 • 用户对产品的理解建立在 与该产品交互 的基础上 • 用户只有在熟悉后&#xff0c;才能 评价 是否需要&#xff0c;及 进一步 的需要 • 构造最终产品需要大量资源 • 原型化 是 …...

C#生成二维码和条形码

C# 实现二维码和条形码生成&#xff1a;从入门到实战 文章目录 C# 实现二维码和条形码生成&#xff1a;从入门到实战一、引言二、准备工作2.1 开发环境搭建2.2 引入相关库 三、生成条形码3.1 条形码基本概念3.2 使用[ZXing.Net](https://ZXing.Net)生成条形码3.2.1 核心代码实现…...

2025.5.8总结(中期审视)

今日记录&#xff1a; 晚上&#xff0c;主管找我聊了关于中期绩效审视的问题。 首先就是让我汇报上半年的工作进展&#xff0c;汇报完后&#xff0c;感觉体现不出自己的工作量&#xff0c;这确实考验个人的汇报能力。 汇报完工作后&#xff0c;主管开始给我提了一些建设性的…...

Pyinstaller编译EXE及反编译

文章目录 适用范围示例文件编译EXE反编译EXE准备工具编译pycdc反编译 反编译得到的文件相关资源下载 适用范围 实测 python3.9可以反编译。从pycdc源代码看&#xff0c;似乎支持到python 3.13。 示例文件 demo.py import sys from PyQt5 import QtWidgets, QtCore, QtGui c…...

3.2.3 掌握RDD转换算子 - 3. 扁平映射算子 - flatMap()

在本节课中&#xff0c;我们深入学习了Spark RDD的flatMap()算子。flatMap()与map()类似&#xff0c;但每个元素可以返回0到多个元素&#xff0c;最终将所有结果合并为一个RDD。通过案例演示&#xff0c;我们首先对单词文件进行了统计&#xff0c;通过map()将每行文本转换为单词…...

深入解析 C# 常用数据结构:特点、区别与优缺点分析

在软件开发中&#xff0c;选择合适的数据结构是提高代码效率和性能的关键。在 C# 中&#xff0c;我们常用的数据结构包括 List、Array、Dictionary<TKey, TValue>、HashSet、Queue、Stack 和 LinkedList。每种数据结构有不同的特点、优缺点和适用场景。本文将结合代码&am…...

LeetCode第284题 - 窥视迭代器

题目 解答一 package leetcode.editor.cn; //leetcode submit region begin(Prohibit modification and deletion) // Java Iterator interface reference: // https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.htmlimport java.util.Iterator; import java.ut…...

克里金模型+多目标优化+多属性决策!Kriging+NSGAII+熵权TOPSIS!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 克里金模型多目标优化多属性决策&#xff01;KrigingNSGAII熵权TOPSIS&#xff01;&#xff01;matlab2023b语言运行&#xff01; 1.克里金模型&#xff08;Kriging Model&#xff09;是一种基于空间统计学的插值方法…...

驱动开发硬核特训 · Day 30(下篇): 深入解析 lm48100q I2C 音频编解码器驱动模型(基于 i.MX8MP)

作者&#xff1a;嵌入式Jerry 视频教程请关注 B 站&#xff1a;“嵌入式Jerry” 一、背景与目标 在本篇中&#xff0c;我们围绕 TI 的 lm48100q 音频编解码器 展开&#xff0c;深入讲解其作为 I2C 外设如何集成至 Linux 内核音频子系统&#xff08;ASoC&#xff09;&#xff0…...

【RAG】indexing 中的 Hierarchical Indexing(分层索引)

Hierarchical Indexing&#xff08;分层索引&#xff09; 关键词解析&#xff1a; Splits (分割): 原始文档被分割成较小的块。Cluster (聚类): 将语义上相似的文档块分组在一起。Summaries (摘要): 为每个聚类或更高层次的节点生成摘要。RAPTOR (Recursive Abstractive Proc…...

【LeetCode 42】接雨水(单调栈、DP、双指针)

题面&#xff1a; 思路&#xff1a; 能接雨水的点&#xff0c;必然是比两边都低&#xff08;小&#xff09;的点。有两种思路&#xff0c;一种是直接计算每个点的最大贡献&#xff08;也就是每个点在纵向上最多能接多少水&#xff09;&#xff0c;另一种就是计算每个点在横向上…...

【软件设计师:数据库】13.数据库控制与安全

一、数据库语言SQL SQL是结构化查询语言(Structured Query Language)的缩写,其功能包括数据查询、数据操纵、数据定义和数据控制四个部分。 SQL 语言简洁、方便实用、功能齐全,已成为目前应用最广的关系数据库语言。SQL既是自含式语言(联机交互),又是嵌入式语言(宿主语…...

PWN基础-ROP技术-ret2syscall-64位程序栈溢出利用

前置 ret2syscall 的基础我们就不做过多讲解了 利用思路与 32 位类似&#xff0c;只是传参的寄存器是&#xff1a; rdi -> rsi -> rdx -> rcx -> r8 -> r9 我们这里只用到前三个就可以了&#xff0c;以及 rax 还有一个区别就是&#xff1a; 32 位系统调用最…...

基于大模型预测的产钳助产分娩全方位研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、产钳助产分娩概述 2.1 产钳助产定义与历史 2.2 适用情况与临床意义 三、大模型预测原理与数据基础 3.1 大模型技术原理 3.2 数据收集与处理 3.3 模型训练与验证 四、术前预测与准备 4.1 大模型术前风险预…...

二叉树结构的深入学习

目录 1. 节点结构 1.1.值&#xff08;val&#xff09; 1.2.左右孩子节点 2.本质 3.类型 4.遍历方式 树是一种递归的数据结构。具有一个根节点和多个子节点&#xff0c;形成邻接关系&#xff0c;每个节点可以有零个或多个子节点。 树的定义是递归的&#xff0c;由根节点的…...

SVT-AV1源码学习-EbMotionEstimation.h 学习

#ifndef EbMotionEstimation_h //防止文件呗重复包含的宏定义开始标记 #define EbMotionEstimation_h 定义头文件标识符 #include "definitions.h" //包含定义文件 #include "coding_unit.h" //包含编码单元相关文件 #include "me_process.h" //…...

代理服务器

1.准备3台虚拟机 1台当做代理服务器&#xff1b;2台当做真实访问服务器&#xff1b;可以再来一台虚拟机当客户机&#xff0c;也可以使用主机来当客户机。 依次配置服务器 真实服务器&#xff08;配置文件无需更改&#xff09;&#xff1a; 代理服务器&#xff1a; 35 ups…...

数值分析——条件数

1. 条件数的定义与计算 条件数&#xff08;Condition Number&#xff09;用于量化矩阵或函数对输入误差的敏感程度&#xff0c;反映问题的“良态”或“病态”特性。 矩阵条件数的定义 对于一个非奇异方阵 A&#xff0c;其条件数定义为&#xff1a; κ(A)∥A∥⋅∥A−1∥ 其…...

C++ STL 入门:map 键值对容器

C STL 入门&#xff1a;map 键值对容器 一、核心特性与适用场景 map 是 C STL 提供的关联式键值容器&#xff0c;基于红黑树实现&#xff0c;具备以下核心特征&#xff1a; 特性表现形式底层原理键唯一性不允许重复键值红黑树节点键值唯一约束自动排序元素按键升序排列红黑树…...

ESP32-CAM开发板学习(一)

一、Arduino IDE搭建ESP32开发环境 1、安装 Arduino IDE 软件&#xff0c;在官网下载压缩包解压直接使用 官网链接: Arduino IDE 2、修改软件语言&#xff0c;单击左上角 File → Preferences…&#xff0c;把Language改成中文(简体)&#xff0c;保存 3、安装esp32开发板库…...

Arm核的Ubuntu系统上安装Qt

Arm核的Ubuntu系统上安装Qt 一、准备工作 确保可以连接网络 二、安装gcc 1、判断gcc是否安装 命令行输入:gcc -v 2、如果没有安装 输入命令安装: sudo apt install gcc 三、安装g++ 1、判断g++是否安装 命令行输入:g++ -v...

C++GO语言微服务和服务发现

目录 01 03-go-micro简介 02 04-服务发现的简单认识 03 05-consul的安装 04 06-consul常用的命令 05 07-注册服务到consul并验证 06 08-consul健康检查 07 09-consul结合grpc使用-上&#xff08;只实现grpc远程调用&#xff09; 08 10-consul结合grpc使用-中&#xff08…...

【随笔】Google学术:but your computer or network may be sending automated queries.

文章目录 一、问题复述二、问题原因三、解决 前提&#xff1a;你的xxx是自己做的&#xff0c;你自己可以管理&#xff0c;而不是用的那些劣质✈场。 一、问题复述 &#x1f7e2;如下图所示&#xff1a;可以打开谷歌学术&#xff0c;但是一搜索就是这个界面。 二、问题原因 …...

JavaSE核心知识点02面向对象编程02-02(封装、继承、多态)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-02&#…...

Ubuntu 服务器管理命令笔记

这份命令笔记涵盖了 Ubuntu 服务器管理的各个方面&#xff0c;包括系统更新、用户管理、安全配置、网络诊断等&#xff0c;适合日常使用与技术分享。 系统管理命令 sudo apt update && sudo apt upgrade -y # 更新系统 sudo reboot …...

航电系统之数据传输与交换篇

航电系统的数据传输与交换是航空电子领域的核心技术&#xff0c;直接关系到飞行安全、效率及任务执行能力。以下从技术架构、关键协议、应用场景、发展趋势与挑战四个维度进行系统阐述&#xff1a; 一、技术架构与核心组件 航电系统数据传输与交换采用分层化、模块化设计&…...

MATLAB 在医疗行业的应用

MATLAB 在医疗行业的应用 MATLAB 是一种强大的技术计算和模拟平台&#xff0c;在医疗行业中有着广泛的应用。日益处于数字化和智能化进程中的医疗行业&#xff0c;需要应用很多高性能的工具来支撑设备设计&#xff0c;信号分析&#xff0c;AI 项目开发等。本文将全面介绍 MATL…...

基于CNN与SHAP可解释性分析的神经网络回归预测模型【MATLAB】

基于CNN与SHAP可解释性分析的神经网络回归预测模型【MATLAB】 一、引言 在当今数据驱动的时代&#xff0c;机器学习和深度学习技术被广泛应用于各类预测任务中。其中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;因其在处理具有空间结构的数据方面表现出色&#xff0…...