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

Android compose 可见性动画未执行问题修复

接着修改待办事项demo 动画有问题 导致初始不显示数据其实数据库是有数据的。原代码如下package com.example.testcompose1 import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.scaleIn import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Checkbox import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.SideEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.example.testcompose1.data.TodoEntity import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.Collections.rotate OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) Composable fun TodoListScreen( viewModel: TodoViewModel, // 获取ViewModel实例。 在同一个activity作用域中是单例。 settingsViewModel: SettingsViewModel, onNavigateToDetail: (Int) - Unit {} ) { // val screenWidth LocalConfiguration.current.screenWidthDp.dp.value val configuration LocalConfiguration.current val density LocalDensity.current val screenWidthPx with(density) { configuration.screenWidthDp.dp.toPx() } val offsetX -(screenWidthPx * 3).toInt() // 从屏幕左侧3倍宽度外滑入 var showInfiniteList by remember { mutableStateOf(false) } if (showInfiniteList) { // 显示无限滚动列表并提供一个返回按钮 Scaffold( topBar { TopAppBar( title { Text(无限滚动列表) }, navigationIcon { IconButton(onClick { showInfiniteList false }) { Icon(Icons.Default.ArrowBack, contentDescription 返回) } } ) } ) { innerPadding - // 给 InfiniteListPage 添加内边距 Box(modifier Modifier.padding(innerPadding)) { InfiniteListPage() } } } else { // 显示原待办事项列表 // 使用 remember 和 mutableStateOf 保存输入框的文本 var text by remember { mutableStateOf() } // 使用 mutableStateListOf 保存待办项列表 // val todoItems remember { mutableStateListOfString() } // 将 StateFlow 转换为 Compose 可观察的 State // val todoItems by viewModel.todoItems.collectAsState() val todos by viewModel.todos.collectAsState() // 获取协程作用域用于延迟删除 val scope rememberCoroutineScope() // 管理每个项的可见性初始为 true新添加的项先设为 false然后立即设为 true val itemVisibility remember { mutableStateMapOfInt, Boolean() } // key改为用id // 同步 itemVisibility 与 todoItems为新增项添加初始 false并在下一帧设为 true LaunchedEffect(todos) { todos.forEach { todo - if (!itemVisibility.containsKey(todo.id)) { // 新项初始不可见 itemVisibility[todo.id] false // 等待一帧然后设为可见触发进入动画 launch { delay(50) // 短暂延迟确保重组 itemVisibility[todo.id] true } } } // 清理已删除的项 // itemVisibility.keys.retainAll(todoItems.toSet()) val currentIds todos.map { it.id }.toSet() itemVisibility.keys.retainAll(currentIds) } Column(modifier Modifier.padding(16.dp)) { ThemeSwitch(settingsViewModel) // 添加开关 Spacer(modifier Modifier.height(8.dp)) // 文本输入框 TextField( value text, onValueChange { text it }, // 反向绑定视图变化-- 数据变化 label { Text(输入待办事项) }, colors TextFieldDefaults.colors( focusedContainerColor MaterialTheme.colorScheme.surface, // 获得焦点时的背景色 unfocusedContainerColor MaterialTheme.colorScheme.surfaceVariant, // 失去焦点时输入框背景色 focusedIndicatorColor MaterialTheme.colorScheme.primary, // 输入框底部下划线的颜色。 unfocusedIndicatorColor MaterialTheme.colorScheme.onSurface.copy(alpha 0.5f) ), modifier Modifier.fillMaxWidth() ) // 添加按钮 Button( onClick { viewModel.addTodo(text) text }, shape MaterialTheme.shapes.small, // 使用主题形状 colors ButtonDefaults.buttonColors( containerColor MaterialTheme.colorScheme.primary, // 容器背景色按钮底色 contentColor MaterialTheme.colorScheme.onPrimary // 内容颜色按钮上文字 / 图标的颜色 ), modifier Modifier.padding(top 8.dp) ) { Text(添加) } // 显示待办列表 Spacer(modifier Modifier.height(16.dp)) Text(待办列表, style MaterialTheme.typography.titleMedium) LazyColumn { items(items todos ,key { it.id }) // 使用唯一 id 作为 key确保动画正确识别 { todo - val visible itemVisibility[todo.id] ?: true // 为每个项添加动画。 AnimatedVisibility没起作用 AnimatedVisibility( visible visible, enter fadeIn(animationSpec tween(1500, easing FastOutSlowInEasing)) slideInHorizontally( initialOffsetX { -3000 }, // 固定大偏移量从左侧 3000 像素外滑入 animationSpec tween(1500, easing FastOutSlowInEasing) ) scaleIn( initialScale 0.1f, animationSpec tween(1500, easing FastOutSlowInEasing) ), exit fadeOut(animationSpec tween(500)) slideOutHorizontally(targetOffsetX { 200 } , animationSpec tween(500)) ) { // SideEffect 是一个专门用于执行副作用的可组合函数。它的主要作用是在每次 重组recomposition 时安全地执行那些不直接影响 UI、但需要与外部系统交互的操作例如日志记录、埋点、更新非 Compose 管理的状态等。 SideEffect { println(Item ${todo.title} 显示动画执行) } TodoItemRow(todo todo , onDelete { // 触发删除动画 itemVisibility[todo.id] false scope.launch { delay(500) // viewModel.removeItem(item) // deletingItems deletingItems - item viewModel.deleteTodo(todo) // 清理状态由 LaunchedEffect 的 retainAll 负责 } } ,onToggle { viewModel.toggleComplete(todo) // 切换完成状态 } , onClick { onNavigateToDetail(todo.id) }// 点击跳转 ) } } } } } } Composable fun TodoItemRow( todo: TodoEntity , onDelete: () - Unit // 添加删除回调删除逻辑放在上层。即把回调传给里面的按钮。 ,onToggle: () - Unit , onClick: () - Unit , modifier: Modifier Modifier ) { Card( modifier modifier .fillMaxWidth() .padding(vertical 4.dp) .clickable { onClick() }, // 现在 modifier 应该会叠加动画修饰符 elevation CardDefaults.cardElevation( defaultElevation 2.dp // 这里传你要的默认高度 ), shape MaterialTheme.shapes.medium, // 使用主题形状 colors CardDefaults.cardColors( containerColor MaterialTheme.colorScheme.surface ) ) { Row( verticalAlignment Alignment.CenterVertically, modifier Modifier .fillMaxWidth() .padding(vertical 8.dp), horizontalArrangement Arrangement.SpaceBetween // 横向布局子元素两端对齐剩余空白空间平均分配到子元素之间 ) { // 新增Checkbox切换事项是否已完成的状态 Checkbox( checked todo.isCompleted, onCheckedChange { onToggle() } ) Text(text todo.title ,style MaterialTheme.typography.bodyLarge, color MaterialTheme.colorScheme.onSurface ,textDecoration if (todo.isCompleted) TextDecoration.LineThrough else null // LineThrough是中划线 ) IconButton(onClick onDelete) { Icon(Icons.Default.Delete, contentDescription 删除 , tint MaterialTheme.colorScheme.error) } } } } // 主题切换开关 Composable fun ThemeSwitch(settingsViewModel: SettingsViewModel) { val isDarkTheme by settingsViewModel.isDarkTheme.collectAsState() Row( modifier Modifier .fillMaxWidth() .clip(MaterialTheme.shapes.medium) .background(MaterialTheme.colorScheme.surface) .padding(horizontal 16.dp, vertical 8.dp), horizontalArrangement Arrangement.SpaceBetween, verticalAlignment Alignment.CenterVertically ) { Text( text 深色模式, style MaterialTheme.typography.bodyLarge, color MaterialTheme.colorScheme.onSurface ) Switch( checked isDarkTheme, onCheckedChange { settingsViewModel.toggleDarkMode() } ) } } // 为了允许手动切换深色/浅色模式在应用中保存用户的选择并在主题中读取. 后面改用DataStore保存 //object ThemeManager { // var isDarkTheme by mutableStateOf(false) // private set // // fun toggleTheme() { // 切换是否为深色主题 // isDarkTheme !isDarkTheme // } //}修改后package com.example.testcompose1 import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.scaleIn import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Delete import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Checkbox import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.SideEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.example.testcompose1.data.TodoEntity import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.Collections.rotate OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) Composable fun TodoListScreen( viewModel: TodoViewModel, // 获取ViewModel实例。 在同一个activity作用域中是单例。 settingsViewModel: SettingsViewModel, onNavigateToDetail: (Int) - Unit {} ) { // val screenWidth LocalConfiguration.current.screenWidthDp.dp.value val configuration LocalConfiguration.current val density LocalDensity.current val screenWidthPx with(density) { configuration.screenWidthDp.dp.toPx() } val offsetX -(screenWidthPx * 3).toInt() // 从屏幕左侧3倍宽度外滑入 var showInfiniteList by remember { mutableStateOf(false) } if (showInfiniteList) { // 显示无限滚动列表并提供一个返回按钮 Scaffold( topBar { TopAppBar( title { Text(无限滚动列表) }, navigationIcon { IconButton(onClick { showInfiniteList false }) { Icon(Icons.Default.ArrowBack, contentDescription 返回) } } ) } ) { innerPadding - // 给 InfiniteListPage 添加内边距 Box(modifier Modifier.padding(innerPadding)) { InfiniteListPage() } } } else { // 显示原待办事项列表 // 使用 remember 和 mutableStateOf 保存输入框的文本 var text by remember { mutableStateOf() } // 使用 mutableStateListOf 保存待办项列表 // val todoItems remember { mutableStateListOfString() } // 将 StateFlow 转换为 Compose 可观察的 State // val todoItems by viewModel.todoItems.collectAsState() val todos by viewModel.todos.collectAsState() // 获取协程作用域用于延迟删除 val scope rememberCoroutineScope() // 管理每项的 AnimatedVisibility新 id 先 false 再 true 以触发进入动画 val itemVisibility remember { mutableStateMapOfInt, Boolean() } // 必须用 collect 持续监听不能用 LaunchedEffect(todos)Room 每次发射新 List 都会让 // LaunchedEffect 重启并取消子协程导致 delay(50) 里「设为可见」永远跑不完界面一直空白。 LaunchedEffect(Unit) { viewModel.todos.collect { current - current.forEach { todo - if (!itemVisibility.containsKey(todo.id)) { itemVisibility[todo.id] false launch { delay(50) itemVisibility[todo.id] true } } } itemVisibility.keys.retainAll(current.map { it.id }.toSet()) } } Column(modifier Modifier.padding(16.dp)) { ThemeSwitch(settingsViewModel) // 添加开关 Spacer(modifier Modifier.height(8.dp)) // 文本输入框 TextField( value text, onValueChange { text it }, // 反向绑定视图变化-- 数据变化 label { Text(输入待办事项) }, colors TextFieldDefaults.colors( focusedContainerColor MaterialTheme.colorScheme.surface, // 获得焦点时的背景色 unfocusedContainerColor MaterialTheme.colorScheme.surfaceVariant, // 失去焦点时输入框背景色 focusedIndicatorColor MaterialTheme.colorScheme.primary, // 输入框底部下划线的颜色。 unfocusedIndicatorColor MaterialTheme.colorScheme.onSurface.copy(alpha 0.5f) ), modifier Modifier.fillMaxWidth() ) // 添加按钮 Button( onClick { viewModel.addTodo(text) text }, shape MaterialTheme.shapes.small, // 使用主题形状 colors ButtonDefaults.buttonColors( containerColor MaterialTheme.colorScheme.primary, // 容器背景色按钮底色 contentColor MaterialTheme.colorScheme.onPrimary // 内容颜色按钮上文字 / 图标的颜色 ), modifier Modifier.padding(top 8.dp) ) { Text(添加) } // 显示待办列表 Spacer(modifier Modifier.height(16.dp)) Text(待办列表, style MaterialTheme.typography.titleMedium) LazyColumn { items(items todos ,key { it.id }) // 使用唯一 id 作为 key确保动画正确识别 { todo - val visible itemVisibility[todo.id] ?: true // 为每个项添加动画。 AnimatedVisibility没起作用 AnimatedVisibility( visible visible, enter fadeIn(animationSpec tween(1500, easing FastOutSlowInEasing)) slideInHorizontally( initialOffsetX { -3000 }, // 固定大偏移量从左侧 3000 像素外滑入 animationSpec tween(1500, easing FastOutSlowInEasing) ) scaleIn( initialScale 0.1f, animationSpec tween(1500, easing FastOutSlowInEasing) ), exit fadeOut(animationSpec tween(500)) slideOutHorizontally(targetOffsetX { 200 } , animationSpec tween(500)) ) { // SideEffect 是一个专门用于执行副作用的可组合函数。它的主要作用是在每次 重组recomposition 时安全地执行那些不直接影响 UI、但需要与外部系统交互的操作例如日志记录、埋点、更新非 Compose 管理的状态等。 SideEffect { println(Item ${todo.title} 显示动画执行) } TodoItemRow(todo todo , onDelete { // 触发删除动画 itemVisibility[todo.id] false scope.launch { delay(500) // viewModel.removeItem(item) // deletingItems deletingItems - item viewModel.deleteTodo(todo) // 清理状态由 LaunchedEffect 的 retainAll 负责 } } ,onToggle { viewModel.toggleComplete(todo) // 切换完成状态 } , onClick { onNavigateToDetail(todo.id) }// 点击跳转 ) } } } } } } Composable fun TodoItemRow( todo: TodoEntity , onDelete: () - Unit // 添加删除回调删除逻辑放在上层。即把回调传给里面的按钮。 ,onToggle: () - Unit , onClick: () - Unit , modifier: Modifier Modifier ) { Card( modifier modifier .fillMaxWidth() .padding(vertical 4.dp) .clickable { onClick() }, // 现在 modifier 应该会叠加动画修饰符 elevation CardDefaults.cardElevation( defaultElevation 2.dp // 这里传你要的默认高度 ), shape MaterialTheme.shapes.medium, // 使用主题形状 colors CardDefaults.cardColors( containerColor MaterialTheme.colorScheme.surface ) ) { Row( verticalAlignment Alignment.CenterVertically, modifier Modifier .fillMaxWidth() .padding(vertical 8.dp), horizontalArrangement Arrangement.SpaceBetween // 横向布局子元素两端对齐剩余空白空间平均分配到子元素之间 ) { // 新增Checkbox切换事项是否已完成的状态 Checkbox( checked todo.isCompleted, onCheckedChange { onToggle() } ) Text(text todo.title ,style MaterialTheme.typography.bodyLarge, color MaterialTheme.colorScheme.onSurface ,textDecoration if (todo.isCompleted) TextDecoration.LineThrough else null // LineThrough是中划线 ) IconButton(onClick onDelete) { Icon(Icons.Default.Delete, contentDescription 删除 , tint MaterialTheme.colorScheme.error) } } } } // 主题切换开关 Composable fun ThemeSwitch(settingsViewModel: SettingsViewModel) { val isDarkTheme by settingsViewModel.isDarkTheme.collectAsState() Row( modifier Modifier .fillMaxWidth() .clip(MaterialTheme.shapes.medium) .background(MaterialTheme.colorScheme.surface) .padding(horizontal 16.dp, vertical 8.dp), horizontalArrangement Arrangement.SpaceBetween, verticalAlignment Alignment.CenterVertically ) { Text( text 深色模式, style MaterialTheme.typography.bodyLarge, color MaterialTheme.colorScheme.onSurface ) Switch( checked isDarkTheme, onCheckedChange { settingsViewModel.toggleDarkMode() } ) } } // 为了允许手动切换深色/浅色模式在应用中保存用户的选择并在主题中读取. 后面改用DataStore保存 //object ThemeManager { // var isDarkTheme by mutableStateOf(false) // private set // // fun toggleTheme() { // 切换是否为深色主题 // isDarkTheme !isDarkTheme // } //}关键改动没看出原因借助的cursor修改的cursor挺强大的还分析处出问题原因。注释说了必须用 collect 持续监听不能用 LaunchedEffect(todos)Room 每次发射新 List 都会让 LaunchedEffect 重启并取消子协程导致 delay(50) 里「设为可见」永远跑不完界面一直空白。 ok.

相关文章:

Android compose 可见性动画未执行问题修复

接着修改待办事项demo, 动画有问题, 导致初始不显示数据,其实数据库是有数据的。原代码如下:package com.example.testcompose1import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.Fa…...

3步高效获取电子课本:tchMaterial-parser让国家中小学智慧教育平台资源轻松到手

3步高效获取电子课本:tchMaterial-parser让国家中小学智慧教育平台资源轻松到手 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获…...

2026 AI简历工具排行榜:写出专业简历,助你直通面试

求职市场对人才的要求日益精细化,一份高质量的简历已成为开启职业大门的“敲门砖”。然而,对于许多求职者而言,“不会排版”、“不擅措辞”依然是制作简历时面临的两大难题。幸运的是,AI技术的飞速发展为我们带来了福音——AI简历…...

AI算力芯片黑马!“图灵进化”完成新一轮数千万级别融资

AI算力芯片赛道再添重磅玩家!近日,AI算力芯片创新企业图灵进化(TuringEvo)宣布完成新一轮数千万级别融资 ,本轮融资资金将主要用于核心产品量产、研发团队扩充及全球市场拓展。图灵进化定位于“覆盖云边端全场景AI算力…...

【Ease UI】2026-04-03组件更新:新增组件xly-china-map中国地图组件

🚀 即插即用的 Vue 3 业务组件库,让中后台开发回归简单Ease UI 是一套为「快速复制」而生的 Vue 3 业务组件库。每个组件都是独立的 .vue 单文件,不依赖任何外部样式或工具函数,直接复制到你的项目即可使用。它仅依赖 Element Plu…...

蓝桥杯备赛:Day3-P1102 A-B 数对

📚 算法笔记:P1102 A-B 数对 (枚举与哈希查找) 1. 题目简述 P1102 A-B 数对 - 洛谷 给出一个长度为 NNN 的正整数数列和一个整数 CCC,求有多少个不同的数对 (A,B)(A, B)(A,B) 满足 A−BCA - B CA−BC。 数据范围:N≤2105N \l…...

AI未来五年发展路径

AI的发展路径:生成能力-推理能力-Agent能力-数字虚拟人-具身机器人-脑机接口。(1)生成现在生成都已经渐入佳境:文本:文本报告生成、代码生成,如Claude Code语音:语音生成图片:图片生…...

【大模型智能体】【Harness Engineering】Natural-Language Agent Harnesses

摘要 智能体性能日益依赖于约束工程,然而约束设计通常深嵌于控制器代码与运行时特定规范中,难以作为科学对象进行转移、比较和研究。我们提出:智能体的高层控制逻辑能否被外化为一种可移植的可执行制品?我们引入了自然语言智能体约…...

模型评估体系架构解析

模型评估是量化系统表现的核心基准。本架构基于分类树结构,将系统切分为传统机器学习范式(ML Models)与检索增强生成代理(RAG Agent)两大赛道,并向下延展至具体的评估算子。 1. ML Models (传统机器学习模型…...

AI Agent架构入门到精通:LangChain重磅DeepAgents深度拆解,看这一篇就够了!

引言:为什么传统Agent总是"浅尝辄止"? 你有没有遇到过这样的尴尬场景: 让AI助手帮你完成一个复杂任务,比如"调研一下LangGraph技术,写一份技术报告,并创建相应的代码示例"。刚开始&a…...

7张图看懂Claude Code:从架构图解到工程实现

这篇文章用7张图架构图解的方式,系统讲解Claude Code的工程实现。 为什么要关注Claude Code? 2026年3月31日,Anthropic的Claude Code CLI工具因npm发布包意外暴露了.map文件,导致完整源码泄露。 这虽然说不是一次主动的开源&am…...

V数据库设计

一、章节核心定位第二章通常是数据库设计的需求分析与概念结构设计阶段,是整个数据库设计流程的核心起点,直接决定后续逻辑结构、物理结构设计的合理性,是从业务需求到数据模型的关键转化环节。二、核心知识点梳理1. 需求分析阶段&#xff08…...

算法会梦见电子羊,但人类需要学会与有偏见的AI共存 | 嗨点小圆桌

点击文末“阅读原文”即可参与节目互动剪辑、音频 / 卷圈 运营 / 卷圈 监制 / 姝琦 封面 / 姝琦 产品统筹 / bobo 场地支持 / AI原点社区我们避开关于算力和估值的宏大叙事,在 AI 原点社区的小圆桌旁,和两位刚刚从硅谷大厂“回归”实验室的科学家聊…...

ONES 签约全国汽车电子精密制造领先者——维科精密

ONES 签约全国汽车电子精密制造领先者 —— 维科精密。作为上市的国家级专精特新“小巨人”企业,维科精密凭借领先的技术实力与制造能力,成为全球知名客户高度信赖的汽车电子精密制造领域标杆。ONES 助力维科精密实现研发与制造流程的数字化升级&#xf…...

告别串口打印!用STM32F103C8T6和0.96寸OLED打造迷你温湿度计

用STM32F103C8T6和0.96寸OLED打造极简温湿度监测终端 在创客圈里,总有些小项目能让人眼前一亮——比如把枯燥的传感器数据变成桌面上的精致显示装置。今天我们要做的,就是用一个STM32F103C8T6开发板、0.96寸OLED屏幕和DHT22传感器,打造一个完…...

告别命令行手敲:用Python脚本自动化你的第一个OpenFOAM腔体流动模拟

用Python脚本解放双手:OpenFOAM腔体流动模拟自动化实战 每次打开终端,重复输入相同的OpenFOAM命令,修改几乎雷同的参数文件,这种机械操作是否让你感到效率低下?作为CFD工程师,我们真正应该投入时间的是分析…...

Linux下CST8XX触摸屏驱动调试实战:从I2C波形异常到内核崩溃的完整解决记录

Linux下CST8XX触摸屏驱动调试实战:从I2C波形异常到内核崩溃的完整解决记录 在嵌入式Linux开发中,触摸屏驱动的调试往往是最具挑战性的环节之一。本文将详细记录CST8XX系列电容触摸屏在Linux平台上的完整调试过程,涵盖从硬件信号异常到内核崩溃…...

你的Spring Boot项目安全吗?快速排查并修复Fastjson2历史版本(<=2.0.26)的隐藏风险

Spring Boot项目安全自查:Fastjson2历史版本(≤2.0.26)风险排查与修复指南 最近在帮几个客户做代码审计时,发现不少Spring Boot项目还在使用Fastjson2的老版本。说实话,这个问题比想象中普遍——很多团队甚至不知道自…...

OpenClaw(小龙虾)Windows 避坑安装指南

最近“小龙虾”(OpenClaw)可以说是 AI 圈最火的话题之一,这个能真正执行任务的 AI 智能体让无数人看到了自动化的无限可能。作为一个热衷于折腾各种 AI 工具的开发者,我也第一时间在 Windows 上尝试部署,结果一上来就被…...

台湾大学最新研究:大语言模型也能像人类一样“拐弯思考“了?

在人工智能的世界里,让机器像人类一样思考一直是个巨大挑战。当我们遇到复杂问题时,会自然地分步骤思考,比如解数学题时会先分析条件、再列方程、最后求解。但对于能理解声音的AI模型来说,这种"拐弯思考"能力还不够强。…...

几何精度因子(GDOP)在GNSS定位中的关键作用与优化策略

1. 什么是几何精度因子(GDOP)? 当你用手机导航时,有没有遇到过定位漂移的情况?明明站在十字路口,地图上的小蓝点却在周围乱跳。这种现象很大程度上与GDOP值有关。简单来说,GDOP就像是一个"…...

在VMware Workstation上实战部署华为eSight网络管理平台

1. 环境准备:从零搭建虚拟化实验平台 第一次接触华为eSight时,我完全被它的企业级功能震撼了——但随之而来的问题是:如何在个人电脑上搭建测试环境?经过多次实践,我发现VMware Workstation是最理想的实验平台。这里分…...

【配网可靠性评估】含可再生能源的配电网可靠性评估方法Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

【电池容量提取+锂电池寿命预测】 基于Transformer-BiGRU的锂电池剩余寿命预测Matlab代码(单变量)

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

保姆级教程:手把手教你理解电力线载波通信的MAC帧与MPDU(附避坑指南)

电力线载波通信MAC帧与MPDU实战解析:从协议规范到调试避坑 电力线载波通信(PLC)技术凭借其"无需额外布线"的天然优势,在智能电网、智能家居等领域持续渗透。但当你真正打开协议文档准备调试时,那些密密麻麻的…...

【电池特征提取+SOH估计】基于PINN物理信息神经网络的锂电池SOH估计 Matlab代码(多输入单输出)

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

【顶刊复现】跟网型逆变器小干扰稳定性分析与控制策略优化Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。👇 关注我领取海量matlab电子书和数学建模资料🍊个人信条:格物致知,完整Matl…...

苍穹外卖需要注意的地方

公共字段自动填充自定义注解AutoFill公共字段自动填充和反射有很大的关系公共字段填充中自定义注解AutoFill ->反射在查找给某个方法进行公共字段填充的时候的标识反射与注解认识注解属性名后面要加()在使用的时候把注解写在方法上,括号内…...

从零搭建AI开发环境:Python 3.10.11、CUDA 12.1与PyTorch一站式配置指南

1. 环境准备:从零开始的硬件与软件检查 在开始搭建AI开发环境之前,我们需要确保硬件和基础软件都满足要求。我遇到过很多新手朋友因为忽略了这个步骤,导致后续安装过程频频出错。首先确认你的电脑配备了NVIDIA显卡,这是使用CUDA加…...

华为ENSP OSPF实验避坑指南:配置Stub区域、路由聚合与DR选举的常见错误

华为ENSP OSPF实验避坑指南:配置Stub区域、路由聚合与DR选举的常见错误 在华为ENSP模拟环境中进行OSPF多区域配置时,即使是经验丰富的网络工程师也难免会遇到各种"坑"。本文将从实际排错角度出发,深入剖析Stub区域配置、路由聚合计…...