Compose如何构建
1.Compose是围绕可组合函数构建的。通过@Composable添加在函数上,从而创建可组合函数。
Compose优点
1.使用更少的代码实现更多的功能,比如传统的UI实现一个列表需要xml布局,适配器。但是在Compose中可能只需要一个for循环 2.较少Bug,因为它有状态 3.直观,开发者只需要描述界面,Compose会负责处理剩余工作。应用状态变化时,界面会自动更新 4.兼容现有代码 5.
生命周期
状态管理
在Android Compose中,状态管理是指管理应用程序的数据和状态以确保UI的正确呈现和更新。Compose是一个声明式的UI框架,其中UI是通过函数来定义的,因此状态管理在Compose中与传统的Android View体系下的状态管理有所不同。在Compose中,常用的状态管理方式有以下几种:
- ViewModel:Compose结合了Android架构组件中的ViewModel。ViewModel是用于存储和管理与UI相关的数据的类,它在配置变化时保持数据的一致性,并且适用于Compose中的状态管理。你可以使用
viewModel()函数在Compose中获取ViewModel,并使用viewModel.state属性来观察状态的变化。在ViewModel中,你可以使用mutableStateOf()来创建可变的状态对象。 - remember:Compose提供了一个名为
remember的函数,它允许你在Compose函数内部保存和记忆状态。这样的状态仅在Compose函数被调用时初始化一次,并且在函数重新执行时保持其值不变。remember可以用于保存任何可变的数据,例如可变对象或简单数据类型。 - mutableStateOf():Compose提供了
mutableStateOf()函数,用于创建可变状态对象。当状态对象的值发生变化时,Compose会在Compose函数内部重新计算相关的部分,并更新UI。 - SideEffect:
SideEffect是Compose中的一个函数,它可以用于执行副作用操作,例如异步操作或更新全局状态。然而,使用SideEffect时需要注意,它不会触发Compose函数的重新计算,因此你需要确保在状态变化时手动触发Compose函数的重新计算。 - State Hoisting:State Hoisting是一种模式,用于将状态从子组件提升到父组件。这样做可以让状态在多个组件之间共享,从而实现更好的状态管理和数据传递。
综合使用上述方法,可以根据应用的复杂性和需求,选择最合适的状态管理方式。Compose提供了灵活且强大的状态管理工具,可以帮助你更轻松地管理应用程序的状态和数据流。
Modifer的常见用法,原理
状态:remember,附带效应
mutableStateOf与remember: 我们需要引入mutableStateOf,来标明这个data是有状态的,如果data发生了改变,所有引用这个状态的控件都发生了改变,都需要重新绘制!
remember将值存储起来,当界面发生了重新绘制,就会读之前存储的值
重组
图片中例子体现了什么是声明式UI。传统livedata需要调用addObserver(),当数据变更时将在回调函数中通知view进行渲染。但是在Compose中通过将livedata转变成有状态的数据,当它的状态发生改变时,那么引用该状态的控件就会重组,也就是重新绘制。
性能优化
LazyColum
Scaffold
Compose中都有哪些布局?
Compose里面的布局主要有
- Column:垂直方向线性布局
- Row:水平方向线性布局
- Box:帧布局
- ConstraintLayout:约束布局
- Scaffold:脚手架布局
MVVM
数据修改应该在ViewModel层进行,ViewModel作为View和Model之间的中间层,负责处理数据的获取、处理和更新。当用户在View层进行交互,比如点击一个按钮或者输入数据,View应该将这些操作转发给ViewModel,然后ViewModel根据业务逻辑来处理这些操作并更新数据。
这种做法有几个优势:
- 解耦和可测试性:通过将数据处理逻辑移到ViewModel,View与业务逻辑解耦,可以更容易编写单元测试,同时也让View更加清晰和易于维护。
- 代码重用:将业务逻辑放在ViewModel中,可以在不同的View中重用相同的ViewModel,减少代码冗余。
- 可扩展性:通过ViewModel作为中间层,可以更容易地引入新的功能和业务规则,而不需要修改View。
- 数据一致性:由ViewModel管理数据更新,可以确保不同的View都显示相同的数据,避免数据不一致的问题。
当然,在简单的场景下,一些小的数据操作可能直接在View层进行也是可以的,但是在复杂的应用中,建议遵循MVVM架构的原则,将数据修改逻辑放在ViewModel层,这样可以带来更多的优势和可维护性。