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

Flutter小白入门指南

Flutter小白入门指南 🚀

在这里插入图片描述


轻松构建漂亮的跨平台应用

📑 目录

  • 一、Flutter是什么?
    • 为什么选择Flutter?
    • Flutter工作原理
  • 二、环境搭建与命令行
    • 安装Flutter SDK
    • 常用Flutter命令
    • 创建第一个项目
  • 三、Flutter基础语法
    • 变量与类型
    • 函数
    • 条件与循环
    • 列表与映射
  • 四、Flutter核心API详解
    • 核心API分类
    • 基础组件详解
    • 布局组件详解
    • 导航与路由
    • 状态管理
    • 网络请求
  • 五、实用技巧
    • 热重载
    • 调试技巧
    • 性能优化
    • 常见问题解决
  • 六、学习资源

一、Flutter是什么? 🤔

Flutter是Google开发的UI工具包,让你可以用一套代码同时开发iOS、Android、Web、桌面应用。Flutter使用Dart语言,提供丰富的预制组件,并拥有高性能的渲染引擎,使应用运行流畅自然。

Flutter学习路径图

你可以使用以下Mermaid代码在Mermaid Live Editor生成图片后添加到文章中:

Flutter基础
Dart语言
UI组件
布局系统
状态管理
网络请求
本地存储
路由导航
测试与调试
第三方集成
性能优化
应用发布
第一阶段: 入门基础
第二阶段: 进阶开发
第三阶段: 高级应用

第一阶段:入门基础
Flutter基础 → Dart语言 → UI组件 → 布局系统

第二阶段:进阶开发
状态管理 → 网络请求 → 本地存储 → 路由导航

第三阶段:高级应用
测试与调试 → 第三方集成 → 性能优化 → 应用发布


*Flutter开发完整学习路径,从基础知识到应用发布的全过程*### 为什么选择Flutter?**✨ 一次编写,跨平台运行**  
同一套代码可以在iOS、Android、Web和桌面平台运行,大幅节省开发时间和维护成本**🎨 精美的UI和流畅的动画**  
Flutter内置丰富的Material Design和Cupertino风格组件,支持60fps的流畅动画效果**⚡ 热重载开发体验**  
代码修改后秒级刷新,无需重启应用,大大提升开发效率和调试体验**🚀 接近原生的性能**  
Flutter不依赖平台原生组件,使用自己的渲染引擎直接绘制UI,性能接近原生应用<p align="center"><strong>Flutter工作原理
</strong><br><img src="https://i-blog.csdnimg.cn/direct/1514cb8004294947bfb859cf77f1b895.png#pic_center" alt="Flutter架构图"><br><em>Flutter使用自己的高性能渲染引擎Skia,直接控制屏幕上的每个像素,不依赖原生组件</em>
</p>> 💡 **初学者提示**:Flutter就像一个"画笔",可以在各个平台上画出完全一样的界面,而且性能和体验媲美原生应用!---## 二、环境搭建与命令行 🛠️### 安装Flutter SDK在开始开发之前,你需要安装Flutter SDK。以下是各平台的安装步骤:**Windows安装**1. 下载Flutter SDK压缩包
2. 解压到无空格的路径(如 C:\flutter)
3. 将flutter\bin目录添加到环境变量Path
4. 运行flutter doctor检查配置**macOS安装**1. 使用Homebrew安装:

brew install --cask flutter

2. 或下载SDK压缩包并解压
3. 添加到PATH:

export PATH=“$PATH:pwd/flutter/bin”

4. 运行flutter doctor检查配置**Linux安装**1. 下载Flutter SDK
2. 解压:

tar xf flutter_linux_*.tar.xz

3. 添加到PATH:

export PATH=“$PATH:pwd/flutter/bin”

4. 运行flutter doctor检查配置安装完成后,运行以下命令检查环境:```bash
flutter doctor -v

这个命令会详细检查你的环境,并指出需要解决的问题。

常用Flutter命令

Flutter命令行工具功能强大,以下是你需要掌握的常用命令:

命令说明常用选项/示例
flutter create创建新项目flutter create --org com.example myapp
flutter run运行应用flutter run -d chrome(在Chrome中运行)
flutter build构建发布版本flutter build apk --split-per-abi(优化APK大小)
flutter analyze代码分析flutter analyze --no-fatal-infos
flutter test运行测试flutter test test/widget_test.dart
flutter pub get获取依赖flutter pub get
flutter clean清理项目flutter clean
flutter doctor环境诊断flutter doctor -v(详细信息)
flutter devices查看可用设备flutter devices
flutter emulators管理模拟器flutter emulators --launch Pixel_4
flutter channel切换Flutter版本通道flutter channel stable
flutter upgrade升级Flutterflutter upgrade
flutter config配置Flutterflutter config --enable-web

创建第一个项目

# 创建新项目
flutter create my_first_app# 进入项目目录
cd my_first_app# 运行项目
flutter run

成功运行后,你会看到Flutter默认的计数器应用,这是一个简单的示例,展示了如何创建一个有状态的Flutter应用。

💻 开发环境推荐
推荐使用以下IDE进行Flutter开发,它们都有官方插件支持:

  • Visual Studio Code + Flutter插件
  • Android Studio + Flutter插件
  • IntelliJ IDEA + Flutter插件

三、Flutter基础语法 📝

Flutter使用Dart语言编写。Dart是一种强类型、面向对象的编程语言,语法类似JavaScript和Java,学习曲线较为平缓。

变量与类型

// 声明变量(Dart能自动推断类型)
var name = '张三';     // 字符串
var age = 25;         // 整数
var height = 1.75;    // 浮点数
var isStudent = true; // 布尔值// 也可以明确指定类型
String country = '中国';
int year = 2023;
double price = 99.9;
bool isActive = false;// 定义一个不会改变的值
final birthday = '1998-01-01';  // 运行时常量
const PI = 3.14159;             // 编译时常量// 空安全(Dart 2.12以上版本)
String? nullableName;           // 可以为null
String nonNullableName = '李四';  // 不能为null

函数

函数是执行特定任务的代码块:

// 简单函数
void sayHello() {print('你好,Flutter!');
}// 带参数的函数
void greet(String name) {print('你好,$name!');  // 使用$插入变量
}// 有返回值的函数
int add(int a, int b) {return a + b;
}// 箭头函数(单行函数的简写)
int multiply(int a, int b) => a * b;// 可选参数
void introduce(String name, {int? age, String country = '中国'}) {print('我叫$name,${age != null ? '$age岁,' : ''}来自$country');
}// 调用带可选参数的函数
introduce('王五', age: 30);  // 输出:我叫王五,30岁,来自中国

条件与循环

// if条件语句
if (age >= 18) {print('成年人');
} else if (age >= 13) {print('青少年');
} else {print('儿童');
}// switch语句
switch (grade) {case 'A':print('优秀');break;case 'B':print('良好');break;default:print('其他');
}// for循环
for (int i = 0; i < 5; i++) {print('第$i次循环');
}// while循环
int count = 0;
while (count < 3) {print('count: $count');count++;
}// do-while循环
int number = 1;
do {print('number: $number');number++;
} while (number <= 3);// 遍历列表
List<String> fruits = ['苹果', '香蕉', '橙子'];
for (var fruit in fruits) {print('我喜欢吃$fruit');
}// 使用forEach方法
fruits.forEach((fruit) => print('水果:$fruit'));

列表与映射

// 列表(数组)
List<String> hobbies = ['读书', '游泳', '旅行'];
hobbies.add('烹饪');    // 添加元素
print(hobbies[0]);     // 访问元素:读书
print(hobbies.length); // 列表长度:4// 不可变列表
final constList = const ['春', '夏', '秋', '冬'];// 映射(字典)
Map<String, dynamic> person = {'name': '李四','age': 30,'isMarried': true
};
print(person['name']);           // 李四
person['occupation'] = '工程师';  // 添加新键值对// 列表操作
var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map((num) => num * 2).toList();  // [2, 4, 6, 8, 10]
var evens = numbers.where((num) => num % 2 == 0).toList();  // [2, 4]

⭐ Dart语言小贴士
Dart是强类型语言,但有类型推断功能,所以代码既安全又简洁。它支持面向对象编程、异步编程和空安全,是专为UI开发优化的语言。

Dart的优势:

  • 支持JIT(即时编译)和AOT(提前编译)
  • 出色的异步支持(async/await)
  • 内置空安全(Null Safety)
  • 强大的集合操作API

四、Flutter核心API详解 📚

Flutter的强大之处在于其丰富的组件库。下面我们按功能分类详细介绍最常用的API。

核心API分类

分类主要API用途
基础组件Text, Image, Icon, Button应用界面的基本构建块
布局组件Row, Column, Stack, Container控制界面布局和排列
导航组件Navigator, AppBar, TabBar实现页面导航和路由管理
输入组件TextField, Checkbox, Switch用户输入和表单控制
信息展示Card, ListTile, GridView展示列表和卡片内容
动画AnimatedContainer, Hero创建流畅的过渡和动画效果
用户交互GestureDetector, InkWell处理点击、滑动等用户输入
异步与网络Future, Stream, http网络请求和异步操作

🧩 基础组件详解

在Flutter中,一切都是Widget(组件)!把Widget想象成乐高积木,通过组合不同的积木,你可以搭建出完整的应用界面。

🔤 文本相关组件

Text - 显示文本

Text('这是一段文本',style: TextStyle(fontSize: 18.0,              // 字体大小fontWeight: FontWeight.bold, // 字体粗细color: Colors.blue,          // 文字颜色letterSpacing: 1.0,          // 字母间距),textAlign: TextAlign.center,   // 文本对齐方式maxLines: 2,                   // 最大行数overflow: TextOverflow.ellipsis, // 溢出处理
)

RichText - 富文本

RichText(text: TextSpan(style: TextStyle(color: Colors.black),children: [TextSpan(text: '你好,'),TextSpan(text: 'Flutter',style: TextStyle(fontWeight: FontWeight.bold,color: Colors.blue,),),TextSpan(text: '!'),],),
)
🖼️ 图片相关组件

Image - 显示图片

// 从网络加载图片
Image.network('https://example.com/image.jpg',width: 200,                   // 宽度height: 150,                  // 高度fit: BoxFit.cover,            // 填充模式loadingBuilder: (context, child, progress) {// 加载中显示进度指示器return progress == null ? child : CircularProgressIndicator();},
)// 从本地加载图片
Image.asset('assets/images/logo.png',width: 100,height: 100,
)
🔘 按钮相关组件

ElevatedButton - 凸起按钮

ElevatedButton(onPressed: () {// 点击时的处理函数print('按钮被点击');},style: ElevatedButton.styleFrom(backgroundColor: Colors.blue,  // 背景色foregroundColor: Colors.white, // 前景色padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10,),shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8),),),child: Text('点击我'),
)

TextButton - 文本按钮

TextButton(onPressed: () {print('文本按钮被点击');},child: Text('取消'),
)

IconButton - 图标按钮

IconButton(icon: Icon(Icons.favorite),color: Colors.red,onPressed: () {print('收藏');},
)
📝 输入相关组件

TextField - 文本输入框

TextField(decoration: InputDecoration(labelText: '用户名',           // 标签文本hintText: '请输入用户名',      // 提示文本prefixIcon: Icon(Icons.person), // 前缀图标border: OutlineInputBorder(),  // 边框样式),keyboardType: TextInputType.text, // 键盘类型obscureText: false,               // 是否隐藏文本onChanged: (value) {// 当文本改变时print('当前输入: $value');},
)

Checkbox - 复选框

Checkbox(value: true,        // 选中状态onChanged: (value) {// 状态变化处理},
)

📐 布局组件详解

Flutter布局系统非常强大灵活,以下是最常用的布局组件:

🏗️ 基础布局组件
组件名称用途常用属性
Container矩形视觉元素,可设置装饰、边距等width, height, padding, margin, decoration
Row水平排列子组件mainAxisAlignment, crossAxisAlignment, children
Column垂直排列子组件mainAxisAlignment, crossAxisAlignment, children
Stack层叠排列子组件alignment, fit, children
Expanded填充所有可用空间flex, child
Padding在子组件周围添加填充padding, child
Center将子组件居中显示child
Row(行布局)示例
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,  // 主轴对齐方式crossAxisAlignment: CrossAxisAlignment.center,      // 交叉轴对齐方式children: [Text('左侧'),Text('中间'),Text('右侧'),],
)
Column(列布局)示例
Column(mainAxisAlignment: MainAxisAlignment.center,   // 主轴对齐方式crossAxisAlignment: CrossAxisAlignment.start,  // 交叉轴对齐方式children: [Text('第一行'),Text('第二行'),Text('第三行'),],
)
Container(容器)示例
Container(width: 200,height: 100,margin: EdgeInsets.all(10),  // 外边距padding: EdgeInsets.all(15),  // 内边距decoration: BoxDecoration(color: Colors.blue,borderRadius: BorderRadius.circular(10),  // 圆角boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.5),spreadRadius: 5,blurRadius: 7,offset: Offset(0, 3),),],),child: Text('漂亮的容器',style: TextStyle(color: Colors.white, fontSize: 18),),
)

📱 页面与导航API

Flutter应用通常由多个页面组成,需要在它们之间导航。

Scaffold - 页面脚手架
Scaffold(appBar: AppBar(title: Text('页面标题'),actions: [IconButton(icon: Icon(Icons.search),onPressed: () {},),],),body: Center(child: Text('页面内容'),),floatingActionButton: FloatingActionButton(onPressed: () {},child: Icon(Icons.add),),drawer: Drawer(// 侧边抽屉菜单内容child: ListView(children: [DrawerHeader(decoration: BoxDecoration(color: Colors.blue),child: Text('菜单头部'),),ListTile(title: Text('菜单项1'),onTap: () {},),],),),bottomNavigationBar: BottomNavigationBar(items: [BottomNavigationBarItem(icon: Icon(Icons.home),label: '首页',),BottomNavigationBarItem(icon: Icon(Icons.business),label: '商务',),],currentIndex: 0,onTap: (index) {},),
)
页面导航方法
// 跳转到新页面
Navigator.push(context,MaterialPageRoute(builder: (context) => SecondPage()),
);// 返回上一页
Navigator.pop(context);// 替换当前页面
Navigator.pushReplacement(context,MaterialPageRoute(builder: (context) => NewPage()),
);// 跳转到新页面并等待结果
final result = await Navigator.push(context,MaterialPageRoute(builder: (context) => SelectionPage()),
);

📊 常用列表组件

ListView - 列表视图
// 基本列表
ListView(children: [ListTile(leading: Icon(Icons.map),title: Text('地图'),),ListTile(leading: Icon(Icons.photo),title: Text('相册'),),ListTile(leading: Icon(Icons.phone),title: Text('电话'),),],
)// 动态列表
ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return ListTile(title: Text(items[index]),);},
)
GridView - 网格视图
GridView.count(crossAxisCount: 2,  // 每行的列数children: List.generate(6, (index) {return Card(child: Center(child: Text('项目 $index'),),);}),
)

🌐 网络请求API

Flutter使用http包进行网络请求:

import 'package:http/http.dart' as http;
import 'dart:convert';// 获取数据示例
Future<void> fetchData() async {final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));if (response.statusCode == 200) {// 请求成功,解析JSONfinal data = jsonDecode(response.body);print('标题: ${data['title']}');} else {// 请求失败print('请求失败,状态码: ${response.statusCode}');}
}// 发送数据示例
Future<void> sendData() async {final response = await http.post(Uri.parse('https://jsonplaceholder.typicode.com/posts'),headers: {'Content-Type': 'application/json; charset=UTF-8',},body: jsonEncode({'title': '测试标题','body': '测试内容','userId': 1,}),);if (response.statusCode == 201) {// 创建成功print('发送成功: ${response.body}');} else {// 请求失败print('发送失败: ${response.statusCode}');}
}

📌 API使用提示
Flutter的组件使用声明式UI模式,你需要描述想要的UI状态,而不是命令式地操作UI元素。习惯这种思维方式后,开发效率会大大提高。

🔄 无状态与有状态Widget

Flutter中有两种主要类型的Widget:

StatelessWidget(无状态组件)

  • 一旦创建,内容不会改变
  • 适用于静态内容
  • 例如:文本、图标、固定布局
class MyText extends StatelessWidget {final String text;MyText(this.text);Widget build(BuildContext context) {return Text(text);}
}

StatefulWidget(有状态组件)

  • 内容可以改变
  • 适用于动态内容
  • 例如:复选框、滑块、表单
class Counter extends StatefulWidget {_CounterState createState() => _CounterState();
}class _CounterState extends State<Counter> {int count = 0;void increment() {setState(() {count++;  // 更新状态});}Widget build(BuildContext context) {return Column(children: [Text('计数: $count'),ElevatedButton(onPressed: increment,child: Text('增加'),),],);}
}

常用Flutter包

以下是一些常用的Flutter官方和社区包:

包名用途链接
http网络请求pub.dev/packages/http
provider状态管理pub.dev/packages/provider
shared_preferences本地数据存储pub.dev/packages/shared_preferences
sqfliteSQLite数据库pub.dev/packages/sqflite
path_provider文件系统路径pub.dev/packages/path_provider
image_picker图片选择器pub.dev/packages/image_picker
url_launcher打开URLpub.dev/packages/url_launcher
flutter_local_notifications本地通知pub.dev/packages/flutter_local_notifications
font_awesome_flutter图标库pub.dev/packages/font_awesome_flutter
intl国际化和本地化pub.dev/packages/intl

✨ 简单实例:创建一个完整界面

下面是一个结合多种组件的示例:

import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(title: '我的Flutter应用',theme: ThemeData(primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,),home: MyHomePage(),);}
}class MyHomePage extends StatefulWidget {_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {final List<String> todos = ['学习Flutter基础','完成UI设计','实现业务逻辑','测试应用功能','发布应用'];Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('我的待办事项'),actions: [IconButton(icon: Icon(Icons.refresh),onPressed: () {ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('刷新成功!')));},),],),body: Column(children: [Padding(padding: EdgeInsets.all(16.0),child: Card(elevation: 4.0,child: Padding(padding: EdgeInsets.all(16.0),child: Text('今日任务:完成Flutter学习',style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),),),),),Expanded(child: ListView.builder(itemCount: todos.length,itemBuilder: (context, index) {return ListTile(leading: CircleAvatar(child: Text('${index + 1}'),),title: Text(todos[index]),trailing: Icon(Icons.arrow_forward),onTap: () {// 点击事件处理showDialog(context: context,builder: (context) {return AlertDialog(title: Text('任务详情'),content: Text('你选择了: ${todos[index]}'),actions: [TextButton(onPressed: () {Navigator.of(context).pop();},child: Text('关闭'),),],);},);},);},),),],),floatingActionButton: FloatingActionButton(onPressed: () {// 添加新任务},child: Icon(Icons.add),tooltip: '添加新任务',),);}
}

【待办事项应用界面】
上面代码会显示一个具有AppBar、Card、ListView和浮动按钮的待办事项应用


五、实用技巧 💡

热重载(Hot Reload)

Flutter的热重载功能是开发者的福音!当你修改代码后,不需要重启应用,只需保存文件(在大多数IDE中按Ctrl+S),就能立即看到更改效果。

🔥 小白提示:使用热重载,你可以像调整网页CSS一样快速调整Flutter UI,大大提高开发效率!

调试技巧

  1. 使用print输出调试信息

    print('当前值: $value');
    
  2. 使用debugPrint输出调试信息(更安全)

    import 'package:flutter/foundation.dart';debugPrint('这是调试信息');
    
  3. 使用Flutter DevTools

    • 这是一个强大的调试工具,可以检查UI布局、性能和内存使用情况
    • 在VSCode或Android Studio中启动DevTools

相关文章:

Flutter小白入门指南

Flutter小白入门指南 &#x1f680; 轻松构建漂亮的跨平台应用 &#x1f4d1; 目录 一、Flutter是什么&#xff1f; 为什么选择Flutter&#xff1f;Flutter工作原理 二、环境搭建与命令行 安装Flutter SDK常用Flutter命令创建第一个项目 三、Flutter基础语法 变量与类型函数条…...

Python -将MP4文件转为GIF图片

给大家提供一个工具代码&#xff0c;使用Python&#xff0c;将MP4格式的视频文件&#xff0c;转换为GIF图片 首先先安装必要的包&#xff1a; pip install imageio pip install imageio[ffmpeg] 工具代码&#xff1a; import imageio# 视频文件路径 video_path r""…...

51c嵌入式~电路~合集27

我自己的原文哦~ 一、7805应用电路 简介 如上图&#xff0c;7805 集成稳压电路。 7805是串联式三端稳压器&#xff0c;三个端口分别是电压输入端&#xff08;IN&#xff09;&#xff0c;地线&#xff08;GND&#xff09;&#xff0c;稳压输出&#xff08;OUT&#xff09;…...

数据结构—(链表,栈,队列,树)

本文章写的比较乱&#xff0c;属于是缝合怪&#xff0c;很多细节没处理&#xff0c;显得粗糙&#xff0c;日后完善&#xff0c;今天赶时间了。 1. 红黑树的修复篇章 2. 红黑树的代码理解&#xff08;部分写道注释之中了&#xff09; 3. 队列与栈的代码 4. 重要是理解物理逻辑&a…...

GitHub 趋势日报 (2025年05月12日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1harry0703/MoneyPrinterTurbo利用ai大模型&#xff0c;一键生成高清短视频使用…...

ebook2audiobook开源程序使用动态 AI 模型和语音克隆将电子书转换为带有章节和元数据的有声读物。支持 1,107+ 种语言

​一、软件介绍 文末提供程序和源码下载 ebook2audiobook开源程序使用动态 AI 模型和语音克隆将电子书转换为带有章节和元数据的有声读物。支持 1,107 种语言。从电子书到带有章节和元数据的有声读物的 CPU/GPU 转换器&#xff0c;使用 XTTSv2、Bark、Vits、Fairseq、YourTTS …...

《算法导论(第4版)》阅读笔记:p39-p48

《算法导论(第4版)》学习第 13 天&#xff0c;p39-p48 总结&#xff0c;总计 10 页。 一、技术总结 1. recurrence/recurrence equation 书里面 recurrence(递归式) 和 recurrence equation(递归方程) 指的是同一个东西。 二、英语总结(生词&#xff1a;2) 1. squint (1)…...

c语言第一个小游戏:贪吃蛇小游戏07

贪吃蛇吃饭喽 所谓贪吃蛇的食物&#xff0c;也就是创建一个和蛇身一样的结构体&#xff0c;只是这个结构体不是链表&#xff0c;也是将这个结构体设置hang和lie坐标&#xff0c;放进gamepic进行扫描&#xff0c;扫到了就也是做操作将 ## 打出来 #include <curses.h> #i…...

(七)深度学习---神经网络原理与实现

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.神经网络原理概述 二.神经网络的训练方法 三.基于Ker…...

VSCode中Node.js 使用教程

一、visual studio code下载与安装 二、修改vscode主题颜色 三、汉化 菜单view-->Command Palette...,输入Configure Display Language。 重启之后如下&#xff1a; 四、安装node.js Node.js 是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;使用了事件驱动、非阻…...

web 自动化之 KDT 关键字驱动详解

一、什么是关键字驱动&#xff1f; 1、什么是关键字驱动&#xff1f;&#xff08;以关键字函数驱动测试&#xff09; 关键字驱动又叫动作字驱动&#xff0c;把项目业务封装成关键字函数&#xff0c;再基于关键字函数实现自动化测试 2、关键字驱动测试原理 关键字驱动测试是一…...

web 自动化之 yaml 数据/日志/截图

文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dirdef read_yaml(key,file_name"test_datas.yaml"):file_path os.path.join(Dir.testcases_dir, file_…...

基于javaweb的SpringBoot酒店管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

数学复习笔记 6

前言 复习一下行列式的一些基本的题。感觉网课有点没跟上了。今天花点时间跟上网课的进度。要紧跟进度&#xff0c;然后剩下的时间再去复习前面的内容。多复习&#xff0c;提升自己的解题能力。 行列式和矩阵 三年级&#xff0c;我现在是三年级下册。。。马上就要结束大学的…...

JS Map使用方法

JS Map使用方法 Map 是 ES6 引入的一种新的数据结构&#xff0c;它类似于对象&#xff08;Object&#xff09;&#xff0c;但提供了更强大的键值对存储功能。 文章目录 JS Map使用方法基本特性基本用法创建 Map常用方法遍历方法 与 Object 的区别实际应用示例示例1&#xff1a…...

大模型分布式光伏功率预测实现详解

一、引言 随着全球能源结构向可再生能源转型,光伏发电作为清洁能源的重要组成部分,其装机容量持续快速增长。然而,光伏发电具有显著的间歇性和波动性特点,给电力系统的稳定运行带来了巨大挑战。准确的光伏功率预测对于电网调度、电力市场交易和电站运营管理至关重要。近年…...

武汉大学无人机视角下的多目标指代理解新基准!RefDrone:无人机场景指代表达理解数据集

作者&#xff1a;Zhichao Sun, Yepeng Liu, Huachao Zhu, Yuliang Gu, Yuda Zou, Zelong Liu, Gui-Song Xia, Bo Du, Yongchao Xu 单位&#xff1a;武汉大学计算机学院 论文标题&#xff1a;RefDrone: A Challenging Benchmark for Drone Scene Referring Expression Compreh…...

【LLM模型】如何构建自己的MCP Server?

什么是 MCP&#xff1f; Model Context Protocol (MCP) 是一种协议&#xff0c;它允许大型语言模型&#xff08;LLMs&#xff09;访问自定义的工具和服务。Trae 中的智能体作为 MCP 客户端可以选择向 MCP Server 发起请求&#xff0c;以使用它们提供的工具。你可以自行添加 MC…...

SQL 索引优化指南:原理、知识点与实践案例

SQL 索引优化指南&#xff1a;原理、知识点与实践案例 索引的基本原理 索引是数据库中用于加速数据检索的数据结构&#xff0c;类似于书籍的目录。它通过创建额外的数据结构来存储部分数据&#xff0c;使得查询可以快速定位到所需数据而不必扫描整个表。 索引的工作原理 B-…...

java基础-方法的重写、super关键字

1.定义&#xff1a;子类可以根据需要改写从父类那继承来的方法&#xff0c;执行时&#xff0c;子类的方法会覆盖父类的方法 2.要求&#xff1a; &#xff08;1&#xff09;子类和父类的方法必须同名&#xff0c;同参数列表 &#xff08;2&#xff09;父类中private修饰的方法…...

技术并不能产生一个好的产品

技术是产生一个好的产品充分条件&#xff0c;不是必要条件。 当笔者到了40岁的年龄时间&#xff0c;发现再怎么努力提升技术&#xff0c;也没办法挽救烂的产品设计。 一个好的产品&#xff0c;首先要找准自己的定位&#xff0c;不能动不动就把自己拿一线品牌来比较。 好的产品…...

lubuntu 系统详解

Lubuntu 系统详解&#xff1a;轻量高效的 Ubuntu 衍生版 一、系统概述 定位与背景&#xff1a; Lubuntu 是 Ubuntu 的官方衍生版本&#xff08;Flavor&#xff09;&#xff0c;专注于轻量性与高效性&#xff0c;旨在为低配置设备&#xff08;如老旧电脑、上网本、低配笔记本 …...

《设备管理与维修》审核严吗?“修改后再投”是拒稿了吗?

有过论文投稿经验的朋友&#xff0c;可能在审核后收到过“修改后再投”的回复。有些期刊可能是真的建议投稿人在修改后再投稿&#xff0c;有些则可能是标准的拒稿模板。 《设备管理与维修》审核严吗&#xff1f;收到“修改后再投”的回复该怎么办&#xff1f;下面我就来分享下之…...

2025年5月-信息系统项目管理师高级-软考高项一般计算题

决策树和期望货币值 加权算法 自制和外购分析 沟通渠道 三点估算PERT 当其他条件一样时&#xff0c;npv越大越好...

界面组件DevExpress WPF中文教程:Grid - 如何自定义Band Header外观?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

Supabase 的入门详细介绍

Supabase 是什么&#xff1f; 简单来说&#xff0c;Supabase 是一个开源的 Firebase 替代品。它提供了一整套后端即服务 (BaaS - Backend as a Service) 的工具&#xff0c;让你能够快速构建应用程序的后端&#xff0c;而无需自己从头搭建和管理服务器、数据库等基础设施。 S…...

【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)

&#x1f680;&#x1f527;【实战】基于 ABP vNext 构建高可用 S7 协议采集平台&#xff08;西门子 PLC 通信全流程&#xff09;&#x1f4ca; &#x1f4d1; 目录 &#x1f680;&#x1f527;【实战】基于 ABP vNext 构建高可用 S7 协议采集平台&#xff08;西门子 PLC 通信全…...

20、map和set、unordered_map、un_ordered_set的复现

一、map 1、了解 map的使用和常考面试题等等&#xff0c;看这篇文章 map的key是有序的 &#xff0c;值不可重复 。插入使用 insert的效率更高&#xff0c;而在"更新map的键值对时&#xff0c;使用 [ ]运算符效率更高 。" 注意 map 的lower和upper那2个函数&#x…...

leetcode 189. 轮转数组

题目描述 代码&#xff1a; class Solution { public:void rotate(vector<int>& nums, int k) {int len nums.size();k k % len;reverse(nums,0,len-1);reverse(nums,0,k-1);reverse(nums,k,len-1);}void reverse(vector<int>& nums,int left,int right…...

得物0509面试手撕题目解答

题目 使用两个栈&#xff08;一个无序栈和一个空栈&#xff09;将无序栈中的元素转移到空栈&#xff0c;使其有序&#xff0c;不允许使用其他数据结构。 示例&#xff1a;输入&#xff1a;[3, 1, 6, 4, 2, 5]&#xff0c;输出&#xff1a;[6, 5, 4, 3, 2, 1] 思路与代码 如…...

8天Python从入门到精通【itheima】-6~10

目录 7节-开发出第一个Python程序&#xff1a; 1.在cmd窗口写下第一个最简单的程序&#xff1a;Hello World!!! 9节&#xff1a; 1.如何卸载python&#xff1a; 2.报错&#xff1a;不是可运行的程序 ​编辑 3.报错&#xff1a;无法初始化设备PRN&#xff1a; 4.报错&…...

Qt —— 使用Enigma Virtual Box将Qt程序打包为独立可运行exe(附:完整打包方法且完美运行)

🔔 Qt 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 打包结果 1、如下图,准备好Qt已打包后程序文件夹。附 Qt —— 在Windows下打包Qt应用程序(在其他Windows电脑下使用)...

大语言模型RLHF训练框架全景解析:OpenRLHF、verl、LLaMA-Factory与SWIFT深度对比

引言 随着大语言模型&#xff08;LLM&#xff09;参数规模突破千亿级&#xff0c;基于人类反馈的强化学习&#xff08;RLHF&#xff09;成为提升模型对齐能力的关键技术。OpenRLHF、verl、LLaMA-Factory和SWIFT作为开源社区的四大标杆框架&#xff0c;分别通过分布式架构、混合…...

VTK|类似CloudCompare的比例尺实现1-源码分析

文章目录 CloudCompare源码分析void ccGLWindowInterface::drawScale(const ccColor::Rgbub& color)&#x1f9e9; 总体功能&#x1f9e0; 函数逐步解析✅ 1. 断言只在正交模式下使用✅ 2. 计算显示的实际长度✅ 3. 字体和图形区域准备✅ 4. 计算比例尺图形的绘制位置✅ 5.…...

【计算机视觉】OpenCV实战项目:基于Tesseract与OpenCV的字符识别系统深度解析

基于Tesseract与OpenCV的字符识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理流水线1) 形态学操作2) 自适应阈值 2.2 Tesseract OCR引擎 3. 实战部署指南3.1 环境配置3.2 项目结构优化建议3.3 增强版代码实现 4. 常见问题与解决方案4.1 Tesseract路径错误4.2…...

CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开

苹果公司近日针对macOS系统中新披露的CVE-2025-31258漏洞发布补丁&#xff0c;该漏洞可能允许恶意应用程序突破沙箱限制&#xff0c;获取未授权的系统资源访问权限。在安全研究员Seo Hyun-gyu公开概念验证&#xff08;PoC&#xff09;利用代码后&#xff0c;该漏洞已在macOS Se…...

使用CAS操作实现乐观锁的完整指南

乐观锁是一种高效的并发控制机制&#xff0c;而CAS(Compare-And-Swap)是实现乐观锁的核心技术。下面我将详细介绍如何通过CAS操作实现乐观锁。 一、CAS操作原理 CAS(Compare-And-Swap)是一种原子操作&#xff0c;包含三个操作数&#xff1a; 内存位置(V)预期原值(A)新值(B) …...

java之网络编程

文章目录 网络编程概述什么是网络编程基本的通信架构CS架构BS架构 Java提供了哪些网络编程解决方案&#xff1f; 网络编程三要素IPIP地址IP域名&#xff08;Domain Name&#xff09;DNS域名解析&#xff08;Domain Name System&#xff09;公网IP、内网IP本机IPInetAddress类In…...

苍穹外卖--新增菜品

1.需求分析和设计 产品原型 业务规则&#xff1a; 菜品名称必须是唯一的 菜品必须属于某个分类下&#xff0c;不能单独存在 新增菜品时可以根据情况选择菜品的口味 每个菜品必须对应一张图片 接口设计&#xff1a; 根据类型查询分类(已完成) 文件上传 新增菜品 根据类型…...

Spark处理过程-转换算子

&#xff08;一&#xff09;RDD的处理过程 Spark使用Scala语言实现了RDD的API,程序开发者可以通过调用API对RDD进行操作处理。RDD的处理过程如图所示&#xff1b; RDD经过一系列的“转换”操作&#xff0c;每一次转换都会产生不同的RDD&#xff0c;以供给下一次“转换”操作使…...

运行Spark程序-在Spark-shell——RDD

一、基本概念 RDD&#xff08;弹性分布式数据集&#xff09;是 Apache Spark 的核心抽象&#xff0c;是 Spark 提供的最基本的数据处理单元。理解 RDD 的概念对于掌握 Spark 编程至关重要。以下是 RDD 的核心概念和特性&#xff1a; 1. 什么是 RDD&#xff1f; 定义&#xf…...

Qt应用程序启动时的一些思路:从单实例到性能优化的处理方案

程序启动时优化的价值 在桌面软件开发领域&#xff0c;应用程序的启动过程就像音乐的序曲&#xff0c;决定了用户对软件品质的第一印象。比如首次启动等待超过3秒时&#xff0c;会让大多数用户产生负面看法&#xff0c;而专业工具软件的容忍阈值甚至更低。Qt框架作为跨平台开发…...

vue3父子组件传值

父 → 子&#xff1a;props 父组件 <template><ChildComponent :message"parentMessage" :user"user" /> </template><script setup> import ChildComponent from ./ChildComponent.vue; const parentMessage Hello from paren…...

中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果

品牌&#xff0c;作为企业不可或缺的隐形财富&#xff0c;在当今竞争激烈的市场环境中&#xff0c;其构建与强化已成为推动企业持续繁荣的关键基石。为了更好地保护自主研发产品&#xff0c;激光院激光公司于2020年3月7日正式注册“风采”商标&#xff0c;创建拥有自主知识产权…...

合合信息上线智能文档处理领域首批MCP服务,助力企业快速搭建Agent

随着大模型及Agent技术的飞速发展&#xff0c;通过大模型调用外部工具正在成为AI应用开发的新范式。然而&#xff0c;由于不同大模型的调用结构和参数格式各异&#xff0c;开发者需要分别编写工具调用逻辑&#xff0c;AI工具集成效率低下&#xff0c;MCP&#xff08;Model Cont…...

佰力博科技与您探讨表面电阻的测试方法及应用领域

表面电阻测试是一种用于测量材料表面电阻值的技术&#xff0c;广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法&#xff1a; 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中&#xff0c;平行电极法通过在试样…...

【DeepSeek】判断两个 PCIe 设备是否属于**同一个 PCIe 子树

在 Linux 系统中&#xff0c;判断两个 PCIe 设备是否属于**同一个 PCIe 子树&#xff08;Subtree&#xff09;**是 P2P 通信的关键前提。以下是具体方法和步骤&#xff1a; 一、基本原理 两个 PCIe 设备属于同一子树的条件&#xff1a; 共享同一 Root Port&#xff1a;它们的…...

一份完整的高级前端性能优化手册

以下是一份完整的高级前端性能优化手册,涵盖核心原理、关键指标、优化策略及工具链,适合中大型项目深度优化: 高级前端性能优化手册 🚀 以用户体验为核心的极致性能实践 一、性能指标体系与度量 1. 核心性能指标 (Core Web Vitals) LCP (Largest Contentful Paint):最大…...

Leetcode 3543. Maximum Weighted K-Edge Path

Leetcode 3543. Maximum Weighted K-Edge Path 1. 解题思路2. 代码实现 题目链接&#xff1a;3543. Maximum Weighted K-Edge Path 1. 解题思路 这一题思路上就是一个遍历的思路&#xff0c;我们只需要考察每一个节点作为起点时&#xff0c;所有长为 k k k的线段的长度&…...

agentmain对业务的影响

前面一篇已经说了java agent技术主要有premain和agentmain两种形式&#xff0c;如果大部分业务已经在线上运行的话&#xff0c;不方便用premain的方式来实现&#xff0c;所以agentmain的方式是更加通用、灵活的 由于RASP是与用户业务运行在同一个jvm中的 &#xff0c;所以RASP…...