LoginSignup
16
10

More than 3 years have passed since last update.

最近のJetpack Compose事情

Last updated at Posted at 2020-11-11

Jetpack Compose も dev から alpha になり、2020/11 現在の Compose はどのようになっているのか、書いていこうと思います。

State

  • remember {} と State で状態を管理
  • State の値が変わることで Composable を再描画
  • remember { mutableStateOf() } の代わりに savedInstanceState {} を使うことで画面回転時にも値を復元できる
val mutableState = remember { mutableStateOf(default) }
var value by remember { mutableStateOf(default) }
var value by savedInstanceState { default }

レイアウト

  • Box、Column、Row での基本的なレイアウトや LazyColumn でのリスト表示や Constraint が用意されている
  • タップイベントや padding 、 align などのレイアウトに対する指定は Modifier で行う
    • dev の初期は padding も Composable でしたが、ネストが深くなるのでこの方法に変わっている
  • ViewPager や MotionLayout の Compose 版はまだない
@Composable
fun Example(
    onClick: () -> Unit
) {
    Column(
        Modifier
            .clickable(onClick = onClick)
            .padding(16.dp)
            .fillMaxWidth()
    ) {
        Row(verticalAlignment = Alignment.CenterVertically) {  }
        Spacer(Modifier.preferredSize(16.dp))
        Card(elevation = 4.dp) {  }
    }
}

Navigation

@Composable
fun App() {
    val navController = rememberNavController()
    NavHost(navController, startDestination = "profile") {
        composable("profile") { Profile(...) }
        composable("friends") { Friends(...) }
    }
}

@Composable
fun Profile(navController: NavController) {
    Button(onClick = { navController.navigate("friends") }) {
        Text(text = "Navigate next")
    }
}

Paging

@Composable
@OptIn(ExperimentalLazyDsl::class)
fun ItemsDemo(flow: Flow<PagingData<String>>) {
    val lazyPagingItems = flow.collectAsLazyPagingItems()
    LazyColumn {
        items(lazyPagingItems) {
            Text("Item is $it")
        }
    }
}

Material Component

  • これまでの Material Component にあった Component もほとんど用意されている
  • Jetpack Compose にはこれまでの Material Component にはなかった Backdrop が用意されている
  • Material Theming の仕組みも Jetpack Compose でそのままに用意されている
    • DarkTheme ももちろん対応
  • material-components-android-compose-theme-adapter という xml で定義していた theme をそのまま Compose で使うライブラリもある
  • Motion system の Compose 版はまだない  
  • material.icons パッケージにアイコンが用意されているので、リソースに追加しなくても Compose でアイコンが使える
    • ちなみにこのアイコンはコードにパスデータを持っている
@Composable
fun AppTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable() () -> Unit) {
    val colors = if (darkTheme) {
        DarkColorPalette
    } else {
        LightColorPalette
    }

    MaterialTheme(
        colors = colors,
        typography = typography,
        shapes = shapes,
        content = content
    )
}

Android Architecture Component の ViewModel や LiveData

  • Composable の中で viewModel() 関数を使うことで ViewModel を取得できる
  • LiveData.observeAsState() で State に変換して受け取ることができる
@Composable
fun Example() {
  val viewModel: ExampleViewModel = viewModel()
  val value: String by viewModel.value.observeAsState("initial")

  Text("Value is $value")
}

kotlin-coroutines

  • LaunchedTask (1.0.0-alpha07 で deprecated に) LaunchedEffect のブロックが suspend fun になっている
  • Flow.collectAsState() で State に変換して受け取ることができる
val value: String by stateFlow.collectAsState()
Text("Value is $value")

RxJava2

  • Observable.subscribeAsState() で State に変換して受け取ることができる
    • もちろん SingleCompletable などにも対応
val value: String by observable.subscribeAsState()
Text("Value is $value")

画像読み込み

  • accompanist に Coil、 Glide、Picasso を使って画像を表示させるライブラリがある

これまでの View との互換

  • Composable の AndroidView を使うことでこれまでの View を Composable の中でも使うことができる
// Compose a TextView.
AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })
// Compose a View and update its size based on state. Note the modifiers.
var size by remember { mutableStateOf(20) }
AndroidView(::View, Modifier.clickable { size += 20 }.background(Color.Blue)) { view ->
    view.layoutParams = ViewGroup.LayoutParams(size, size)
}
  • ComposeView を xml で使うことで View・Fragment 単位での Compose の利用ができる

その他

Compose が alpha になってから様々な既存のライブラリが Compose の対応を始めていたり、Compose 自体もたまにちょっと大き目の変更が入ることがあったりしながら安定性も高まってきていますね。
他にもこれ Compose 対応されてるよという話があったらコメントお願いします :pray:

16
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
10