本文链接
Model:数据/模型,对数据获取不依赖View
View:视图,不同架构中充当角色不同 xml(java)/composable/kotlin
C/P/VM:处理View和Model之间的交互逻辑
无架构适合的场景?
优点:
在无架构的基础上分理出Model层
缺点:
Android平台的实现中,有大量的View的操作在COntroller(Activity)中
适合场景:
Presenter:处理View和Model的交互
View:Activity、Fragment、xml
思考:如果Presenter可以操作View和Model,不就等于是之前的Activity吗?
组成部分:
优点:充分解耦、逻辑清晰
缺点:接口过多
V: Activity、Fragment、xml => 不再需要IView接口 => 双向绑定 => Google实现 DataBinding
VM:ViewModel + LiveData
ViewBinding和DataBinding区别:
private val _pageState: MutableLiveData<PageState> = MutableLiveData()
val pageState:LiveData<PageState> = _pageState // 对外使用
mViewModel.doLogin() // mvvm形式
mViewModel xxx {
Intent(DoLogin, xxx, xxx)
}
I: 将VM编程意图Intent
强调数据单向流动:
MVI流程:ui,intent,viewmodel,uistate,ui
Model
View:Activity、Fragment、composable
ViewModel:LiveData => stateOf
Snapshot是什么?
具体来说,Compose的快照机制涉及以下几个主要步骤:
Snapshot快照机制的优点
要点
App页面:首页、服务、我的
首页:Tab列表+RV(item = 简单文字 or 图片 + 文件)
Fragment + Adapter(需要把数据适配到Fragment和View上) => Composable
1、传统RV+RV.adapter中写onBindViewHolder有什么问题吗?
汽车负责开车:单一职责原则
电车/油车继承汽车,不能直接改造汽车:开闭原则
电车要能继续跑,儿子需要像爸爸:里式替换原则
汽车要和路/人交互,要依赖接口:依赖倒置原则
汽车和每个交互目标,都有一个个接口:接口隔离原则
汽车要运载人,人还要携带物品,汽车和人直接交互==要有限的和其他对象交互(不要了解其内部细节,不和不直接对象交互):迪米特原则,最少知识原则
原来Fragment、RV代码有太多的适配器代码,各种if判断等模板代码
implementation "com.google.accompanist:accompanist-navigation-compose:0.21.0" //用于在 Android Jetpack Compose 中集成导航组件(Navigation Component)。
implementation "com.google.accompanist:accompanist-navigation-animation:0.28.0" // Navigation动画
implementation "com.google.accompanist:accompanist-pager:0.21.0" // ViewPager
implementation "com.google.accompanist:accompanist-swiperefresh:0.21.0" // 添加下拉刷新功能
implementation "com.google.accompanist:accompanist-systemuicontroller:0.21.0" // 设置应用顶部状态栏和底部导航栏的颜色。
implementation "com.google.accompanist:accompanist-insets:0.21.0" //【已经弃用】foundation中// 用来调整系统状态栏、导航栏等的padding以更加友好的适配屏幕内的组件
implementation "com.google.accompanist:accompanist-pager-indicators:0.21.0" // 添加页面指示器
implementation "com.google.accompanist:accompanist-permissions:0.28.0" // 权限申请
implementation "com.google.accompanist:accompanist-flowlayout:0.28.0" // 流式布局(可以自动换行)
implementation "com.google.accompanist:accompanist-webview:0.28.0" // WebView
implementation "com.google.accompanist:accompanist-glide:0.28.0" // 【已经弃用】支持glide,建议用coil
implementation "com.google.accompanist:accompanist-coil:0.28.0" // 支持kotlin
// 其他单独库
implementation "androidx.constraintlayout:constraintlayout-compose:1.0.1"
// Coil图片加载库
implementation "io.coil-kt:coil-compose:2.2.2"
implementation "io.coil-kt:coil-svg:2.2.2"
// Landscapist:使用coil 在svg放大和缩小时有问题,不是矢量图
implementation "com.github.skydoves:landscapist-coil:2.0.3"
// Landscapist:结合 Glide 和 Fresco 一起使用
implementation "com.github.skydoves:landscapist-glide:2.1.0"
// Cloudy 是一个专门处理Jectpack Compose中的Blur高斯模糊效果的支持库
implementation "com.github.skydoves:cloudy:0.1.1"
根据数据类型自动加载Composable,而且新增一个样式,完全不需要修改之前的代码。(RV是需要修改的)
实现类:
lazycolumn + TitleComposable自定义标题Item + TitleImageComposable自定义图片标题Item(NetWorkImage(Glide/Coil加载图片))
@Composable相当于suspend语言级别
Recompose不是重新执行一边
kotlin秒杀Java(默认参数)
Fragment兼容Compose
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 原先的Fragment代码
// return inflater.inflate(R.layout.fragment_blank, container, false)
// Compose兼容版本
return ComposeView(requireContext()).apply {
setContent {
// UI代码
}
}
}
加载列表数据:
val contentList = mutableStateListOf<Any>() // 存放列表数据
LazyColumn{
items(contentList.size){
if(contentList[it] is TitleModel){
TitleComposable(model = contentList[it] as TitleModel)
}else if(contentList[it] is TitleImageModel){
TitleImageComposable(model = contentList[it] as TitleImageModel)
}
}
}
TitleModel:存放数据
TitleComposable:视图
// 数据转换
// 网络请求后,数据转换为Model并添加到List中即可