0
点赞
收藏
分享

微信扫一扫

Jetpack Compose简易入坑,教你如何增加拿到BAT大厂offer几率

泠之屋 2022-03-11 阅读 46
面试

到这里,我们可以了解到:

  • 1 Compose是声明式UI,不是传统的命令式UI,不是拿着View去setXXX(),而是用函数去描述一种UI状态。

  • 2 Compose采用的是属性细化和行为隔离的思想,比如demo里面,text就是Text直接的属性,而background是modifier的一个属性,因为像图片Image就没有text属性,但是却有background属性,所以Compose就将公有属性提取到Modifier中,将独有属性绑定到View自身,这就是一种属性细化的思想,而且点击事件是在Modifier中,也就是通过Modifier来控制行为,这就是行为和属性分开。换句话说,View本身只负责描述自身固有属性,Modifier负责描述扩展属性和行为,这样设计更人性化,变相降低了耦合。

实践


先看效果:

很简单,输入关键词,点击搜索,就列出包含关键词的条目,关键词为空就列出全部,如果我们用原生实现,可能需要写一个RecyclerView,一个Adapter,一个ViewHolder…,我们来看Compose版本的:

1 实现上方Searchbar

@Composable

fun SearchBar(onSearch: (keyword: String) -> Unit) {

var value by remember { mutableStateOf("") }

OutlinedTextField(

label = { Text(text = “Please input keyword”) },

value = value,

onValueChange = { value = it },

modifier = Modifier

.padding(horizontal = 16.dp)

.fillMaxWidth(),

singleLine = true,

textStyle = TextStyle(color = Color.DarkGray, fontWeight = FontWeight.W700),

trailingIcon = @Composable { Image(imageVector = Icons.Filled.Clear, contentDescription = null, Modifier.clickable { value = “” }) },

keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),

keyboardActions = KeyboardActions(onSearch = { onSearch.invoke(value) }),

)

}

复制代码

函数接收一个onSearch()方法,传递一个String;OutlinedTextField可以理解为EditText,value就等价于EditText的text属性,trailingIcon表示尾部图标,就是那个关闭的X,点击它的时候,我们把value设置为空串,等价于清除,keyboardOptions表示键盘return的图标,我们定义为ImeAction.Search,也就是搜索;keyboardActions表示点击return执行的方法,我们直接调用onSearch(),如图:

示例

红色的x就是trailingIcon指定的,搜索就是keyboardOptions指定的。

2 实现下方列表

@Composable

fun ContentList(contentData: ContentsListData) {

val contents by contentData.getDisplayData().observeAsState(listOf())

LazyColumn(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.Start) {

items(contents) { content ->

Text(text = content, modifier = Modifier.padding(4.dp))

}

}

}

复制代码

函数接收一个LiveData;其中LazyColumn可以理解为Compose中的RecyclerView,items是内部的一个lambda,表示将contents这个list展开,然后去构造Text,contents的size是多少,就会构造多少个Text。

3 组合UI

@Composable

fun HomeScreen() {

Column {

SearchBar { keyword ->

Toast.makeText(this@MainActivity, “keyword is $keyword”, Toast.LENGTH_SHORT).show()

viewModel.filter(keyword = keyword)

}

Spacer(modifier = Modifier.size(8.dp))

ContentList(contentData = viewModel)

}

}

复制代码

Column等价于LinearLayout,Spacer等价于一个空白View,用来作为分割线。

4 数据部分

ContentsListData代码如下:

interface ContentsListData {

fun getDisplayData(): MutableLiveData<MutableList>

}

class MainViewModel : ViewModel(), ContentsListData {

// 所有数据

var totalDatas = MutableLiveData<MutableList>()

// 需要展示的数据

val displayDatas = MutableLiveData<MutableList>()

init {

// 添加测试数据

val totalList = mutableListOf()

for (index in 1…100) {

totalList.add(“content $index”)

}

val displayList = mutableListOf()

totalList.forEach { displayList.add(it) }

totalDatas.value = totalList

displayDatas.value = displayList

}

fun filter(keyword: String) {

val list: MutableList = mutableListOf()

if (keyword.isEmpty()) {

// 如果关键词是空,就展示所有数据

totalDatas.value?.forEach { list.add(it) }

} else {

要如何成为Android架构师?

搭建自己的知识框架,全面提升自己的技术体系,并且往底层源码方向深入钻研。
大多数技术人喜欢用思维脑图来构建自己的知识体系,一目了然。这里给大家分享一份大厂主流的Android架构师技术体系,可以用来搭建自己的知识框架,或者查漏补缺;

最后我必须强调几点:

1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。
2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识
3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。

你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境

跳槽进大厂;

最后我必须强调几点:

1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。
2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要! 最后你达到什么水平取决你消化了多少知识
3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。

你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境

举报

相关推荐

0 条评论