学习Flutter:搭建第一个 Flutter 应用
引言
曾几何时,我们还在为 Android 和 iOS 各写一套 UI 而头疼,做一个需求像是两家公司在竞争。但 Flutter 的出现,改变了这一切。它让跨平台开发变得可能,让一个程序员的代码可以同时运行在多个设备上,省时省力,效果炸裂。
本篇文章就是为了让更多开发者轻松起步,快速搭建第一个 Flutter 应用。我会从零开始,带你搭建环境,解析原理,再到实战案例,最后深度探讨 Flutter 的优缺点、性能评估,以及未来趋势。想学 Flutter 的朋友,这篇文章一定要收藏!
一、背景
Flutter 是 Google 开发的一款跨平台 UI 框架,支持 Android、iOS、Web 和桌面端开发。它基于 Dart 语言,使用 Skia 渲染引擎,实现高性能、流畅的 UI 体验。相比传统的原生开发,Flutter 具备以下特点:
- 一套代码,多端运行——一次开发,多端使用,减少重复劳动。
- 性能强悍——Flutter 使用自己的渲染引擎,性能逼近原生。
- 热重载(Hot Reload)——改代码不用重启 App,开发效率大大提升!
- 丰富的 UI 组件——Material 和 Cupertino 组件齐全,想做 iOS 风格还是 Android 风格,一行代码切换!
- 生态越来越强——Flutter 不仅仅是手机 App,现在还能跑在 Web 和桌面端,简直万能!
Flutter 就像编程界的瑞士军刀,给你带来意想不到的便捷。
二、概念
Flutter 的核心是Widget(组件),一切 UI 都是 Widget 组成的。你可以理解为乐高积木,页面上的任何一个按钮、文字、布局,甚至整个应用,都是一个个 Widget 组合而成的。
Flutter 的工作流程如下:
- Dart 代码:开发者写 Dart 代码,描述 UI 和逻辑。
- Flutter Framework:Flutter 框架解析代码,组织 Widget 树。
- Skia 引擎:Flutter 自带的 Skia 引擎负责绘制 UI,并传递给 GPU 渲染。
- 原生平台:最终通过 Android 和 iOS 的系统接口,把 UI 显示出来。
Flutter 的这种架构,让它可以做到跨平台一致性,同时保证流畅度,做到真正的"所见即所得"!
三、实现
1. 环境搭建
必备工具:
- Flutter SDK
- Dart SDK(Flutter 自带)
- Android Studio 或 VS Code(推荐)
- Android 或 iOS 模拟器
- 电脑(Windows/Mac/Linux 都可)
2. 安装 Flutter
# 下载 Flutter SDK
git clone https://github.com/flutter/flutter.git -b stable
# 配置环境变量
export PATH="$PATH:`pwd`/flutter/bin"
# 检查安装情况
flutter doctor
如果 flutter doctor
输出全绿,说明安装成功!
3. 创建项目
flutter create my_first_app
cd my_first_app
flutter run
如果看到 “Hello, world!”,恭喜你,Flutter 成功跑起来了!
四、项目实战
好的!我将提供 3 个 Flutter 实战项目,包括详细的代码和实现过程,每个项目都能直接在编译工具上运行。
项目 1:计数器应用(Hello World 进阶版)
目标
创建一个 计数器应用,用户可以点击按钮增加计数,并能重置计数。
主要技术点
StatefulWidget
组件的使用setState
更新 UIMaterial UI
基本布局
完整代码
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false,home: CounterScreen(),);}
}class CounterScreen extends StatefulWidget { _CounterScreenState createState() => _CounterScreenState();
}class _CounterScreenState extends State<CounterScreen> {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}void _resetCounter() {setState(() {_counter = 0;});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Flutter 计数器")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text("当前计数:", style: TextStyle(fontSize: 20)),Text("$_counter", style: TextStyle(fontSize: 40, fontWeight: FontWeight.bold)),Row(mainAxisAlignment: MainAxisAlignment.center,children: [ElevatedButton(onPressed: _incrementCounter, child: Text("增加")),SizedBox(width: 10),ElevatedButton(onPressed: _resetCounter, child: Text("重置")),],)],),),);}
}
运行效果
- 点击 “增加” 按钮,计数值 +1
- 点击 “重置” 按钮,计数归零
项目 2:待办事项(Todo)应用
目标
实现一个 待办事项(Todo)应用,支持:
- 添加任务
- 删除任务
- 持久化存储
主要技术点
ListView
列表TextEditingController
处理输入SharedPreferences
存储数据
完整代码
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false,home: TodoScreen(),);}
}class TodoScreen extends StatefulWidget { _TodoScreenState createState() => _TodoScreenState();
}class _TodoScreenState extends State<TodoScreen> {List<String> _tasks = [];TextEditingController _controller = TextEditingController();void initState() {super.initState();_loadTasks();}void _loadTasks() async {SharedPreferences prefs = await SharedPreferences.getInstance();setState(() {_tasks = (prefs.getStringList('tasks') ?? []);});}void _saveTasks() async {SharedPreferences prefs = await SharedPreferences.getInstance();prefs.setStringList('tasks', _tasks);}void _addTask() {if (_controller.text.isEmpty) return;setState(() {_tasks.add(_controller.text);_controller.clear();});_saveTasks();}void _removeTask(int index) {setState(() {_tasks.removeAt(index);});_saveTasks();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("待办事项")),body: Column(children: [Padding(padding: EdgeInsets.all(10),child: Row(children: [Expanded(child: TextField(controller: _controller,decoration: InputDecoration(hintText: "输入任务"),),),IconButton(icon: Icon(Icons.add), onPressed: _addTask),],),),Expanded(child: ListView.builder(itemCount: _tasks.length,itemBuilder: (context, index) {return ListTile(title: Text(_tasks[index]),trailing: IconButton(icon: Icon(Icons.delete, color: Colors.red),onPressed: () => _removeTask(index),),);},),),],),);}
}
运行效果
- 输入任务后点击 “+” 按钮,任务会加入列表
- 点击任务右侧的 垃圾桶 按钮,即可删除任务
- 关闭应用后再次打开,任务仍然存在(已存储)
项目 3:天气预报应用
目标
实现一个 天气预报应用,展示某个城市的天气情况。
主要技术点
http
请求 APIjson
解析数据FutureBuilder
处理异步数据
完整代码
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false,home: WeatherScreen(),);}
}class WeatherScreen extends StatefulWidget { _WeatherScreenState createState() => _WeatherScreenState();
}class _WeatherScreenState extends State<WeatherScreen> {String city = "Shenzhen";Map<String, dynamic>? weatherData;Future<void> fetchWeather() async {final apiKey = "YOUR_API_KEY"; // 需替换为自己的 API Keyfinal url = Uri.parse("https://api.openweathermap.org/data/2.5/weather?q=$city&appid=$apiKey&units=metric");final response = await http.get(url);if (response.statusCode == 200) {setState(() {weatherData = json.decode(response.body);});}}void initState() {super.initState();fetchWeather();}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("天气预报")),body: Center(child: weatherData == null? CircularProgressIndicator(): Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text("${weatherData!['name']} 的天气", style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),Text("${weatherData!['main']['temp']}°C", style: TextStyle(fontSize: 40)),Text("${weatherData!['weather'][0]['description']}", style: TextStyle(fontSize: 20)),],),),);}
}
运行效果
- 启动应用后,会自动获取深圳的天气数据
- 数据显示:城市名称、温度、天气描述
- 数据源:调用
OpenWeatherMap API
获取实时天气
这三个项目展示了 Flutter 的核心开发能力,你可以在此基础上扩展功能,比如:
- 计数器 App 添加计时器功能
- Todo App 使用数据库存储数据
- 天气 App 增加定位功能
五、问题解决,容易踩的坑
- 安装 Flutter 时报错:可能是网络问题,可以尝试 VPN 或者换清华源。
- iOS 模拟器不能运行:需要 macOS 和 Xcode,Windows 用户无解。
- 热重载失效:可能是 StatefulWidget 没有正确更新 setState()。
- 插件不兼容:有些插件可能不支持 Web 或桌面端,要查看官方文档。
六、优缺点
优点:
- 开发效率高,热重载太爽了!
- 跨平台一致性好,UI 统一。
- 生态越来越强,社区活跃。
缺点:
- 体积较大,Flutter App 相比原生略胖。
- iOS 支持相对弱,某些系统 API 需要手动桥接。
- Dart 生态较小,不如 JavaScript 和 Python 热门。
七、性能
Flutter 的渲染性能比 React Native 高,但比原生略低。在 60FPS 条件下,Flutter 的 CPU 负载大约是原生的 1.2 倍,内存占用稍高。不过,得益于 Skia 引擎,Flutter 能在大多数设备上保持流畅度。
八、展望
Google 正在加速 Flutter 的发展,未来会在桌面端和 Web 端更加强大。同时,Flutter 3.0 可能会带来更低的内存占用、更高的性能,以及更好的插件生态。
总结
Flutter 是一个极具潜力的跨平台开发框架,它的出现降低了开发成本,提高了开发效率。如果你还没用过 Flutter,不妨试试,可能会爱上它!
参考资料
- Flutter 官网:https://flutter.dev
- Dart 语言:https://dart.dev
- 《Flutter in Action》
🚀 欢迎关注 GongZhongHao,码农的乌托邦,程序员的精神家园! 🚀
相关文章:
学习Flutter:搭建第一个 Flutter 应用
引言 曾几何时,我们还在为 Android 和 iOS 各写一套 UI 而头疼,做一个需求像是两家公司在竞争。但 Flutter 的出现,改变了这一切。它让跨平台开发变得可能,让一个程序员的代码可以同时运行在多个设备上,省时省力&…...
lua实现面向对象(封装/继承/多态)
lua实现面向对象封装/继承/多态 lua实现面向对象(封装/继承/多态) lua实现面向对象(封装/继承/多态) print("***********面向对象**********") print("*************封装************") --表就是表现类的一种形式 --实现了new方法:本质上是创建一个空表&a…...
WX小程序
下载 package com.sky.utils;import com.alibaba.fastjson.JSONObject; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.Cl…...
【模拟面试】计算机考研复试集训(第十一天)
文章目录 前言一、专业面试1、什么是面向对象编程?2、软件工程的主要模型有哪些?3、Cache和寄存器的区别4、卷积层有哪些参数,它们代表什么?5、你有读博的打算吗?6、你的师兄/姐临近毕业,仍做不出成果&…...
【深度技术揭秘】 Android SystemUI锁屏界面动态布局重构:横竖屏智能适配指南
1. 问题背景与需求拆解 在Android 13系统定制中,发现平板横屏锁屏界面存在两大视觉问题: 时钟控件尺寸过大,与竖屏样式不统一 解锁图标位置异常,横向居中而非顶部居中(如图示) 需实现: 横竖屏…...
AI比人脑更强,因为被植入思维模型【20】卡尼曼双系统理论
定义 卡尼曼双系统理论思维模型是由诺贝尔经济学奖得主丹尼尔卡尼曼提出的,该理论认为人类的思维系统可以分为两个相互关联但又具有不同特点的子系统,即系统1(快思考)和系统2(慢思考)。系统1是基于直觉、经…...
修改服务器windows远程桌面默认端口号
修改服务器windows远程桌面默认端口号 在Windows服务器上修改远程桌面协议(RDP)的默认端口(3389)可以增强服务器的安全性,减少被恶意扫描和攻击的风险。以下是修改远程端口的详细步骤: 按 Win R 打开运行…...
3.22模拟面试
前端模拟面试(1 年经验) 面试时长:40-60 分钟 面试难度:初中级 技术栈:Vue 3、TypeScript、微前端(qiankun)、Webpack/Rspack、Ant Design、组件库迁移 一、基础知识 HTML & CSS 介绍一下…...
MySQL高频八股——索引
大家好,我是钢板兽! 今天来更新MySQL高频八股的最后一篇文章,包括很多内容:索引分类、最左匹配原则、范围查询使联合索引失效、索引下推、给联合查询加索引、索引失效情况。 在MySQL的第一篇八股文章,我写了MySQL的索…...
二分查找(java)
文章目录 1. 基本原理2. 步骤3.练习 1. 基本原理 二分查找(Binary Search)是一种基于分治思想的高效搜索算法,核心逻辑是通过不断缩小搜索区间来定位目标值。其前提是数据必须为有序数组,时间复杂度为 O(log n)。 2. 步骤 1.…...
2025_0321_生活记录
刚刚写完待会儿早上要汇报的文档,看了一眼时间,现在已经是凌晨2点多了。一直说要早睡,但是一直都没做到。。。算了,不苛求自己了。 昨天是春分,春分秋分,昼夜平分。不知不觉就到春天了,但房间里…...
【LangChain入门 6 Chain组件】单链和多链
一、单链 1.1 LCEL的语法 | 为关键字,使用 | 作为链接符号 from langchain_core.output_parsers import StrOutputParser from langchain_ollama import ChatOllama llm ChatOllama( model"deepseek-r1:7b") parser StrOutputParser() # 加了这段后&…...
决策树基础
决策树 定义 从根节点开始,也就是拥有全部的数据,找一个维度对根节点开始划分, 划分后希望数据整体的信息熵是最小的, 针对划分出来的两个节点,我们继续重复刚才的划分方式寻找信息熵最小的维度和阈值。 递归这个…...
MATLAB+Arduino控制小车直行+转向
1 硬件 两轮车arduino板子 硬件连接 注意:电机连线。 这个小车的电机电流小,可以用arduino板子直接驱动,如果是大电流的,需要你自带电池,供电用用你的电池(如移动电源),控制信号&…...
【uni-app】引用公共组件
目录 一、建立公共组件 1.1新建vue文件 1.2编写公共文件代码 1.3使用 注意事项 一、建立公共组件 1.1新建vue文件 在公共组件文件目录下新建所需要的功能文件 1.2编写公共文件代码 按需求写对应功能的代码 1.3使用 在需要使用的文件下引用公共组件 注意事项 想要使用s…...
六西格玛遇上Python:统计学的高效实践场
在当今数据驱动的时代,数据分析和可视化工具成为了各行业优化流程、提升质量的关键手段。六西格玛(Six Sigma)作为一种以数据为基础、追求完美质量的管理理念,其实施依赖于一系列基础工具的灵活运用。而Python,凭借其强…...
虚幻基础:UI
文章目录 控件蓝图可以装载其他控件蓝图可以安装其他蓝图接口 填充:相对于父组件填充水平框尺寸—填充—0.5:改变填充的尺寸填充—0.5:改变与父组件的距离 锚点:相对于父组件的控件坐标系原点,屏幕比例改变时ÿ…...
事件、页面跳转、wxml语法——微信小程序学习笔记
1. 事件 1.1 事件绑定 <!--pages/infoPage/infoPage.wxml--><button type"primary" bind:tap"childrenClicked">子按钮</button> // pages/infoPage/infoPage.jsPage({childrenClicked(){console.log("childrenClicked")} …...
关于kafka的一些知识总结
Kafka 1. 基本知识 1.1 前置知识 topic表示一个类型/业务的数据的组为方便扩展,提高吞吐率,一个topic分为多个partition。配合分区的设计,提出消费者组的概念,每个消费者并行消费,同时,一个分区的数据&a…...
系统架构书单推荐(一)领域驱动设计与面向对象
本文主要是个人在学习过程中所涉猎的一些经典书籍,有些已经阅读完,有些还在阅读中。于我而言,希望追求软件系统设计相关的原则、方法、思想、本质的东西,并希望通过不断的学习、实践和积累,提升自身的知识和认知。希望…...
JS—原型与原型链:2分钟掌握原型链
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–原型三–原型链 二. 原型 什么是原型? 每个JavaScript对象都有一个原型,这个原型也是一个对象。比方说 function Person(name) {this.name name; } let person new Person(&quo…...
微软产品的专有名词和官方视频教程
Legend/Acronyms (D) Microsoft Documentation (V) Video (B) Blog (S) Site (IG)<...
OpenCV旋转估计(5)图像拼接的一个函数waveCorrect()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 waveCorrect 是OpenCV中用于图像拼接的一个函数,特别适用于全景图拼接过程中校正波浪形失真(Wave Correction)…...
基于3DMax与Vray引擎的轻量级室内场景渲染实践
欢迎踏入3DMAX室内渲染的沉浸式学习之旅!在这个精心设计的实战教程中,我们将携手揭开3DMAX与Vray这对黄金搭档在打造现实室内场景时的核心奥秘。无论您是渴望入门的3D新手,还是追求极致效果的专业设计师,这里都将为您呈现从场景蓝图构建到光影魔法施加的完整技术图谱。我们…...
项目日记 -云备份 -服务器配置信息模块
博客主页:【夜泉_ly】 本文专栏:【项目日记-云备份】 欢迎点赞👍收藏⭐关注❤️ 代码已上传 gitee 目录 前言配置信息文件文件配置类getInstance 获得实例readConfigFile 读取配置信息文件 测试 #mermaid-svg-ewlCpjdOf0q0VTLI {font-family:…...
Linux冯诺依曼体系与计算机系统架构认知(8)
文章目录 前言一、冯诺依曼体系冯•诺依曼体系结构推导内存提高冯•诺依曼体系结构效率的方法你用QQ和朋友聊天时数据的流动过程与冯•诺依曼体系结构相关的一些知识 二、计算机层次结构分析操作系统(Operator System)驱动层的作用与意义系统调用接口(system call)用户操作接口…...
23.linux下电脑健康检查
电脑健康检查 硬盘 工具 sudo apt-get install smartmontools检查命令 sudo smartctl -a /dev/sdb1输出结果 # smartctl 7.2 2020-12-30 r5155 [x86_64-linux-6.8.0-52-generic] (local build) # Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools…...
使用HAI来打通DeepSeek的任督二脉
一、什么是HAI HAI是一款专注于AI与科学计算领域的云服务产品,旨在为开发者、企业及科研人员提供高效、易用的算力支持与全栈解决方案。主要使用场景为: AI作画,AI对话/写作、AI开发/测试。 二、开通HAI 选择CPU算力 16核32GB,这…...
.NET 10 新的 JsonIgnoreCondition
Intro 之前提了一个 api 建议为 JsonIgnore 添加两个扩展,WhenReading 和 WhenWriting,主要的一个用例是 WhenReading 我们的 Api Response 里有一个字段非常的大,不需要在 response 里包含,但是从 json 里反序列化时时需要地所以不能简单地直接忽略,在使用 Newtonsoft.J…...
数据结构——哈夫曼编码、哈夫曼树
1 哈夫曼树、哈夫曼编码 定义 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 层,叶结点到根结点的路径长度为叶结点的层数&…...
MySQL 调优:查询慢除了索引还能因为什么?
文章目录 情况一:连接数过小情况二:Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么?MySQL 查询慢,我们一般也会想到是因为索引,但除了索引还有哪些原因会导致数据库查询变慢呢? 以下以 MySQL 中一条 S…...
数据库锁机制
一、数据库锁的分类 数据库锁机制根据不同的维度可分为多种类型: 按锁的粒度划分: 行级锁(Row-Level Lock):锁定单行数据,粒度最细,并发度高,如InnoDB引擎的行锁。表级锁(Table-Level Lock):锁定整张表,并发度低,如MyISAM引擎的表锁。页级锁(Page-Level Lock):…...
计算机二级web易错点(6)-选择题
在软件或系统的三层架构中,三层分别为表示层、逻辑层(业务逻辑层)和数据访问层。表示层主要负责与用户交互,展示数据和接收用户输入;逻辑层处于中间位置,负责处理业务逻辑,对表示层传来的请求进…...
深入理解 lt; 和 gt;:HTML 实体转义的核心指南!!!
🛡️ 深入理解 < 和 >:HTML 实体转义的核心指南 🛡️ 在编程和文档编写中,< 和 > 符号无处不在,但它们也是引发语法错误、安全漏洞和渲染混乱的头号元凶!🔥 本文将聚焦 <&#…...
windows环境下NER Python项目环境配置(内含真的从头安的perl配置)
注意 本文是基于完整项目的环境配置,即本身可运行项目你拿来用 其中有一些其他问题,知道的忽略即可 导入pycharm基本包怎么下就不说了(这个都问?给你一拳o(`ω*)o) 看perl跳转第5条 1.predict报错多个设备…...
Redis + 布隆过滤器解决缓存穿透问题
Redis 布隆过滤器解决缓存穿透问题 1. Redis 布隆过滤器解决缓存穿透问题 📌 什么是缓存穿透? 缓存穿透指的是查询的数据既不在缓存,也不在数据库,导致每次查询都直接访问数据库,增加数据库压力。 例如࿱…...
2025年3月 CCF GESP C++ 二级 真题解析
1. 单选题(每题2分,共30分) 第1题 试题:2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人,入了全球票房榜。下面关于DeepSeek与《哪吒2》的描述成立的是( )。 A. 《哪吒2》是一…...
回顾Python基础语法,辨析和C++等的不同~
由于很多院校的计科尤其软工专业在本科期间会设置大量有关不同编程语言的语法基础课,虽然整体来看大同小异,但还是有些细节在不同语言有所差异:比如分号在C和Java必须加,Python和JavaScript则不必,而在Matlab中加入则不…...
ubuntu设置开机自动运行应用
系统版本:Ubuntu 24.04.1 LTS桌面版 按招网上的资料显示,当前版本主要的实现方式有以下两种, 方式1:通过图形界面的【启动应用程序】设置开机自启动;方式2:配置为服务实现开机自启动。 但是在我的电脑上方…...
2024年MathorCup数学建模D题量子计算在矿山设备配置及运营中的建模应用解题文档与程序
2024年第十四届MathorCup高校数学建模挑战赛 D题 量子计算在矿山设备配置及运营中的建模应用 原题再现: 随着智能技术的发展,智慧矿山的概念越来越受到重视。越来越多的设备供应商正在向智慧矿山整体解决方案供应商转型,是否具备提供整体解…...
MCU vs SoC
MCU(Microcontroller Unit,单片机)和SoC(System on Chip,片上系统)是两种不同的芯片类型,尽管它们都实现了高度集成,但在设计目标、功能复杂性和应用场景上存在显著差异。以下是两者…...
我的uniapp自定义模板
uniapp自定义模板 如有纰漏请谅解,以官方文档为准后面这段时间我会学习小程序开发的知识,会持续更新可以查看我的github,后续我会上传我的uniapp相关练习代码有兴趣的话可以浏览我的个人网站,我会在上面持续更新内容,…...
JVM 类加载器之间的层次关系,以及类加载的委托机制
JVM 类加载器之间存在一种层次关系,通常被称为双亲委派模型 (Parent Delegation Model)。这种层次关系和委托机制是 Java 类加载机制的核心,对于保证 Java 程序的安全性和避免类冲突至关重要。 1. 类加载器的层次关系: JVM 中的类加载器(Cl…...
吞吐与时延的博弈,超发与冗余的交换
做传输协议加速,大家默认激进超发原则,却认为冗余双发不道德,其实这两个是一回事,它们本质上是一种 “矩” 内的交换,就像力和力臂交换但乘积不变一样,成本是固定的。 人们更能原谅激进超发是因为人们对吞…...
Jackson使用ObjectNode对象实现JSON对象数据(一):增、删、改、查
Jackson 是一款高性能的 Java JSON 处理库,广泛应用于 Java 对象的序列化(转为JSON)与反序列化(JSON转为对象)。作为 Spring MVC 默认的JSON解析器,其核心优势包括高性能、灵活性和丰富的功能支持。 Jackson 库中 ObjectNode 是操作 JSON 对象的核心类,…...
【递归、搜索和回溯算法】专题三 :穷举VS暴搜VS深搜VS回溯VS剪枝
回溯算法 回溯算法是一种经典的递归算法,通常用于解决组合问题、排列问题和搜索问题等。 基本思想:从一个初始状态开始,按照一定的规则向前搜索,当搜索到某个状态无法前进时,回退到钱一个状态,再按照其他的…...
Ubuntu如何部署AI-Sphere-Butler(metahuman-stream)
环境: Ubuntu 20.04、22.04 Python3.10 Pytorch 1.12 CUDA 11.3 问题描述: Ubuntu如何部署AI-Sphere-Butler(metahuman-stream(LiveTalking)) 解决方案: 一、部署 本次部署以云服务器&a…...
基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手
基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手 一、准备工作:组装你的"数码工具箱" 1. 安装基础工具(Python环境) 操作步骤: 访问Python官网下载安装包安装时务必勾选Add Python to…...
SpringBoot分布式定时任务实战:告别重复执行的烦恼
场景再现:你刚部署完基于SpringBoot的集群服务,凌晨3点突然收到监控告警——优惠券发放量超出预算两倍!检查日志发现,两个节点同时执行了定时任务。这种分布式环境下的定时任务难题,该如何彻底解决? 本文将…...
第十二章 | Solidity 智能合约前后端集成实战
📚 第十二章 | Solidity 智能合约前后端集成实战 ——链上合约 前端钱包 用户交互,打造完整 DApp! 这章我们正式进入 DApp 全栈开发领域! 用 Ethers.js React/Vue 完成前端和合约交互完整的「前端发起交易 → 钱包签名 → 链上…...