Flutter快速上手,入门教程
目录
一、参考文档
二、准备工作
下载Flutter SDK:
配置环境
解决环境报错 zsh:command not found:flutter
执行【flutter doctor】测试效果
安装Xcode IOS环境
需要安装brew,通过brew安装CocoaPods.
复制命令行,打开终端
分别执行下面命令
如图所示
三、创建Flutter IOS项目
Mac 创建Flutter IOS项目
通过 sudo chmod -R 777 * 修改一下文件权限
Xcode 打开Flutter项目
Android Studio创建Flutter项目
Flutter目录层级介绍
依赖库/图片的引用
pub包管理系统:
使用第三库,在官网找到对应的库
复制地方库的引用方式
四、Flutter简单应用
1.主题设置
1.1 定义主题数据
1.2 状态管理(以 Provider 为例)
1.3 在 MaterialApp 中应用主题
1.4 创建主题切换界面
2. 国际化
2.1 添加依赖
2.2 配置支持的语言
2.3 创建多语言资源文件
定义基础接口
实现英语资源
实现中文资源
创建本地化代理
在 UI 中使用本地化字符串
3. 相机相册调用
3.1 添加依赖
3.2 配置权限
iOS
Android
3.3 实现相机和相册功能
3.4 高级功能
拍摄视频
多选图片
五、Flutter 调用原生代码
基本原理
实现步骤
在 Flutter 端创建通道
在 Android 端实现(Kotlin)
在 iOS 端实现(Swift)
六、Flutter 打包工具
一、参考文档
API文档 | 链接 |
---|---|
Flutter地址 | https://docs.flutter.dev/ |
Homebrew地址 | https://brew.sh |
pub包管理系统 | The official repository for Dart and Flutter packages. |
Material Design官方Icons图标 | https://fonts.google.com/icons |
二、准备工作
-
升级Macos系统为最新系统
-
安装最新的Xcode
-
电脑上面需要安装brew https://brew.sh/
-
安装chrome浏览器(开发web用)
下载Flutter SDK:
FlutterSDK下载地址: https://docs.flutter.dev/get-started/install
常用编译软件:
-
Visual Studio Code with the Flutter extension for VS Code.
-
Android Studio with the Flutter plugin for IntelliJ.
-
IntelliJ IDEA with both the Flutter plugin for IntelliJ and the Android plugin for IntelliJ.
下载zip并解压到本地文件中
配置环境
-
打开命令行,执行【open ~/.bash_profile 】
-
把刚解压好的FlutterSDK文件地址进行配置,把内容粘贴到.bash_profile文件
export PATH="$PATH:/home/yourusername/flutter/bin"
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
3. 执行【source ~/.bash_profile 】,将.bash_profile文件生效
4. 执行【flutter doctor】测试效果。
注意哈:这样配置,如果你只有(bash_profile,没有zshrc文件)。
需要每次打开终端输入一下 source ~/.bash_profile 命令,再使用flutter命令。不然会报错。
zsh:command not found:flutter
像下面图片效果:
解决环境报错 zsh:command not found:flutter
1、执行:【open ~/.zshrc 】
2、如果 提示文件不存在,则执行:【vim ~/.zshrc 】新建一个新文件。
vim ~/.zshrc
再使用source命令重新加载一下:【source ~/.zshrc】,下次再编辑这个文件就可以直接执行:【open ~/.zshrc】
source ~/.zshrc
执行【flutter doctor】测试效果
这个时候试试关闭终端再输入flutter doctor,此时Flutter SDK配置完成,按照下面提示进行安装操作(下载Android SDK、Xcode、CocoaPods)。
安装Xcode IOS环境
需要安装brew,通过brew安装CocoaPods.
Homebrew官网: https://brew.sh/
复制命令行,打开终端
分别执行下面命令
brew install cocoapods.pod setupsudo xcode-select --switch /Applications/xcode.app/contents/Developersudo xcodebuild -runFirstLaunch
如图所示
brew doctor
三、创建Flutter IOS项目
Mac 创建Flutter IOS项目
sudo flutter create flutterdemo sudo chmod -R 777 flutterdemo //修改一下文件权限 可读。可写
通过 sudo chmod -R 777 * 修改一下文件权限
Xcode 打开Flutter项目
flutter run
flutter -d all
flutter -d chrome
Android Studio创建Flutter项目
Flutter目录层级介绍
依赖库/图片的引用
pub包管理系统:
官网地址:https://pub.dev/
使用第三库,在官网找到对应的库
复制地方库的引用方式
四、Flutter简单应用
1.主题设置
在 Flutter 项目里,实现主题切换功能需要结合状态管理和 Flutter 的主题系统。下面为你介绍实现主题切换的具体步骤:
1.1 定义主题数据
要先创建亮、暗两种主题,并且设置好各自的颜色和样式。
import 'package:flutter/material.dart';class AppThemes {static final lightTheme = ThemeData(brightness: Brightness.light,primaryColor: Colors.blue,scaffoldBackgroundColor: Colors.white,// 其他主题属性...);static final darkTheme = ThemeData(brightness: Brightness.dark,primaryColor: Colors.blue,scaffoldBackgroundColor: Colors.black,// 其他主题属性...);
}
1.2 状态管理(以 Provider 为例)
接着创建一个主题状态管理类,以此来保存和更新当前使用的主题。
import 'package:flutter/material.dart';class ThemeProvider with ChangeNotifier {ThemeMode _themeMode = ThemeMode.system;ThemeMode get themeMode => _themeMode;void toggleTheme(bool isDark) {_themeMode = isDark ? ThemeMode.dark : ThemeMode.light;notifyListeners();}void setSystemTheme() {_themeMode = ThemeMode.system;notifyListeners();}
}
1.3 在 MaterialApp 中应用主题
然后在应用的根 Widget 里配置主题,并监听主题变化。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';void main() {runApp(ChangeNotifierProvider(create: (context) => ThemeProvider(),child: const MyApp(),),);
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Consumer<ThemeProvider>(builder: (context, themeProvider, child) {return MaterialApp(title: 'Flutter Theme Demo',theme: AppThemes.lightTheme,darkTheme: AppThemes.darkTheme,themeMode: themeProvider.themeMode,home: const HomePage(),);},);}
}
1.4 创建主题切换界面
最后添加一个用于切换主题的 UI 组件,像开关或按钮。
class HomePage extends StatelessWidget {const HomePage({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {final themeProvider = Provider.of<ThemeProvider>(context);final isDark = themeProvider.themeMode == ThemeMode.dark;return Scaffold(appBar: AppBar(title: const Text('主题切换示例'),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [const Text('切换主题'),Switch(value: isDark,onChanged: (value) {themeProvider.toggleTheme(value);},),],),),);}
}
2. 国际化
在 Flutter 项目中设置国际化需要配置多语言资源并确保应用能根据系统语言自动切换。以下是实现步骤:
2.1 添加依赖
在pubspec.yaml
中添加flutter_localizations
和intl
插件:
dependencies:flutter:sdk: flutterflutter_localizations:sdk: flutterintl: ^0.18.1 # 最新版本
2.2 配置支持的语言
在MaterialApp
中指定支持的语言列表和本地化代理:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter 国际化示例',// 支持的语言列表supportedLocales: [Locale('en', 'US'), // 英语Locale('zh', 'CN'), // 中文// 添加更多语言...],// 本地化代理localizationsDelegates: [AppLocalizations.delegate, // 自定义代理GlobalMaterialLocalizations.delegate, // Material组件本地化GlobalWidgetsLocalizations.delegate, // 小部件库本地化GlobalCupertinoLocalizations.delegate, // Cupertino组件本地化],// 根据系统语言自动选择localelocaleResolutionCallback: (locale, supportedLocales) {for (var supportedLocale in supportedLocales) {if (supportedLocale.languageCode == locale?.languageCode) {return supportedLocale;}}return supportedLocales.first; // 默认返回第一个支持的语言},home: const HomePage(),);}
}
2.3 创建多语言资源文件
创建一个抽象类定义所有翻译键,并为每种语言创建实现类:
定义基础接口
// lib/l10n/app_localizations.dart
import 'package:flutter/material.dart';abstract class AppLocalizations {static AppLocalizations of(BuildContext context) {return Localizations.of<AppLocalizations>(context, AppLocalizations)!;}static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate();// 定义翻译键String get appTitle;String greeting(String name);// 添加更多翻译...
}
实现英语资源
// lib/l10n/app_localizations_en.dart
class AppLocalizationsEn extends AppLocalizations {@overrideString get appTitle => 'Flutter Internationalization';@overrideString greeting(String name) => 'Hello, $name!';
}
实现中文资源
// lib/l10n/app_localizations_zh.dart
class AppLocalizationsZh extends AppLocalizations {@overrideString get appTitle => 'Flutter 国际化';@overrideString greeting(String name) => '你好,$name!';
}
创建本地化代理
// lib/l10n/app_localizations.dart (继续)
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {const _AppLocalizationsDelegate();@overridebool isSupported(Locale locale) => ['en', 'zh'].contains(locale.languageCode);@overrideFuture<AppLocalizations> load(Locale locale) async {switch (locale.languageCode) {case 'en':return AppLocalizationsEn();case 'zh':return AppLocalizationsZh();default:return AppLocalizationsEn(); // 默认使用英语}}@overridebool shouldReload(_AppLocalizationsDelegate old) => false;
}
在 UI 中使用本地化字符串
// lib/home_page.dart
import 'package:flutter/material.dart';class HomePage extends StatelessWidget {const HomePage({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {final localizations = AppLocalizations.of(context);return Scaffold(appBar: AppBar(title: Text(localizations.appTitle),),body: Center(child: Text(localizations.greeting('World')),),);}
}
3. 相机相册调用
在 Flutter 中调用相机和相册功能,需要使用image_picker
插件。以下是完整实现步骤:
3.1 添加依赖
在pubspec.yaml
中添加依赖:
dependencies:flutter:sdk: flutterimage_picker: ^1.0.2 # 最新版本
然后执行flutter pub get
安装。
3.2 配置权限
iOS
在ios/Runner/Info.plist
中添加:
<key>NSCameraUsageDescription</key>
<string>应用需要访问相机来拍摄照片</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>应用需要访问相册来选择照片</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>应用需要保存照片到相册</string>
Android
在android/app/src/main/AndroidManifest.xml
中添加:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Android 10及以下需要 -->
3.3 实现相机和相册功能
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';class CameraGalleryExample extends StatefulWidget {@override_CameraGalleryExampleState createState() => _CameraGalleryExampleState();
}class _CameraGalleryExampleState extends State<CameraGalleryExample> {final ImagePicker _picker = ImagePicker();XFile? _pickedImage;// 从相机拍摄照片Future<void> _takePhoto() async {try {final XFile? photo = await _picker.pickImage(source: ImageSource.camera);if (photo != null) {setState(() {_pickedImage = photo;});}} catch (e) {print('Error taking photo: $e');// 显示错误提示ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('拍照失败: $e')),);}}// 从相册选择照片Future<void> _selectFromGallery() async {try {final XFile? image = await _picker.pickImage(source: ImageSource.gallery);if (image != null) {setState(() {_pickedImage = image;});}} catch (e) {print('Error selecting image: $e');// 显示错误提示ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('选择图片失败: $e')),);}}
}
3.4 高级功能
拍摄视频
Future<void> _recordVideo() async {final XFile? video = await _picker.pickVideo(source: ImageSource.camera);if (video != null) {// 处理视频}
}
多选图片
Future<void> _selectMultipleImages() async {final List<XFile>? images = await _picker.pickMultiImage();if (images != null && images.isNotEmpty) {// 处理多张图片}
}
五、Flutter 调用原生代码
在 Flutter 中调用原生代码(如 Android 的 Java/Kotlin 或 iOS 的 Swift/Objective-C)需要使用 平台通道(Platform Channel)。以下是主要实现方式:
基本原理
MethodChannel 是 Flutter 与原生平台(Android、iOS)之间进行通信的一种机制,属于 Flutter 提供的三种通信通道之一(另外两种是 BasicMessageChannel 和 EventChannel)。它允许 Flutter 代码调用原生代码的方法,也允许原生代码调用 Flutter 代码的方法,实现双向通信。
实现步骤
在 Flutter 端创建通道
import 'package:flutter/services.dart';class DeviceInfo {static const MethodChannel _channel = MethodChannel('com.example.device_info');// 获取设备信息static Future<Map<String, dynamic>> getInfo() async {try {final Map<dynamic, dynamic> result = await _channel.invokeMethod('getDeviceInfo');return Map<String, dynamic>.from(result);} on PlatformException catch (e) {throw Exception('Failed to get device info: ${e.message}');}}Future<void> _fetchDeviceInfo() async {try {final info = await DeviceInfo.getInfo();setState(() {_deviceInfo = info;});} catch (e) {print('Error: $e');}}
}
在 Android 端实现(Kotlin)
package com.example.device_infoimport android.os.Build
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Resultclass DeviceInfoPlugin : FlutterPlugin, MethodCallHandler {private lateinit var channel: MethodChanneloverride fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {channel = MethodChannel(flutterPluginBinding.binaryMessenger, "com.example.device_info")channel.setMethodCallHandler(this)}override fun onMethodCall(call: MethodCall, result: Result) {if (call.method == "getDeviceInfo") {val deviceInfo = mutableMapOf<String, Any>()// 添加设备信息deviceInfo["model"] = Build.MODELdeviceInfo["brand"] = Build.BRANDdeviceInfo["device"] = Build.DEVICEdeviceInfo["androidVersion"] = Build.VERSION.RELEASEdeviceInfo["sdkInt"] = Build.VERSION.SDK_INTresult.success(deviceInfo)} else {result.notImplemented()}}override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {channel.setMethodCallHandler(null)}
}package com.example.my_appimport io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import com.example.device_info.DeviceInfoPluginclass MainActivity : FlutterActivity() {override fun configureFlutterEngine(flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)// 注册插件flutterEngine.plugins.add(DeviceInfoPlugin())}
}
在 iOS 端实现(Swift)
import Flutter
import UIKitpublic class DeviceInfoPlugin: NSObject, FlutterPlugin {public static func register(with registrar: FlutterPluginRegistrar) {let channel = FlutterMethodChannel(name: "com.example.device_info",binaryMessenger: registrar.messenger())let instance = DeviceInfoPlugin()registrar.addMethodCallDelegate(instance, channel: channel)}public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {if call.method == "getDeviceInfo" {let device = UIDevice.currentlet info = ["model": device.model,"systemName": device.systemName,"systemVersion": device.systemVersion,"localizedModel": device.localizedModel,"name": device.name]result(info)} else {result(FlutterMethodNotImplemented)}}
}import UIKit
import Flutter@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {override func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// 注册插件GeneratedPluginRegistrant.register(with: self)return super.application(application, didFinishLaunchingWithOptions: launchOptions)}
}
六、Flutter 打包工具
相关文章:

Flutter快速上手,入门教程
目录 一、参考文档 二、准备工作 下载Flutter SDK: 配置环境 解决环境报错 zsh:command not found:flutter 执行【flutter doctor】测试效果 安装Xcode IOS环境 需要安装brew,通过brew安装CocoaPods. 复制命令行,打开终端 分别执行…...

算法:前缀和
1.【模版】前缀和 【模板】前缀和_牛客题霸_牛客网 这道题如果使用暴力解法时间复杂度为O(n*m),会超时,所以要使用前缀和算法。 前缀和->快速求出数组中某一个连续区间的和。 第一步:预处理出一个前缀和数组 dp。 dp[i]表示[1, i] 区间…...

DEVICENET转MODBUS TCP网关与AB数据输出模块的高效融合方案研究
在工业自动化领域,多样化的设备通常采用不同的通信协议,这为系统集成带来了显著的挑战。特别是在需要将遵循DeviceNet协议的设备与基于MODBUS TCP协议的系统进行互连时,这一挑战尤为突出。AB数据输出作为一种功能卓越的DeviceNet分布式输入/输…...
牛客小白月赛113
前言:这场的E题补的我头皮都发麻了。 A. 2025 题目大意:一个仅有‘-’‘*’组成的字符串,初始有一个sum 1, 从左到右依次遍历字符串,遇到-就让sum--;遇到*就让sum* 2,问sum有没有可能大于等于…...

Mac版本Android Studio配置LeetCode插件
第一步:Android Studio里面找到Settings,找到Plugins,在Marketplace里面搜索LeetCode Editor。 第二步:安装对应插件,并在Tools->LeetCode Plugin页面输入帐号和密码。 理论上,应该就可以使用了。但是&a…...

电子电路基础1(杂乱)
电路基础知识 注意:电压源与电流源的表现形式 注意:在同一根导线上电势相等 电阻电路的等效变换 电子元器件基础 电阻...
rocketmq延迟消息的底层原理浅析
rocketmq延迟消息的底层原理 消息实体 延时消息是指允许消息在指定延迟时间后才被消费者消费 Apache RocketMQ 中,消息的核心实体类是 org.apache.rocketmq.common.message.Message public class Message implements Serializable {private String topic; …...

【openssl】升级为3.3.1,避免安全漏洞
本文档旨在形成 对Linux系统openssl版本进行升级 的搭建标准操作过程,搭建完成后,实现 openssl 达到3.3以上版本,避免安全漏洞 效果。 一、查看当前版本 版本不高于3.1的,均需要升级。 # 服务器上运行以下命令,查看…...

使用 HTML +JavaScript 从零构建视频帧提取器
在视频编辑、内容分析和多媒体处理领域,常常需要从视频中提取关键帧。手动截取不仅效率低下,还容易遗漏重要画面。本文介绍的视频帧提取工具通过 HTML5 技术栈实现了一个完整的浏览器端解决方案,用户可以轻松选择视频文件并进行手动或自动帧捕…...
基于若依前后分离版-用户密码错误锁定
sys_config配置参数 user.password.maxRetryCount:最大错误次数 user.password.lockTime:锁定时长 //SysLoginController//登录 PostMapping("/login") public AjaxResult login(RequestBody LoginBody loginBody) {AjaxResult ajax AjaxR…...

论文速读《DexWild:野外机器人策略的灵巧人机交互》
项目链接:https://dexwild.github.io/ 论文链接:https://arxiv.org/pdf/2505.07813 0. 简介 2025年5月,卡内基梅隆大学(CMU)发布了一篇突破性论文《DexWild: Dexterous Human Interactions for In-the-Wild Robot Pol…...

Bug问题
一、list 页面 import React, { useEffect, useState } from react; import { shallowEqual, useHistory, useSelector } from dva; import { Button, message } from choerodon-ui/pro; import formatterCollections from hzero-front/lib/utils/intl/formatterCollections; …...

【数据结构】5. 双向链表
文章目录 一、链表的分类1、双向链表的结构 二、双向链表的实现0、准备工作1、初始化2、打印3、尾插4、头插5、尾删6、头删7、查找8、在指定位置之后插入数据9、删除指定位置10、销毁 一、链表的分类 链表总共分为8种,具体的分组方式如图所示: 带头指的…...

【Linux手册】冯诺依曼体系结构
目录 前言 五大组件 数据信号 存储器(内存)有必要吗 常见面试题 前言 冯诺依曼体系结构是当代计算机基本架构,冯诺依曼体系有五大组件,通过这五大组件直观的描述了计算机的工作原理;学习冯诺依曼体系可以让给我们更…...

Mobile App UI自动化locator
在开展mobile app UI层自动化测试时,编写目标元素的locator是比较耗时的一个环节,弄清楚locator背后的逻辑,可以有效降低UI层测试维护成本。此篇博客以webdriverioappium作为UI自动化工具为例子,看看有哪些selector方法࿰…...
PaloAlto-Expedition OS命令注入漏洞复现(CVE-2025-0107)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 前…...

(LeetCode 每日一题) 1061. 按字典序排列最小的等效字符串 (并查集)
题目:1061. 按字典序排列最小的等效字符串 思路:使用并查集,来将等价的字符连起来,形成一棵树。这棵树最小的字母,就代表整颗树,时间复杂度0(n),细节看注释。 C版本: class Solutio…...

linux 安装mysql8.0;支持国产麒麟,统信uos系统
一:使用我已经改好的mysql linux mysql8.0解压可用,点我下载 也在国产麒麟系统,统信uos系统也测试过,可用; 下载后,上传mysql.tar.gz 然后使用root角色去执行几个命令即可;数据库密码…...

C#实现远程锁屏
前言 这是一次提前下班没有锁屏进而引发的一次思考后的产物,思考的主要场景是当人离开电脑后,怎么能控制电脑锁屏,避免屏幕上的聊天记录被曝光。 首先想到通过系统的电源计划设置闲置超时时间熄屏,这可能是最接近场景的解决方案&a…...
历史记录隐藏的安全风险
引言 在数字化生活与工作场景中,历史记录功能广泛存在于浏览器、办公软件、移动应用等各类平台。它通过记录用户的搜索内容、操作痕迹、访问路径等信息,为用户提供便捷的操作体验和个性化服务。然而,这种看似便利的功能背后,却隐藏…...

SpringBoot3整合MySQL8的注意事项
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 注意事项 1、请添加添加如下依赖: <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><…...
网络安全大模型理解
一、网络安全大模型的概述 网络安全大模型是一种用于识别和应对各种网络安全威胁的模型。它通过分析网络数据包、网络行为等信息,识别潜在的网络安全事件,并采取相应的措施进行防御。网络安全大模型主要包括以下几个部分: 1. 数据预处理&am…...

智语心桥:当AI遇上“星星的孩子”,科技如何点亮沟通之路?
目录: 引言:当科技的温度,遇见“星星的孩子”“智语心桥”:一座为孤独症儿童搭建的AI沟通之桥核心技术探秘:AI如何赋能“读心”与“对话”?个性化魔法:AI如何实现“千人千面”的精准干预?应用场景畅想:从家庭到机构,AI的全方位支持为什么是“智语心桥”?——价值、可…...

itop-3568开发板机器视觉opencv开发手册-图像绘制-画线
本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\11”目录下,如下图所示: cv2.line 函数功能: 绘制一条直线。 函数原型: cv2.line(img,pt1,pt2,color,thicknessNone,lin…...
【高频面试题】快慢指针及相关应用
文章目录 1 简介2 相关应用3 相关题目4 典型例题4.1 判断链表是否有环4.2 寻找链表的入环点4.3 寻找链表的中点4.4 寻找链表的倒数第k个节点4.5 重排链表 (反转链表找链表中点合并链表)4.6 寻找重复数(快慢指针 or 二分)4.7 回文链…...

sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境
sudo docker exec -it backend bash🔍 总体作用 这条命令的作用是: 以交互方式(interactive)进入名为 backend 的正在运行的 Docker 容器的命令行环境。 你会进入容器的“终端”,就像登录到一个 Linux 系统一样&#…...
[论文阅读] 人工智能 | 当AI遇见绿色软件工程:可持续AI实践的研究新方向
【论文解读】当AI遇见绿色软件工程:可持续AI实践的研究新方向 论文信息 作者:Maja H. Kirkeby, Enrique Barba Roque, Justus Bogner等 标题:Greening AI-enabled Systems with Software Engineering: A Research Agenda for Environment…...
[论文阅读] 人工智能 | 用大语言模型抓虫:如何让网络协议实现与RFC规范对齐
用大语言模型抓虫:如何让网络协议实现与RFC规范对齐? 论文信息 arXiv:2506.01249 SysLLMatic: Large Language Models are Software System Optimizers Huiyun Peng, Arjun Gupte, Ryan Hasler, Nicholas John Eliopoulos, Chien-Chou Ho, Rishi Mantr…...

浅析EXCEL自动连接PowerBI的模板
浅析EXCEL自动连接PowerBI的模板 之前我分享过:PowerBI链接EXCEL实现自动化报表 ,其中一个关键工具就是提到的EXCEL链接模板,即宏工作薄。 今天就大概来聊一聊这个宏工作簿的底层原理是啥,怎么实现的。 第一步: 打开…...
DeepSeek 赋能金融反洗钱:AI 驱动的风险监测革新之路
目录 一、引言二、金融反洗钱监测的现状与挑战2.1 现状概述2.2 面临的挑战 三、DeepSeek 技术原理剖析3.1 核心架构3.2 关键技术 四、DeepSeek 在金融反洗钱监测中的应用优势4.1 强大的数据处理与分析能力4.2 精准的风险识别与预警4.3 提升工作效率与降低成本 五、DeepSeek 在金…...