Flutter - 概览
Hello world
⌘ + shift + p
选择 Empty Application
模板
// 导入Material风格的组件包
// 位置在flutter安装目录/packages/flutter/lib/material.dart
import 'package:flutter/material.dart';void main() {// runApp函数接收MainApp组件并将这个Widget作为根节点runApp(const MainApp());
}class MainApp extends StatelessWidget {const MainApp({super.key});// Describes the part of the user interface represented by this widget.// The framework calls this method when this widget is inserted into the tree in a given // [BuildContext] and when the dependencies of this widget change // (e.g., an [InheritedWidget] referenced by this widget changes). // This method can potentially be called in every frame and should not have any // side effects beyond building a widget.Widget build(BuildContext context) {/// An application that uses Material Design./// 使用Material设计的组件,home代表默认页return const MaterialApp(/// The Scaffold is designed to be a top level container for/// a [MaterialApp]. This means that adding a Scaffold/// to each route on a Material app will provide the app with/// Material's basic visual layout structure./// Scaffold,MateriaApp组件的顶层容器,规范样式之类的home: Scaffold(body: Center( /// 局中显示Hello Worldchild: Text('Hello World'),),),);}
}
build方法用于描述Widget的展示效果,当被添加到上下文的树和Widget发生变化时会触发这个方法。因为这个方法是高频操作所以不应该有副作用。
热重载(Hot reload)
Flutter支持热重载,无需重启启动应用的情况下去重新刷新页面。通过将更新代码注入到运行的Dart虚拟机来实现热重载。在虚拟机使用新的字段和函数更新类后,Flutter框架自动重新构建widget。
修改后直接保存/点击调试那里的闪电图标能直接刷新
有状态(StatefulWidget) + 无状态(StatelessWidget)
Flutter中的一切都是Widget,Widget分为有状态和无状态两种,在 Flutter 中每个页面都是一帧,无状态就是保持在那一帧,而有状态的 Widget 当数据更新时,其实是创建了新的 Widget,只是 State 实现了跨帧的数据同步保存。
比如上面的MainApp
是无状态的Widget,而Scaffold
是有状态的Widget
class MainApp extends StatelessWidget {
...
}class Scaffold extends StatefulWidget {
...
}
创建新组件时继承有状态还是无状态的Widget
取决于是否要管理状态
基础组件
Text
Text 是现实单一样式的文本字符串组件。字符串可能跨多行中断,也可能全部显示在同一行上,取决于布局约束
Widget build(BuildContext context) {return MaterialApp(home:Scaffold(body:Center(// 设置宽度限制为100点child:Container(width: 100,height:30,// 边框decoration: BoxDecoration(border: Border.all()),// TextOverflow.ellipsis 超过部分用...// TextOverflow.clip -- Clip the overflowing text to fix its container. 超出部分换下一行,外部容器会被遮挡// TextOverflow.visible -- Render overflowing text outside of its container. 超出容器部分能渲染child: Text(overflow:TextOverflow.ellipsis, 'Hello world, how are you?')))));}
TextOverflow.ellipsis
的效果
TextOverflow.clip
的效果
TextOverflow.visible
的效果
maxLines
控制最大行数
softWrap
控制是否换行
当overflow
是TextOverflow.visible
时
softWrap: false
softWrap: true
Text.rich
使用Text.rich构造器,Text组件可以在一个段落中展示不同的样式
Widget build(BuildContext context) {return MaterialApp(home: Scaffold(body: Center(child: const Text.rich(TextSpan(text: 'Hello', // default text stylechildren: <TextSpan>[TextSpan(text: ' beautiful ',style: TextStyle(fontStyle: FontStyle.italic),),TextSpan(text: 'world',style: TextStyle(fontWeight: FontWeight.bold),),],),),),),);}
关于Text的交互
用GestureDetector widget
包装Text
,然后在GestureDetector.onTap
中处理点击事件。或者使用TextButton
来代替
Row,Column,Stack,Container
- Container: 只有一个子 Widget。默认充满,包含了padding、margin、color、宽高、decoration 等配置
- Row: 可以有多个子 Widget。水平布局。
- Column: 可以有多个子 Widget。垂直布局。
- Stack: 可以有多个子 Widget。 子Widget堆叠在一起。
- Center: 只有一个子 Widget。只用于居中显示,常用于嵌套child,给child设置居中。
- Padding: 只有一个子 Widget。只用于设置Padding,常用于嵌套child,给child设置padding。
- Expanded: 只有一个子 Widget。在 Column 和 Row 中充满。
- ListView: 可以有多个子Widget,列表布局
// 水平布局
Row(children: [// 图标const IconButton(icon: Icon(Icons.menu),tooltip: 'Navigation menu',onPressed: null, // null disables the button),// Expanded expands its child// to fill the available space.// 填充满2个图标之间的空间Expanded(child: title),// 查询图标const IconButton(icon: Icon(Icons.search),tooltip: 'Search',onPressed: null,),],
)
// 垂直布局
Column(children: [MyAppBar(title: Text('示例标题',style:Theme.of(context) //.primaryTextTheme.titleLarge,),),const Expanded(child: Center(child: Text('容器'))),],
)
要使用material中这些预定义图标,需要将工程中的pubspec.yaml
文件里的uses-material-design
字段设置为true
使用Material组件
import 'package:flutter/material.dart';void main() {runApp(const MaterialApp(title: 'Flutter Tutorial', home: TutorialHome()));
}class TutorialHome extends StatelessWidget {const TutorialHome({super.key}); Widget build(BuildContext context) {// Scaffold is a layout for// the major Material Components.return Scaffold(appBar: AppBar(leading: const IconButton(icon: Icon(Icons.menu),tooltip: 'Navigation menu',onPressed: null,),title: const Text('Material Components'),actions: const [IconButton(icon: Icon(Icons.search),tooltip: 'Search',onPressed: null,),],),// body is the majority of the screen.body: const Center(child: Text('Material!')),floatingActionButton: const FloatingActionButton(tooltip: 'Add', // used by assistive technologiesonPressed: null,child: Icon(Icons.add),),);}
}
使用Scaffold
和AppBar
替换原来自定义的MyScaffold
和MyAppBar
手势处理
build(BuildContext context) {return MaterialApp(home: Scaffold(body: Center(child: GestureDetector(child: Text('Hello world',overflow: TextOverflow.ellipsis,),onTap: ()=> {// 生产环境不要用printprint("123")},)),),);
}
Widget
更改小组件以响应输入
UI通常需要对用户的输入进行响应,比如点外卖时根据用户选择菜品计算最后的价格, Flutter
中使用StatefulWidgets
来处理这种场景。
继承StatefulWidget
,重写createState
方法
class Counter extends StatefulWidget {const Counter({super.key});// 继承StatefulWidget的类要重写createState()方法,内容返回是_CounterState对象// ``=>`` (胖箭头)简写语法用于仅包含一条语句的函数。该语法在将匿名函数作为参数传递时非常有用 State<Counter> createState() => _CounterState();
}
所有的类都隐式定义成了一个接口。因此,任意类都可以作为接口被实现,定义一个继承State并实现Counter
类的方法
/// [State] objects are created by the framework by calling the
/// [StatefulWidget.createState] method when inflating a [StatefulWidget] to
/// insert it into the tree.
/// 在这里当Counter组件被添加到渲染树时,因为也实现了Counter类,所以会调用对应的createState方法。
class _CounterState extends State<Counter> {int _counter = 0;// _ 代表私有方法void _increment() {// 调用setState()通知Flutter状态变化了,然后重新执行build方法实现实时刷新的效果setState(() {_counter++;});}
合并的示例
import 'package:flutter/material.dart';class Product {const Product({required this.name});final String name;
}typedef CartChangedCallback = Function(Product product, bool inCart);class ShoppingListItem extends StatelessWidget {ShoppingListItem({required this.product,required this.inCart,required this.onCartChanged,}) : super(key: ObjectKey(product));final Product product;final bool inCart;final CartChangedCallback onCartChanged;Color _getColor(BuildContext context) {return inCart //? Colors.black54: Theme.of(context).primaryColor;}TextStyle? _getTextStyle(BuildContext context) {if (!inCart) return null;return const TextStyle(color: Colors.black54,decoration: TextDecoration.lineThrough,);} Widget build(BuildContext context) {return ListTile(// 5. 点击Item时调用传入 onCartChanged 回调,并传入一开始接收的出参数// 比如一开始在订单内inCart传trueonTap: () {onCartChanged(product, inCart);},leading: CircleAvatar(backgroundColor: _getColor(context),child: Text(product.name[0]),),// 4.显示产品订单的样式// 10.根据新参数重新显示样式title: Text(product.name, style: _getTextStyle(context)),);}
}class ShoppingList extends StatefulWidget {// 要求传入 products属性const ShoppingList({required this.products, super.key});final List<Product> products;// 2. 调用_ShoppingListState创建状态对象 State<ShoppingList> createState() => _ShoppingListState();
}class _ShoppingListState extends State<ShoppingList> {final _shoppingCart = <Product>{};// 6. 点击触发回调void _handleCartChanged(Product product, bool inCart) {setState(() {// 7. 根据入参进行判断,如果一开始是true,则移除,否则添加,即取反操作if (!inCart) {_shoppingCart.add(product);} else {_shoppingCart.remove(product);}// 8. 通知Flutter 重新执行_ShoppingListState对象的build方法});} Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Shopping List')),body: ListView(padding: const EdgeInsets.symmetric(vertical: 8),children:// 3. 根据products属性创建ShoppingListItem,并传入产品信息,回调// 9. 再次调用ShoppingListItem并传入新参数widget.products.map((product) {return ShoppingListItem(product: product,inCart: _shoppingCart.contains(product),onCartChanged: _handleCartChanged,);}).toList(),),);}
}void main() {runApp(const MaterialApp(title: 'Shopping App',// 1. 创建ShoppingList对象,并传入Product参数home: ShoppingList(products: [Product(name: 'Eggs'),Product(name: 'Flour'),Product(name: 'Chocolate chips'),],),),);
}
响应组件的生命周期相关事件
Flutter
调用createState
方法后,会将state
对象添加到渲染树并且调用state
对象的initState()
,可以重写这个方法中配置动画或准备订阅平台相关的服务,重写方法开始要先调用super.initState
。当state
对象不再需要时,Flutter
会调用对象的dispose
方法来执行清理操作,比如取消定时器,取消订阅,同样在重写方法中也要先调用super.dispose
其它
包缓存地址
$ flutter pub get
# 命令下载的包在~/.pub-cache/hosted
参考
- Flutter
- Flutter-UI
- Flutter - 我给官方提PR,解决run命令卡住问题 😃
- Day16 - Flutter - 屏幕适配
相关文章:
Flutter - 概览
Hello world ⌘ shift p 选择 Empty Application 模板 // 导入Material风格的组件包 // 位置在flutter安装目录/packages/flutter/lib/material.dart import package:flutter/material.dart;void main() {// runApp函数接收MainApp组件并将这个Widget作为根节点runApp(cons…...
Python-pandas-操作Excel文件(读取数据/写入数据)及Excel表格列名操作详细分享
Python-pandas-操作Excel文件(读取数据/写入数据) 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每…...
手写 Vue 源码 === Vue3 设计思想
1.声明式框架 Vue3 是声明式的框架,用起来简单。 命令式和声明式区别 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程声明式框架更加关注结果。命令式的代码封装到了 Vuejs 中,过程靠 vuejs 来实现声明式代码更加简单,不需要关注实现,按照要求填代…...
Android WebView加载h5打开麦克风与摄像头的权限问题
目录 快速处理 app向系统申请录音与相机权限h5向app申请录音和相机权限 详细解答 app权限与h5权限录音与麦克风默许的风险最佳实践 Android webview h5 麦克风权限,摄像头(相机)权限实现与填坑。 快速处理 app向系统申请录音与相机权限 …...
三种计算最小公倍数的方法分析
三种计算最小公倍数的方法分析与比较 一.引言 最小公倍数(Least Common Multiple, LCM)是数学中的一个基本概念,指能够被两个或多个整数整除的最小的正整数。在编程中,我们有多种方法可以计算两个数的最小公倍数。本文将分析三种…...
PDF转换工具xpdf-tools-4.05
XPDF是一个开源的PDF查看、提取和转换工具套件,使用C编写,支持多种操作系统,包括Linux、Unix、OS/2、Windows和Mac OS X1。XPDF不仅是一个PDF查看器,还包含多个实用工具,如文本提取器、图像转换器和HTML转换器等&a…...
aws(学习笔记第四十课) image-content-search
aws(学习笔记第四十课) image-content-search 使用SQS Lambda集成 数据库(Aurora Serverless) Cognito(用户管理) rekognition(图像解析) 学习内容: 使用SQS Lambda Aurora Serverless Cog…...
GPT-4o 图像生成与八个示例指南
什么是GPT-4o图像生成? 简单来说,GPT-4o图像生成是集成在ChatGPT内部的一项功能。用户可以直接在对话中,通过文本描述(Prompt)来创建、编辑和调整图像。这与之前的图像生成工具相比,体验更流畅、交互性更强…...
PostgreSQL 查看表膨胀情况的方法
PostgreSQL 查看表膨胀情况的方法 表膨胀(Table Bloat)是PostgreSQL中由于MVCC机制导致的一种常见现象,当大量数据被更新或删除后,表中会积累"死元组"(dead tuples),这些死元组占据空间但不可见,导致表实际占用的磁盘空…...
从 0 到 1!深度剖析项目实施流程,开启项目管理新视野
一、项目准备 / 前期准备 (一)跟销售进行项目交接 对接人:销售人员交接会议内容: 了解项目背景、客户基本信息、项目版本、具备二次开发功能、接口、了解合同信息等。明确项目情况、客户基本情况、使用软件(版本&…...
书生实战营之沐曦专场
一:实验环境进入和启动实验容器(D.run平台) 1.1首先进入平台进行注册 D.run平台https://console.d.run/ 注册和登录环节就跳过了。 1.2 启动实验容器--详细步骤如下 1.2.1选择容器的名称、区域、镜像(注意镜像必须选择Dlinfer) 1.2.2可以选…...
在运行 Hadoop 作业时,遇到“No such file or directory”,如何在windows里打包在虚拟机里运行
最近在学习Hadoop集群map reduce分布运算过程中,经多方面排查可能是电脑本身配置的原因导致每次运行都会报“No such file or directory”的错误,最后我是通过打包文件到虚拟机里运行得到结果,具体步骤如下: 前提是要保证maven已经…...
基于YOLOV5的目标检测识别
基于YOLOV5的目标检测识别 舰船目标检测口罩目标检测飞机目标检测 舰船目标检测 口罩目标检测 飞机目标检测...
第4篇:服务层抽象与复用逻辑
在业务系统复杂度指数级增长的今天,服务层(Service Layer)的合理设计直接影响着系统的可维护性和扩展性。本文将深入剖析 Egg.js 框架中的服务层架构设计,从基础实现到高级封装,全方位讲解企业级应用的开发实践。 一、…...
多模态大语言模型arxiv论文略读(五十四)
RoboMP 2 ^2 2: A Robotic Multimodal Perception-Planning Framework with Multimodal Large Language Models ➡️ 论文标题:RoboMP 2 ^2 2: A Robotic Multimodal Perception-Planning Framework with Multimodal Large Language Models ➡️ 论文作者ÿ…...
中小企业MES系统详细设计
版本:V1.1 日期:2025年5月2日 一、设备协议兼容性设计 1.1 设备接入框架 #mermaid-svg-PkwqEMRIIlIBPP58 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PkwqEMRIIlIBPP58 .error-icon{fill…...
第二十周:项目开发中遇到的相关问题(一)
自十九周开始,我们便开始着手写项目(关于新闻资讯类的Web项目),当然,在这之中我们也学到了很多高效且有用的好技术,在接下来的内容中将去具体的描述这些好技术,介绍它们的具体用法和应用场景。本…...
WebRtc10: 端对端1v1传输基本流程
媒体能力协商过程 RTCPeerConnection(核心类) 基本格式 pc new RTCPeerConnection([configiration]); RTCPeerConnection方法分类 媒体协商Stream/Track传输相关方法统计相关方法 媒体协商过程 协商状态变化 媒体协商方法 createOffercreateAnswe…...
【云备份】配置文件加载模块
目录 一.为什么要配置文件 二.配置文件的实现 三.单例文件配置类设计 四.源码 一.为什么要配置文件 我们将服务端程序运行中用到的一些关键信息保存到配置文件中,这样可以使程序的运行更加灵活。 这样做的好处是,未来如果我们想要修改一些关键信息&…...
重构之道:识别并替换不合适使用的箭头函数
1、引言 JavaScript 自 ES6 引入了箭头函数(Arrow Function)后,因其简洁的语法和对 this 的词法绑定机制,迅速成为开发者喜爱的写法之一。然而,并不是所有场景都适合使用箭头函数。 在实际开发中,我们常常会因为追求代码简洁而忽视其潜在问题,例如: this 指向错误不适…...
git问题记录-如何切换历史提交分支,且保留本地修改
问题记录 我在本地编写了代码,突然想查看之前提交的代码,并且想保留当前所在分支所做的修改 通过git stash对本地的代码进行暂存 使用git checkout <commit-hash>切换到之前的提交记录。 查看完之后我想切换回来,恢复暂存的本地代码…...
【MySQL】事务管理
事务管理 一. 事务的概念二. 事务的特征三. 事务的版本支持四. 事务的提交方式五. 事务的常见操作六. 事务的隔离级别1. 查看与设置隔离级别2. 读未提交 (Read Uncommitted)3. 读提交 (Read Committed)4. 可重复读 (Repeatable Read)5. 串行化 (Serializable)6. 隔离级别的总结…...
【点对点协议(PPP)全解析】从原理到工程实践
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心配置实现案例1:基础PPP链路建立案例2:CHAP认证配置 运行结果验证 三、性能对比测试…...
环境搭建:开启 Django 开发之旅
一、环境搭建:开启 Django 开发之旅 (一)安装 Python 先确保电脑上装有 Python 3.6 及以上版本,Django 5.1 的话,至少得 Python 3.8 哦。 安装前,先查下有没有装过 Python ,终端(Wi…...
如何配置NGINX作为反向代理服务器来缓存后端服务的响应?
大家好,我是锋哥。今天分享关于【如何配置NGINX作为反向代理服务器来缓存后端服务的响应?】面试题。希望对大家有帮助; 如何配置NGINX作为反向代理服务器来缓存后端服务的响应? 1000道 互联网大厂Java工程师 精选面试题-Java资源…...
【Java IO流】File类基础详解
参考笔记:java File类基础 万字详解(通俗易懂)-CSDN博客 目录 1.前言 2. File类介绍 3. File类构造方法 4.File类常用的方法案例演示 4.1 创建文件/文件夹的方法 4.2 删除文件/文件夹的方法 4.3 判断文件/文件夹是否存在的方法 4.4 …...
《C#数据结构与算法》—201线性表
线性表的实现方式 顺序表 线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,用这种方式存储的线性表叫顺序表。 特点:表中相邻的数据元素在内存中存储位置也相邻。 顺序表接口实现: 方法名参数返回值描述GetLen…...
MATLAB绘制局部放大图
今天,我将分享一段 MATLAB 代码,该代码生成了一个主副图结合的可视化展示,用于比较不同控制系统性能表现。 clc; clear; close all;% 生成时间向量 t 0:0.1:12;% 生成模拟数据 zero_feedback 0.5 * ones(size(t)); % 恒定…...
TS 常用类型
JS不会检查变量类型的变化 给变量规定特定的数据类型,错误赋值时会报错 优势:TS会标记出代码中的意外行为,尤其是typeerrors 具体实现:类型注解 JS和TS中数据类型的变化...
[Control-Chaos] Toxic Cascade(毒性級鏈)
信息 信息描述靶場名稱Toxic Cascade地址GitHub: Toxic Cascade難度中等人數推薦1人類型CTF、APT 攻擊模擬、故事解謎、化工工程與逆向工程描述Toxic Cascade 是一個結合 CTF、APT 攻擊模擬、故事解謎、化工工程與逆向工程的高度沉浸式靶場。該靶場具有獨特的情境背景與模擬真…...
纳米AI搜索体验:MCP工具的实际应用测试,撰写报告 / 爬虫小红书效果惊艳
1. 引言 近期测试了纳米AI搜索的MCP工具功能,重点体验了其智能体在报告生成和社交媒体数据分析方面的表现。平台整合了100多个MCP工具,通过本地化部署的方式,为用户提供了不同于云端方案的操作体验。本文将分享实际测试结果,包括智…...
React useMemo函数
第一个参数是回调函数,返回计算的结果,第二个参数是依赖项,该函数只监听count1变量的变化 import { useReducer, useState } from react; import ./App.css;// 定义一个Reducer函数 根据不同的action进行不同的状态修改 function reducer(st…...
第 1 篇:起点的选择:为何需要超越数组与链表?
大家好,欢迎来到“数据结构选型指南”系列!在软件开发中,数据是核心,而如何高效地组织和访问这些数据,则是程序性能的关键。选择合适的数据结构,就像为你的 Java 应用选择最优的“引擎零件”。今天…...
MySQL 索引不生效的情况
MySQL 索引不生效的 SQL 查询需要避免的情况 索引是提高 MySQL 查询性能的关键,但某些 SQL 写法会导致索引失效,从而影响查询效率。以下是需要避免的常见情况: 1. 使用 NOT、! 或 <> 操作符 -- 索引可能失效 SELECT * FROM users WH…...
【阿里云大模型高级工程师ACP学习笔记】2.9 大模型应用生产实践 (上篇)
特别说明:由于这一章节是2025年3月官方重点更新的部分,新增内容非常多,因此我不得不整理成上、下两篇,方便大家参考。 学习目标 备考阿里云大模型高级工程师ACP认证,旨在全面掌握大模型应用生产实践的专业知识,提升在该领域的实操技能与理论水平,为职业发展增添助力。具…...
STM32 ZIBEE DL-20 无线串口模块
一.配置方法 二.串口中断 u8 i; u16 buf[20],res; u8 receiving_flag 0; // 新增一个标志,用于标记是否开始接收数组 void USART1_IRQHandler(void) {if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) //接收中断{res USART_ReceiveData(USART1);if(receiv…...
【算法基础】选择排序算法 - JAVA
一、算法基础 1.1 什么是选择排序 选择排序是一种简单直观的排序算法,它的工作原理是:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小…...
FastAPI 与数据库交互示例
目录 安装必要的包完整代码示例运行应用使用说明API 端点说明代码解析 下面将创建一个简单的 FastAPI 应用程序,演示如何与 SQLite 数据库进行交互。这个例子包括创建、读取、更新和删除(CRUD)操作。 安装必要的包 首先,需要安装…...
(六——下)RestAPI 毛子(Http resilience/Refit/游标分页)
文章目录 项目地址一、Refit1.1 安装需要的包1.2 创建接口IGitHubApi1.3 创建RefitGitHubService1. 实现接口2. 注册服务 1.4 修改使用方法 二、Http resilience2.1 安装所需要的包2.2 创建resilience pipeline简单版2.3 创建全局的resilience处理1. 创建清理全局ResilienceHan…...
Rust 学习笔记:关于枚举与模式匹配的练习题
Rust 学习笔记:关于枚举与模式匹配的练习题 Rust 学习笔记:关于枚举与模式匹配的练习题以下程序能否通过编译?若能,输出是什么?考虑这两种表示结果类型的方式,若计算成功,则包含值 T;…...
父子组件双向绑定
v-model 语法糖实现 vue中我们在input中可以直接使用v-model来完成双向绑定,这个时候 v-model 通常会帮我们完成两件事: v-bind:value的数据绑定@input的事件监听如果我们现在封装了一个组件,其他地方在使用这个组件时,是否也可以使用v-model来同时完成这两个功能呢? 当我…...
系统思考与第一性原理
最近一直有客户提到“第一性原理”,希望借此穿透纷繁复杂的现象,看清事情的本质。我第一反应是:这与系统思考中的冰山模型不谋而合。 冰山模型中提到:我们看到的只是表面事件,事件背后有趋势,趋势背后有结…...
基于Redis实现-UV统计
基于Redis实现-UV统计 本文将使用HyperLogLog来实现UV统计。 首先我们搞懂两个概念: UV:全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录一次…...
【iOS】类与对象底层探索
类与对象底层探索 Clang探索对象本质objc_setProperty源码探索cls与类的关联原理isa的类型isa_t原理探索 类&类的结构什么是元类NSObject到底有几个isa走位&继承关系图objc_class&objc_object 类结构分析计算cache类中的内存大小获取bits属性列表(prope…...
2025年- H18-Lc126-54.螺旋矩阵(矩阵)---java版
1.题目描述 2.思路* 思路1: 补充2: directions[1][0] // 表示“下”这个方向的行增量(1) directions[1][1] // 表示“下”这个方向的列增量(0) int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-…...
Paddle Serving|部署一个自己的OCR识别服务器
前言 之前使用C部署了自己的OCR识别服务器,Socket网络传输部分是自己写的,回过头来一看,自己犯傻了,PaddleOCR本来就有自己的OCR服务器项目,叫PaddleServing,这里记录一下部署过程。 1 下载依赖环境 1.1 …...
yolov5 本地训练
YOLOv5 | Kaggle 直接gitclone他的源码用Vscode看(也可以直接把jupyter下下来) 他要1.8,我的是2.7,他这个代码可能有点年头了 两年前了 他的环境 我的环境 我就是不懂为什么清华源的torch windows默认下出来是cpu版本 . 在终端…...
同城跑腿小程序帮取帮送接单抢单预约取件智能派单同城配送全开源运营版源码优创
一、源码描述 这是一套同城跑腿小程序,基于FastadminUniapp框架,全开源无加密,可私有化部署,包含用户端、骑手端和运营端(后端),支持帮取/帮送模式,支持一键接单/抢单,主…...
基于SpringBoot的药房药品销售管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
机器学习中的学习率及其衰减方法全面解析
摘要: 本文深入解析机器学习中的学习率及其衰减方法,涵盖学习率的作用、常用衰减参数及七种主流衰减策略(分段常数、指数、自然指数、多项式、余弦、线性余弦、噪声线性余弦)。通过公式推导与图示对比,揭示不同衰减方式…...