Kotlin ViewModel 实战进阶(从入门到精通必看)

Kotlin+Jetpack Compose+Volley+ViewModel Android开发 用 Kotlin+Jetpack Compose+Volley+ViewModel 进行Android开发初探 阅读详情

第一章:Kotlin ViewModel 概述与核心理念

Kotlin 中的 ViewModel 是 Jetpack 架构组件之一,专为管理 UI 相关数据而设计,能够在配置更改(如屏幕旋转)时持久保留数据,避免不必要的资源重复加载。ViewModel 的生命周期独立于 Activity 或 Fragment,由框架自动管理,确保在 UI 组件重建时仍能提供一致的数据状态。

ViewModel 的核心优势

  • 生命周期感知:自动适应 Android 组件的生命周期变化
  • 数据持久化:在配置变更时不丢失数据
  • 职责分离:将业务逻辑与 UI 控制解耦,提升代码可维护性

基本使用方式

通过依赖注入获取 ViewModel 实例,推荐结合 Koin 或 Hilt 使用。以下是一个简单的 ViewModel 定义示例:
// 用户信息管理 ViewModel
class UserViewModel : ViewModel() {
    // 可观察的数据流
    private val _userName = MutableLiveData("John Doe")
    val userName: LiveData = _userName

    // 更新用户名称的方法
    fun updateName(newName: String) {
        _userName.value = newName
    }
}
在 Fragment 或 Activity 中获取实例并观察数据:
val viewModel: UserViewModel by viewModels()
viewModel.userName.observe(this) { name ->
    textView.text = name // 自动响应更新
}

与传统数据管理方式对比

特性ViewModelActivity 成员变量
配置变更存活是否
生命周期安全是否
测试友好性高低
graph TD A[UI Layer] --> B{ViewModel} B --> C[Repository] C --> D[Local Data Source] C --> E[Remote API] B --> F[StateFlow / LiveData] A --> G[Observe UI State]

第二章:ViewModel 基础用法详解

2.1 ViewModel 的生命周期管理原理

ViewModel 的生命周期独立于 UI 组件,由框架通过 LifecycleOwner 进行托管。当配置变更(如屏幕旋转)发生时,ViewModel 不会被销毁,从而保留数据状态。
生命周期绑定机制
ViewModel 与 Activity 或 Fragment 关联时,通过 ViewModelProvider 获取实例,系统会自动将其生命周期与组件对齐,但仅在组件彻底销毁时才清除 ViewModel。
class UserViewModel : ViewModel() {
    private val _userData = MutableLiveData()
    val userData: LiveData = _userData

    fun loadUser(userId: String) {
        // 模拟异步加载
        UserRepository.fetch(userId) { user ->
            _userData.value = user
        }
    }
}
上述代码中,_userData 为可变数据源,封装为不可变的 LiveData 对外暴露。即使界面重建,ViewModel 实例仍保留,避免重复请求。
内存泄漏防护
ViewModel 不应持有对 Context 的强引用。若需应用上下文,可继承 AndroidViewModel 并获取 Application 实例。
  • ViewModel 在配置更改时不重建
  • 在 Fragment 完全移除或 Activity 销毁时被清除
  • 通过 onCleared() 回调执行资源释放

2.2 创建与初始化 ViewModel 实践

在 Jetpack Compose 开发中,ViewModel 的创建与初始化是实现数据持久化和界面状态管理的关键步骤。通过 `ViewModelProvider` 或 `by viewModels()` 委托方式可安全获取 ViewModel 实例。
使用 Kotlin 属性委托初始化
class MainActivity : ComponentActivity() {
    private val viewModel: UserViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            UserScreen(viewModel = viewModel)
        }
    }
}
上述代码利用 `by viewModels()` 自动绑定 Activity 生命周期,确保配置变更时保留实例。
依赖注入场景下的初始化
当结合 Hilt 等 DI 框架时,可通过注解简化创建过程:
  • @HiltAndroidApp 注解 Application 类
  • @AndroidEntryPoint 标记 Activity
  • 直接使用 @Inject 获取 ViewModel 工厂
此方式提升可测试性并解耦组件依赖。

2.3 在 Activity 中安全使用 ViewModel

生命周期感知与数据持久化
ViewModel 的核心优势在于其生命周期独立于 Activity,能够在配置更改(如屏幕旋转)时保留数据。通过 ViewModelProvider 获取实例,确保在 Activity 重建时不重复创建。
class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: UserViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this)[UserViewModel::class.java]
    }
}
上述代码中,ViewModelProvider(this) 以 Activity 为作用域,系统自动管理 ViewModel 生命周期。即使 Activity 被销毁并重建,ViewModel 实例仍保持不变,避免数据丢失。
避免内存泄漏的实践
不得在 ViewModel 中持有 Activity 的强引用。若需应用上下文,应继承 AndroidViewModel 并使用 Application 上下文:
  • 使用 AndroidViewModel 提供全局上下文支持
  • 禁止将 Activity 实例传递给 ViewModel
  • 通过 LiveData 或 StateFlow 暴露数据,实现观察者模式解耦

2.4 Fragment 间共享 ViewModel 的实现技巧

在 Android 开发中,多个 Fragment 可能隶属于同一个 Activity。利用此结构特性,可通过 Activity 作用域创建 ViewModel,实现数据共享。
共享机制原理
ViewModel 由 Activity 提供,所有其下属 Fragment 获取的是同一实例,确保数据一致性。
class SharedViewModel : ViewModel() {
    val data = MutableLiveData()
}
该 ViewModel 继承自 ViewModel,包含可观察数据字段 data,供多个 Fragment 观察与更新。
Fragment 中的使用方式
通过 activityViewModels() 委托获取共享实例:
val model: SharedViewModel by activityViewModels()
此代码确保所有 Fragment 绑定到宿主 Activity 的 ViewModel 实例,实现跨 Fragment 数据同步。
  • 避免使用 viewModelProvider(this),否则生成独立实例
  • 建议通过 LiveData 通信,保持生命周期安全

2.5 SavedStateHandle 保存界面状态实战

在现代 Android 开发中,使用 `SavedStateHandle` 可有效管理界面生命周期内的临时状态数据。它作为 ViewModel 与组件间通信的桥梁,确保配置变更时数据不丢失。
基本用法示例
class MyViewModel(savedState: SavedStateHandle) : ViewModel() {
    private val stateKey = "input_text"
    val userInput = savedState.getLiveData<String>(stateKey)

    fun saveInput(text: String) {
        savedState.set(stateKey, text)
    }
}
上述代码通过 `SavedStateHandle` 创建一个可观察的 `LiveData`,在配置更改(如屏幕旋转)后仍能恢复用户输入内容。`getLiveData()` 自动关联键值与生命周期,避免手动存取。
优势对比
  • 无需覆写 onSaveInstanceState(),减少模板代码
  • 与 ViewModel 天然集成,支持依赖注入
  • 类型安全,避免 Bundle 类型转换错误

第三章:ViewModel 与 Jetpack 组件协同

3.1 ViewModel 与 LiveData 联动设计模式

数据同步机制
ViewModel 与 LiveData 的结合实现了 UI 与数据的生命周期安全通信。ViewModel 持有 LiveData 实例,确保配置变更后数据不丢失。
class UserViewModel : ViewModel() {
    private val _userName = MutableLiveData<String>()
    val userName: LiveData<String> = _userName

    fun updateName(name: String) {
        _userName.value = name
    }
}
上述代码中,_userName 为可变数据源,通过公开只读的 userName 暴露给界面观察,避免外部直接修改。
观察者注册流程
在 Activity 或 Fragment 中使用 observe() 方法监听数据变化:
  • Observer 在主线程自动更新 UI
  • 生命周期感知,避免内存泄漏
  • 仅活跃状态接收事件

3.2 结合 DataBinding 提升开发效率

数据同步机制
DataBinding 允许在 XML 布局中直接绑定数据源,实现 UI 与数据的自动同步。通过声明式编程减少 findViewById 的调用,提升代码可读性与维护性。
<layout>
  <data>
    <variable name="user" type="com.example.User" />
  </data>
  <TextView
    android:text="@{user.name}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
</layout>
上述代码中,@{user.name} 实现了数据字段到视图的绑定。当 user 对象更新时,UI 自动刷新,无需手动调用 setText。
优势对比
  • 减少模板代码,降低出错概率
  • 支持双向绑定(如 @={user.name})
  • 编译期生成绑定类,性能优于反射

3.3 使用 Navigation 组件传递 ViewModel 数据

在 Jetpack Compose 应用中,通过 Navigation 组件共享 ViewModel 可实现跨界面的数据同步。当多个界面需访问同一数据源时,将 ViewModel 提升至 NavHost 级别,使其生命周期独立于具体界面。
共享 ViewModel 的声明方式
class SharedViewModel : ViewModel() {
    private val _userData = mutableStateOf("")
    val userData: State = _userData

    fun updateData(newData: String) {
        _userData.value = newData
    }
}
该 ViewModel 在宿主作用域创建后,所有下层目标均可观察和修改其状态,避免重复实例化。
在 NavHost 中注入 ViewModel
  • 使用 rememberNavController() 创建导航控制器
  • 通过 viewModel() 在 NavHost 作用域获取唯一实例
  • 各目的地组件直接引用该 ViewModel 实现数据互通

第四章:高级应用场景与性能优化

4.1 多层级嵌套 Fragment 共享状态方案

在复杂的 Android 应用中,多层级嵌套的 Fragment 需要高效共享状态。传统通过 Activity 中转的方式耦合度高,维护困难。
使用 ViewModel 共享状态
推荐使用 `ViewModel` 与 `FragmentActivity` 绑定的作用域实现数据共享:
class SharedViewModel : ViewModel() {
    private val _data = MutableLiveData()
    val data: LiveData = _data

    fun updateData(value: String) {
        _data.value = value
    }
}
在任意嵌套层级的 Fragment 中通过 activity?.let { ViewModelProvider(it)[SharedViewModel::class.java] } 获取同一实例,实现数据同步。
通信流程示意
层级组件数据源
Level 1ActivityViewModel
Level 2ParentFragment共享引用
Level 3ChildFragment共享引用
该方式解耦了组件依赖,提升可测试性与生命周期安全性。

4.2 协程与 ViewModelScope 异步任务管理

在 Android 开发中,协程为异步任务提供了简洁高效的解决方案。通过 ViewModelScope,可确保协程生命周期与 ViewModel 绑定,避免内存泄漏。
自动生命周期管理
ViewModelScope 是 Kotlin 协程在 Jetpack 中的核心集成之一。当 ViewModel 被清除时,该作用域内所有运行的协程会自动取消。
class UserViewModel : ViewModel() {
    fun loadUserData() {
        viewModelScope.launch {
            try {
                val userData = repository.fetchUser() // 挂起函数
                _user.value = userData
            } catch (e: Exception) {
                _error.value = e.message
            }
        }
    }
}
上述代码中,viewModelScope.launch 启动协程,无需手动取消。一旦 ViewModel 销毁,协程自动终止,防止资源浪费。
结构化并发优势
  • 协程随 ViewModel 生命周期安全启动
  • 异常可通过 CoroutineExceptionHandler 集中处理
  • 支持并行数据加载,提升响应效率

4.3 避免内存泄漏的 ViewModel 使用规范

在 Android 开发中,ViewModel 虽然具备生命周期感知能力,但不当使用仍可能导致内存泄漏。关键在于避免持有长生命周期对象的引用。
避免持有 Activity 或 Context 引用
ViewModel 不应直接引用 Activity 或 ApplicationContext,否则可能阻止 Activity 被垃圾回收。
// 错误示例:持有 Context 引用
class LeakyViewModel(private val context: Context) : ViewModel()

// 正确做法:使用 Application 上下文或避免引用
class SafeViewModel(application: Application) : AndroidViewModel(application)
通过继承 AndroidViewModel 获取 Application 上下文,确保不会因配置更改导致内存泄漏。
清理协程与回调
若 ViewModel 中启动了协程或注册了监听器,需在 onCleared() 中取消或注销:
  • 使用 viewModelScope.launch,其会自动在清除时取消协程
  • 避免手动创建未绑定生命周期的协程
  • 注销第三方服务或 EventBus 回调

4.4 ViewModel 在多模块架构中的职责划分

在多模块架构中,ViewModel 的核心职责是隔离 UI 逻辑与业务逻辑,充当界面与数据层之间的协调者。
职责边界定义
ViewModel 不应直接引用具体的数据源实现,而是依赖抽象接口。它接收 UI 事件,调用领域层服务,并将结果转换为可观察的数据流。
  • 处理 UI 相关状态管理
  • 聚合多个 Repository 数据
  • 暴露 LiveData 或 StateFlow 给 View
  • 不持有 Context 引用以避免内存泄漏
class UserViewModel(
    private val userRepository: UserRepository,
    private val dispatcher: CoroutineDispatcher
) : ViewModel() {
    private val _uiState = MutableStateFlow(UserUiState.Loading)
    val uiState: StateFlow<UserUiState> = _uiState

    fun loadUserData(userId: String) {
        viewModelScope.launch(dispatcher) {
            try {
                val user = userRepository.getUserById(userId)
                _uiState.value = UserUiState.Success(user)
            } catch (e: Exception) {
                _uiState.value = UserUiState.Error(e.message)
            }
        }
    }
}
上述代码展示了 ViewModel 如何通过依赖注入获取 UserRepository,并在内部封装协程调度逻辑。_uiState 为私有可变状态,对外暴露只读 StateFlow,确保状态不可变性。loadUserData 方法处理异步加载流程,将结果映射为 UI 可消费的状态。

第五章:总结与未来演进方向

微服务架构的持续优化
现代云原生系统中,微服务拆分粒度需结合业务复杂度动态调整。例如某电商平台将订单服务进一步拆分为支付关联、库存锁定和物流调度三个子服务,通过gRPC接口通信,延迟降低38%。
  • 采用领域驱动设计(DDD)明确服务边界
  • 引入Service Mesh实现流量控制与可观测性
  • 使用OpenTelemetry统一追踪链路
边缘计算场景下的部署实践
在智能制造项目中,将AI推理模型下沉至边缘节点,利用Kubernetes + KubeEdge实现远程编排。以下为边缘Pod资源配置示例:
apiVersion: v1
kind: Pod
metadata:
  name: edge-inference-pod
spec:
  nodeSelector:
    kubernetes.io/hostname: edge-node-03
  resources:
    limits:
      cpu: "2"
      memory: "4Gi"
      nvidia.com/gpu: 1  # 支持GPU加速推理
安全与合规的自动化保障
金融类应用需满足等保2.0要求。通过GitOps流程集成OPA(Open Policy Agent),在CI阶段自动校验Kubernetes清单文件是否符合安全基线。
检测项策略规则违规示例
特权容器不允许privileged=trueinitContainer开启特权模式
资源限制必须定义memory/cpu limits未设置limits导致资源争抢
[CI Pipeline] → [OPA Policy Check] → [ArgoCD Sync] → [Cluster] ↓ [拒绝不合规变更]
Kotlin MVVM架构最佳实践指南 特性优势说明关注点分离UI逻辑与业务逻辑解耦生命周期感知自动管理资源释放,避免内存泄漏数据持久化ViewModel在配置更改后保持数据可测试性各组件可独立测试响应式编程LiveData自动通知UI更新通过合理使用ViewModel和LiveData,可以构建出健壮、可维护且符合现代Android开发规范的应用程序架构。 阅读详情

相关推荐

使用LiveData和ViewModel为Android项目搭建MVVM架构(Kotlin语言版)(入门教程)

写在前面 现在MVVM架构大行其道,逐渐取代MVP架构成为Android开发的主流架构,并且google官方为了方便实现MVVM架构推出了Architecture系列的库,现已纳入到jetpack中,并且推出了KTX版本的,这样用Kotlin语言也可以更方便的使用Architecture了。但网上的教程大部分是JAVA语言版本的,而且很多就是按照官方文档翻译一下,并没有讲的很清楚。 Kotli...

weixin_44407870的博客 5605

android开发,使用kotlin学习ViewModel

ViewModel应该是Jetpack中最重要的组件之一了。在以前,Activity要负责逻辑处理,又要控制UI展示,还要处理网络回调,导致大型项目难以维护。于是,ViewModel来帮助Activity分担一部分工作,ViewModel就专门用于存放和界面相关的工作。

weixin_63357306的博客 3172

Android ViewModel详解

视图与数据模型之间的桥梁ViewModel ViewModel的生命周期会比创建它的Activity、Fragment的生命周期都要长。即ViewModel中的数据会一直存活在Activity/Fragment中。众所周知,由于Android平台的特殊性,若应用程序发送屏幕旋转的时候会经历Activity的销毁与重建,这里就涉及到数据保存的问题。虽然Activity可以通过onSaveInstanceState()机制保存与恢复数据,但是onSaveInstanceState()方法只能存储少量的数据进行恢

赵彦军 2万+

Android(kotlin)JetPack系列学习——2.ViewModel(含源码)

(1)ViewModel 类旨在以注重生命周期的方式存储和管理界面相关数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。(2)对于简单的数据,activity 可以使用 onSaveInstanceState() 方法从 onCreate() 中的捆绑包恢复其数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图。这种情况就可以使用ViewModel来解决!(3)根据之前在公司实习的经验,数据相关的都放在ViewModel。

qq_41915623的博客 1916

“by” the way ——借ViewModel创建方式探索Kotlin的委托机制

文章目录获取viewModel的新方法旧方法新方法什么是委托模式?那么委托模式到底是什么呢?类委托应用场景属性委托的应用场景“by” 关键字到底是啥总结 获取viewModel的新方法 旧方法 有新方法肯定要先介绍一下旧方法。 在传统的viewModel获取中,我们都有这样一个经验——不能在Activity里直接创建viewModel对象。因为ViewModel的生命周期是长于Activity的,如果在Activity的方法内直接创建对象,就失去了viewModel的设计意义了,即独立于activity的生

Omnipotent's Blog 2908

【Android Jetpack高手日志】ViewModel 从入门到精通(1)

源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,和技术大牛一起讨论交流解决问题。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!if (!//界面执行 onDestroy 方法是,清空 viewmodel});源码、笔记、视频。

2301_82243396的博客 1068

Kotlin 的ViewModel使用(学习笔记)

Kotlin是一由JetBrains开发可用于现代多平台应用的静态编程语言。 Kotlin可以编译成Java字节码和JavaScript与Java代码相互运作,并可以重复使用如Java集合框架等的现有Java引用的函数。 Kotlin已正式成为Android官方支持开发语言。 所以Kotlin还是要学习一下的,毕竟事程序员吗 Kotlin还是好学的(有java基础的话) 使用ViewModel的和...

qq_26387051的博客 9883

数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享

数字IC后端PR阶段Innovus,ICC,ICC2修复short万能脚本分享

weixin_37584728的博客 3458

Kotlin协程Coroutines入门到实战:(三)Coroutines+Retrofit+ViewModel+LiveData实现MVVM客户端架构

Kotlin协程Coroutines入门到实战:(三)Coroutines+Retrofit+ViewModel+LiveData实现MVVM客户端架构 我们在前两篇文章中讲解了Kotlin协程的基本用法和所解决的关键性问题,接下来让我们来看看在实际项目中该怎么使用Kotlin协程这一利器呢。接下来一起来将Kotlin协程与Jetpack中的架构组件结合起来搭建个简单的项目吧。以下是此Demo的效...

NJP_NJP的博客 6385

基于知识图谱的职位推荐系统的设计与实现

在职位推荐系统中,实体可以包括职位、公司、技能等,而关系可以包括职位与公司的关联、职位与技能的关联等。基于知识图谱的职位推荐系统可以提供更加智能和精确的职位推荐服务。通过收集和预处理数据构建知识图谱,并设计推荐算法和用户界面,可以实现一个完整的职位推荐系统。通过利用知识图谱技术,我们可以构建一个更加智能和精确的职位推荐系统。本文将介绍如何设计和实现基于知识图谱的职位推荐系统,并提供相应的源代码。通过定义实体和关系的节点和边,可以将数据存储在图数据库中,并建立它们之间的关系。

RiqaEditor的博客 1668

UFS 3.1协议分析(第五章) -- UFS协议栈

ContentsUFS顶层架构应用层UFS命令集UFS 设备管理器UFS任务管理器传输层互连层 UFS顶层架构     UFS基于SCSI SAM架构模型定义了一个完整的协议栈,从上到下依次为应用层、传输层、数据链路层、物理层。UFS使用MIPI联盟的UniPro作为数据链路层和MIPI的M-PHY作为物理层,两者合起来称之为互连层(UFS InterConnect Layer) 应用层     应用层包括UFS命令集、设备管

Frank_sample的专栏 7371

MVVM架构:LiveData,ViewModel,kotlin,kotlin协程,DataBinding等

MVVM github:github.com/wfqdroid/mv… 所使用到的技术:LiveData,ViewModel,kotlin,kotlin协程,DataBinding等 先简单介绍一下上面几个 LiveData:见名知意,观察订阅模式,用于响应式编程,我们都知道RxJava的强大,但是LiveData相比于其,根本 不用管生命周期,应用会在页面"活着"的时候将数据同时到页面,当...

weixin_34107955的博客 1648

别再乱选离散化方法了!从零到一用Matlab对比差分、双线性Tustin和预矫正的实战效果

本文深入探讨了Matlab中四种主流离散化方法(差分、双线性Tustin和预矫正)的实战效果对比,帮助工程师在数字控制系统设计中做出明智选择。通过详细的理论分析和Matlab代码示例,展示了不同方法在稳定性、频率响应和计算复杂度上的差异,并提供了针对不同场景的工程选用指南。

weixin_28737603的博客 141

在 Kotlin 中,如何创建 ViewModel

【代码】在 Kotlin 中,ViewModel 的获取。

xingyu19911016的博客 501

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | YOLO26引入FDConv频率动态卷积改进,含FDC3k2二次创新,小目标检测,能够捕捉更加丰富和复杂的特征信息

本文提出了一种频率动态卷积(FDConv)模块,用于改进YOLO26目标检测模型的性能。FDConv通过在傅里叶域内划分参数预算,构建具有频率多样性的权重,有效提升了模型对低频和高频信息的处理能力。该模块包含内核空间调制(KSM)和频率带调制(FBM)两个关键组件,分别实现空间级和频域级的动态调节。实验表明,FDConv仅增加3.6M参数就能超越其他需要大幅增加参数的方法,并在目标检测、实例分割等任务中表现优异。文章详细介绍了FDConv的原理、实现方法及在YOLO26中的集成方式,提供了完整的代码实现。

Ai缝合怪、助力小伙伴高效发论文 250

【应用】OpenClaw玩转有道云笔记

功能名称核心原理实操示例(直接复制可用)实操避坑+补充说明网页剪藏插件自动抓取网页正文、下载图片,通过 API 发送到你的有道云笔记,内联图片避免防盗链失效帮我把这个网页剪藏到云笔记:https://example.com/article1. 避坑:知乎、公众号等需登录的网站,先在浏览器登录再剪藏;2. 原理:自动过滤广告,只留正文;3. Twitter/X 剪藏需额外配置 APIFY_API_TOKEN(见1.2.4)创建笔记。

海兰 716

Kotlin 协程与 ViewModel 的完美结合

Kotlin 协程与 ViewModel 的结合为 Android 开发提供了强大的异步处理能力:使用确保协程生命周期与 ViewModel 一致结合StateFlowSharedFlow实现响应式 UI遵循单一职责原则,分离业务逻辑采用结构化并发简化错误处理和资源管理掌握这些技术将使你能够构建更加健壮、高效且易于维护的 Android 应用程序。

Mark Wu 的博客 1145

利用 HTML5 与 SICF 打造 CRM WebClient UI 多附件上传 —— 从原型到生产的全流程揭秘

通过HTML5 标准 + SICF 服务 + BOL/GOS API的三位一体方案,我们无需修改 SAP 标准代码,就能让 CRM WebClient UI 获得现代化的多附件上传体验。浏览器负责多选与进度提示,SICF 负责安全中转,ABAP 负责权限校验与落库。你可以先在质量系统快速原型,再逐步完善权限、异常处理与 UI 细节。按照本文的方法落地,哪怕一次上传几百份文件,也能轻松搞定,真正把时间还给业务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 335

Android开发从入门到精通:Compose与Kotlin实战指南

现代Android开发以Kotlin语言和Jetpack Compose为核心技术栈,采用声明式编程范式提升UI开发效率。Kotlin作为官方首选语言,其扩展函数、密封类和协程等特性大幅简化了异步编程与状态管理。Jetpack组件库通过ViewModel、Room等架构组件实现关注点分离,而Compose框架则彻底重构了UI构建方式,支持更高效的热重载和跨平台开发。在工程实践层面,开发者需要掌握模块化架构设计、性能优化工具(如Profiler)以及持续交付流程。对于初学者,建议从官方Basics with

weixin_34122604的博客 346

【MATLAB】工业传送带速度闭环控制与张力联合仿真

本文基于MATLAB/Simulink平台,构建了工业传送带速度闭环控制与张力联合仿真系统。通过搭建驱动模块、机械传动模块、检测模块和控制模块,实现了速度与张力的协同控制。采用双PID调节器分别整定速度与张力参数,经联合调试后系统性能良好:速度跟踪误差小于±0.03m/s,张力波动控制在±30N内,负载扰动恢复时间仅0.3秒。研究提供了从建模到参数优化的完整工程方案,可直接应用于课程设计或工业实践,有效解决了传送带运行中速度偏差与张力波动的协同控制难题。

unber的博客 78

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Kotlin开发者必看:Android ViewModel的by viewModels()懒加载技巧

本文深入解析了Kotlin开发中Android ViewModel的by viewModels()懒加载技巧。该语法糖不仅是简洁的委托属性,更实现了生命周期感知的延迟初始化,能优化启动性能、避免不必要的资源开销,并完美处理配置更改后的数据保留问题。文章还探讨了其在Fragment嵌套、自定义Factory及与Hilt协同等复杂场景中的实战应用。

sugar的博客 1091

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

KMP-ObservableViewModel入门教程:从配置到第一个跨平台ViewModel的实现

KMP-ObservableViewModel是一个强大的跨平台库,让开发者能够在Kotlin Multiplatform项目中使用AndroidX/Kotlin ViewModels与SwiftUI协同工作。本教程将带你快速掌握从环境配置到实现第一个跨平台ViewModel的完整流程,帮助你轻松构建跨平台应用。 ## 准备工作:环境配置指南 在开始使用KMP-ObservableViewMo

gitblog_00402的博客 709

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【亲测免费】 Kotlin 多平台 ViewModel 指南

Kotlin 多平台 ViewModel 指南 1. 项目介绍 Kotlin Multiplatform ViewModel 是一个跨平台库,专为UI应用程序设计,它实现了MVVM(Model-View-ViewModel)架构。该库允许开发者在多平台上共享业务逻辑和视图模型,包括但不限于Android、Desktop、iOS、macOS、tvOS以及watchOS。通过支持生命周期感知组件(特别...

gitblog_00071的博客 1381

Kotlin中使用ViewModel的数据共享

Kotlin中使用ViewModel的数据共享 本篇已Kotlin为主要语言 本篇将讲述对于使用ViewModel来进行Fragment之间的数据共享,使用的技术为ViewModel,dataBinding 依赖 对于ViewModel是属于Androidx包下的JetPack组件,所以只需要项目使用了Androidx,就可直接使用,无需引入额外依赖包 代码教程 在进行编码之前想要做一些准备工作,给项目开启dataBinding,在项目级的build.gradle中,defaultConfig闭包下 d

A786ex的博客 3062

可能是最全的kotlin协程+Jetpack入门教程

可能是最全的kotlin协程+Jetpack入门教程前言一、协程是什么?二、Jetpack是什么?1.引入库2.读入数据总结二级目录三级目录 文章目录前言一、协程是什么?二、Jetpack是什么?1.引入库2.读入数据总结二级目录三级目录 前言 最近一直在学习kotlin,为了能够尽快入门,所以我准备写一个简单的app练手,加上之前一直在研究Jetpack这套组件库,基于以上原因我打算用kotlin+jetpack搭建我的app框架,至于为啥用kotlin协程,之前在网上看了一篇博客Kotlin 协程 看

DDUP的博客 4632

Koin Android ViewModel 快速入门:在 Activity 中注入 ViewModel 的完整实战指南

本篇指南以 Koin 官方快速上手教程为骨架,手把手演示如何在 Android 应用中通过 Koin 依赖注入容器管理数据层(Repository)、业务层(Service)与表现层(ViewModel),并重点讲解 `viewModel<T>()` 定义与 `by viewModel()` 注入的底层机制。读完本文,你将掌握从 Gradle 依赖配置、Koin 模块声明、应用启动,到在 Acti

gitblog_00155的博客 198
上一篇: Kotlin地理位置获取全流程详解(附完整代码示例)
下一篇: 还在担心数据泄露?彻底掌握SQL注入防护的7个核心技巧
ProcePerch
博客等级 码龄1年 150粉丝 1977原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值