Jetpack Compose 的 3 大错误(不惜一切代价避免)

第一个

package com.example.test_compose

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.MaterialTheme.colors
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import com.example.test_compose.ui.MainViewModel
import com.example.test_compose.ui.theme.Test_composeTheme

class MainActivity : ComponentActivity() {
    private val viewModel by viewModels<MainViewModel>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel.test()
        setContent {
            Test_composeTheme {
                // A surface container using the 'background' color from the theme
                Surface(modifier = Modifier.fillMaxSize(), color = colors.background) {
                    Mistake1()
                }
            }
        }
    }
}

@Composable
fun Mistake1() {
    val scrollState = rememberScrollState()
    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(scrollState)
    ) {
        for (i in 1..20) {
            MyListItem(
                scrollState = scrollState.value.toFloat(), modifier = Modifier.fillMaxWidth()
            )
        }

    }

}

@Composable
fun MyListItem(scrollState: Float, modifier: Modifier) {

    Text(text = "scroll Item", modifier = modifier
        .padding(32.dp)
        .graphicsLayer {
            translationX = scrollState
        })
}



上述会导致频繁绘制。

正确写法。也很简单

package com.example.test_compose

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.MaterialTheme.colors
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import com.example.test_compose.ui.MainViewModel
import com.example.test_compose.ui.theme.Test_composeTheme

class MainActivity : ComponentActivity() {
    private val viewModel by viewModels<MainViewModel>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel.test()
        setContent {
            Test_composeTheme {
                // A surface container using the 'background' color from the theme
                Surface(modifier = Modifier.fillMaxSize(), color = colors.background) {
                    Mistake1()
                }
            }
        }
    }
}

@Composable
fun Mistake1() {
    val scrollState = rememberScrollState()
    Column(
        modifier = Modifier
            .fillMaxSize()
            .verticalScroll(scrollState)
    ) {
        for (i in 1..20) {
            MyListItem(
                scrollState = {
                    scrollState.value.toFloat()
                }, modifier = Modifier.fillMaxWidth()
            )
        }

    }

}

@Composable
fun MyListItem(scrollState: () -> Float, modifier: Modifier) {

    Text(text = "scroll Item", modifier = modifier
        .padding(32.dp)
        .graphicsLayer {
            translationX = scrollState()
        })
}



将复杂的重绘放到一个方法里面

{

}

每次变动才重新绘制 而不是没20个条目变动一起绘制

错误2

@Composable
fun LoginScreen(viewModel: MainViewModel) {
    val scope = rememberCoroutineScope()
    Box {
        Button(onClick = {

            scope.launch {
                viewModel.test()
            }
        }) {}
    }

}

 

而是应该用

 

 错误3

 @Composable
    fun LoginScreen(
        isLoggedIn: Boolean,
        navController: NavController
    ) {
        if (isLoggedIn) {
            navController.navigate("main_screen")
        }
        Box {
            
        }
    }

正确写法

    @Composable
    fun LoginScreen(
        isLoggedIn: Boolean,
        navController: NavController
    ) {
        LaunchedEffect(key1 = isLoggedIn, block ={
            if (isLoggedIn) {
                navController.navigate("main_screen")
            }
        } )

        Box {

        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值