Google berkomitmen untuk mendorong terwujudnya keadilan rasial bagi komunitas Kulit Hitam. Lihat caranya.

Compose

Menentukan UI Anda secara terprogram dengan fungsi yang dapat dikomposisi yang mendeskripsikan bentuk dan dependensi datanya.

Update Terbaru Rilis Saat Ini
24 Juni 2020 0.1.0-dev14

Mendeklarasikan dependensi

Untuk menambahkan dependensi pada Compose, Anda harus menambahkan repositori Maven Google ke project Anda. Baca repositori Maven Google untuk informasi selengkapnya.

Tambahkan dependensi untuk artefak yang diperlukan dalam file build.gradle bagi aplikasi atau modul Anda:

dependencies {
    implementation "androidx.compose:compose-runtime:0.1.0-dev14"
}

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerVersion "1.3.70-dev-withExperimentalGoogleExtensions-20200424"
        kotlinCompilerExtensionVersion "0.1.0-dev14"
    }
}

Untuk informasi dependensi selengkapnya, lihat Menambahkan dependensi build.

Masukan

Masukan Anda membantu meningkatkan kualitas Jetpack. Beri tahu kami jika Anda menemukan masalah baru atau memiliki ide untuk meningkatkan kualitas library ini. Harap lihat masalah yang ada di library ini sebelum Anda membuat laporan baru. Anda dapat memberikan suara pada masalah yang ada dengan mengklik tombol bintang.

Melaporkan masalah baru

Lihat dokumentasi Issue Tracker untuk informasi selengkapnya.

Versi 0.1.0-dev

Versi 0.1.0-dev14

24 Juni 2020

androidx.compose:compose-compiler:0.1.0-dev14 dan androidx.compose:compose-runtime:0.1.0-dev14 dirilis. Versi 0.1.0-dev14 berisi commit berikut.

Perubahan API

  • Fungsi yang dapat dikomposisi Recompose tidak lagi menjadi abstraksi yang berguna. Sebagian besar rekomposisi harus terjadi sebagai hasil penugasan MutableState. Untuk hal-hal selain itu, sebaiknya Anda menggunakan fungsi invalidate untuk memicu rekomposisi cakupan saat ini. (Ifc992)
  • Observe bukan lagi abstraksi yang berguna. Jika Anda perlu menggandakannya, implementasinya dapat direplikasi hanya dengan membuat fungsi yang dapat dikomposisi yang menjalankan parameter lambda yang dapat dikomposisi. Misalnya, @Composable fun Observe(body: @Composable () -> Unit) = body() (I40d37)
  • @Direct tidak digunakan lagi dan digantikan dengan @ComposableContract(restartable=false) (If4708)

Perbaikan Bug

  • androidx.ui.foundation.TextFieldValue dan androidx.ui.input.EditorValue tidak digunakan lagi. Fungsi yang dapat dikomposisi TextField, FilledTextField, dan CoreTextField yang menggunakan jenis tersebut juga tidak digunakan lagi. Harap gunakan androidx.ui.input.TextFieldValue saja (I4066d, b/155211005)

Kontribusi Eksternal

  • Flow<T>.collectAsState() tidak digunakan lagi tanpa nilai awal. Gunakan StateFlow<T> atau teruskan nilai awal eksplisit. (I63f98, b/157674865).
    • Terima kasih kepada Zach Klippenstein dari Square atas kontribusinya dalam perubahan berikut!

Versi 0.1.0-dev13

10 Juni 2020

androidx.compose:compose-compiler:0.1.0-dev13 dan androidx.compose:compose-runtime:0.1.0-dev13 dirilis. Versi 0.1.0-dev13 berisi commit berikut.

Masalah Umum

  • Jika aplikasi bergantung pada androidx.core:core-ktx:1.2.0 dan menggunakan FontFamily dengan beberapa font/ketebalan font, font akan dirender dengan ketebalan reguler. Kami akan menangani masalah ini, solusi sementaranya adalah dengan menggunakan androidx.core:core-ktx:1.2.0-alpha01 atau androidx.core:core-ktx:1.1.0.

Versi 0.1.0-dev12

27 Mei 2020

androidx.compose:compose-compiler:0.1.0-dev12 dan androidx.compose:compose-runtime:0.1.0-dev12 dirilis. Versi 0.1.0-dev12 berisi commit berikut.

Perubahan API

  • Mengubah strategi pembuatan kode compiler Compose. Sebelum perubahan, compiler compose akan mengubah panggilan ke fungsi yang dapat dikomposisi. Dengan perubahan ini, sekarang kami mengubah isi fungsi yang dapat dikomposisi dan membiarkan callsite tidak berubah (sebagian besarnya).

    Artinya, sebagian besar logika yang digunakan untuk berkomunikasi dengan runtime compose terjadi di awal isi fungsi, bukan di callsite.

    Ini seharusnya menjadi perubahan yang kompatibel dengan sumber untuk semua penggunaan compose. Sebagian besar pengguna compose tidak perlu mengupdate kode apa pun karena perubahan ini.

    Untuk mendukung tugas ini, tanda tangan JVM dari semua fungsi yang dapat dikomposisi telah berubah. Fungsi yang dapat dikomposisi yang menerima satu parameter diubah menjadi fungsi yang menerima 3 parameter. Parameter tambahannya adalah Composer, bilangan bulat 'kunci', dan bilangan bulat bitmask yang digunakan untuk menyebarkan metadata melalui panggilan.

    Compose kini juga mengubah argumen default ke fungsi yang dapat dikomposisi. Hal ini dilakukan tanpa menimbulkan kelebihan beban default pada fungsi itu sendiri, sehingga perubahan ini akan menyebabkan lebih sedikit fungsi yang ditentukan.

    Perubahan perilaku disengaja dan diketahui yang dihasilkan dari tindakan berikut:

    1. Beberapa panggilan akan melewati bagian, di mana tidak pernah dilakukan sebelumnya
    2. Ekspresi yang dapat dikomposisi dalam ekspresi argumen default kini berlangganan dan ditangani dengan benar

    Tugas ini mencakup beberapa pengoptimalan:

    1. Hasil perbandingan parameter disebarkan melalui grafik panggilan ke fungsi yang dapat dikomposisi lainnya. Ini akan menyebabkan lebih sedikit perbandingan pada saat runtime, mengurangi ukuran tabel slot, serta lebih banyak melewatkan fungsi yang dapat dikomposisi yang sebelumnya tidak dilewati
    2. Parameter yang ditetapkan sebagai "statis" pada waktu kompilasi tidak lagi dibandingkan atau disimpan di runtime. Hal ini mengurangi jumlah perbandingan dan mengurangi ukuran tabel slot.
    3. Struktur alur kontrol pada bagian isi fungsi digunakan untuk meminimalkan jumlah kelompok yang dihasilkan. Tindakan ini mengurangi ukuran tabel slot dan menyebabkan lebih sedikit tugas untuk runtime
    4. Parameter pengirim dan penerima ke fungsi yang tidak terpakai tidak akan disertakan dalam menentukan kemampuan melewati fungsi jika tidak digunakan di dalam bagian isi fungsi.

    Sebagian besar perubahan yang dapat menyebabkan gangguan terjadi pada API yang ditargetkan oleh compiler secara langsung, dan penggunaan compose biasanya tidak akan terpengaruh:

    1. Composer::startExpr telah dihapus
    2. Composer::endExpr telah dihapus
    3. Composer::call tidak digunakan lagi
    4. Kelebihan beban non-vararg pada key telah dihapus. Gunakan versi vararg ke depannya.
    5. Anotasi Pivotal tidak digunakan lagi. Gunakan key sebagai pengganti.
    6. ScopeUpdateScope::updateScope diubah untuk mengharapkan Function3, bukan Function1
    7. restartableFunction dan restartableFunctionN diupdate untuk menyertakan parameter waktu kompilasi tambahan

    (I60756, b/143464846)

  • Menambahkan adapter untuk StateFlow yang diperkenalkan baru-baru ini yang memungkinkan untuk mengisi terlebih dahulu nilai awal sehingga Status yang ditampilkan tidak dapat null (I61dd8, b/156233789)

Anotasi @Model tidak digunakan lagi

  • Anotasi @Model kini tidak digunakan lagi. Gunakan state dan mutableStateOf sebagai alternatif. Keputusan penghentian ini tercapai setelah diskusi yang dilakukan secara saksama.

    Justifikasi

    Alasan mencakup, tetapi tidak terbatas pada:

    • Mengurangi konsep dan area permukaan API yang perlu diajari
    • Lebih selaras dengan toolkit lainnya yang dapat dibandingkan (Swift UI, React, Flutter)
    • Keputusan yang reversibel. Kami dapat selalu mengembalikan @Model di lain waktu.
    • Menghapus penggunaan corner-case dan kesulitan untuk menjawab pertanyaan tentang mengonfigurasi @Model sebagai hal-hal yang perlu ditangani
      • Class data @Model, yang setara, kode hash, dll.
      • Bagaimana cara membuat beberapa properti "diamati" dan yang lainnya tidak?
      • Bagaimana cara menentukan kesetaraan struktural vs. referensi untuk digunakan dalam pengamatan?
    • Mengurangi "keganjilan" dalam sistem. Akan mengurangi kemungkinan seseorang menganggap sistem lebih cerdas dari seharusnya (contoh, mengetahui cara membedakan daftar)
    • Membuat perincian pengamatan lebih intuitif.
    • Meningkatkan kemampuan pemfaktoran ulang dari variabel -> properti pada class
    • Berpotensi membuka kemungkinan untuk melakukan pengoptimalan khusus Status secara manual
    • Lebih selaras dengan bagian ekosistem lainnya dan mengurangi ambiguitas terhadap immutable atau "menerapkan status yang dapat diubah"

    Catatan Migrasi

    Hampir semua penggunaan @Model yang sudah ada telah diubah dengan baik menggunakan salah satu dari dua cara. Contoh di bawah ini menampilkan class @Model dengan dua properti hanya untuk keperluan contoh, dan menunjukkan class tersebut saat sedang digunakan dalam fungsi yang dapat dikomposisi.

    @Model class Position(
     var x: Int,
     var y: Int
    )
    
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

    Alternatif 1: Gunakan State<OriginalClass> dan buat salinan.

    Pendekatan ini dibuat lebih mudah dengan class data Kotlin. Intinya, buat semua properti var sebelumnya menjadi properti val pada class data, kemudian gunakan state sebagai ganti dari remember, lalu tetapkan nilai status ke salinan clone aslinya menggunakan metode praktis copy(...) class data.

    Penting untuk diperhatikan bahwa pendekatan ini hanya berfungsi saat satu-satunya mutasi ke class tersebut dilakukan dalam cakupan yang sama tempat instance State dibuat. Jika class secara internal bermutasi sendiri di luar cakupan penggunaan tersebut, dan Anda mengandalkan pengamatannya, maka pendekatan berikutnya adalah yang sebaiknya Anda gunakan.

    data class Position(
     val x: Int,
     val y: Int
    )
    
    @Composable fun Example() {
     var p by state { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p = p.copy(x=it) }
       onYChange={ p = p.copy(y=it) }
     )
    }
    

    Alternatif 2: Gunakan mutableStateOf dan delegasi properti

    Pendekatan ini dibuat lebih mudah dengan delegasi properti Kotlin dan mutableStateOf API yang memungkinkan Anda membuat instance MutableState di luar komposisi. Intinya, ganti semua properti var dari class asal menggunakan properti var dengan mutableStateOf sebagai delegasi propertinya. Hal ini memiliki keuntungan bahwa penggunaan class tidak akan berubah sama sekali, kecuali implementasi internalnya. Perilaku ini tidak sepenuhnya identik dengan contoh aslinya, karena setiap properti saat ini diamati/berlangganan satu per satu, sehingga rekomposisi yang Anda lihat setelah pemfaktoran ulang berikut dapat menjadi lebih sempit (hal yang baik).

    class Position(x: Int, y: Int) {
     var x by mutableStateOf(x)
     var y by mutableStateOf(y)
    }
    
    // source of Example is identical to original
    @Composable fun Example() {
     var p = remember { Position(0, 0) }
     PositionChanger(
       position=p,
       onXChange={ p.x = it }
       onYChange={ p.y = it }
     )
    }
    

    (I409e8, b/152050010, b/146362815, b/146342522, b/143413369, b/135715219, b/143263925, b/139653744)

Perbaikan Bug

  • Menghapus DrawBackground API dan diganti dengan API ekstensi drawBackground di Pengubah. Memfaktorkan ulang implementasi drawBackground paint, kuas, dan warna untuk mengurangi jalur kode serta menghapus persyaratan agar Pengubah dibuat sebagai bagian dari komposisi. (I0343a, b/155999867)

Versi 0.1.0-dev11

14 Mei 2020

androidx.compose:compose-compiler:0.1.0-dev11 dan androidx.compose:compose-runtime:0.1.0-dev11 dirilis. Versi 0.1.0-dev11 berisi commit berikut.

Perubahan API

  • Menambahkan adapter untuk Alur. Contoh penggunaan:

    val value by flow.collectAsState()
    

    (If2198, b/153375923)

Perbaikan Bug

  • Mengupdate API compose dengan level yang lebih tinggi yang mengekspos Canvas untuk mengekspos CanvasScope. Tindakan ini akan menghapus keperluan konsumen untuk mengelola objek Paint-nya. Bagi konsumen yang masih memerlukan akses ke Canvas, mereka dapat menggunakan metode ekstensi drawCanvas yang menyediakan callback untuk mengeluarkan perintah menggambar menggunakan Canvas yang mendasarinya. (I80afd)
  • API lambda akhir WithConstraints telah diubah. Sebagai ganti dari dua parameter, kini API tersebut memiliki cakupan penerima, selain batasan dan layoutDirection tambahan yang menyediakan properti minWidth, maxWidth, minHeight, dan maxHeight di Dp (I91b9, b/149979702)
  • Menambahkan pengubah padding simetris. (I39840)

Versi 0.1.0-dev10

29 April 2020

androidx.compose:compose-compiler:0.1.0-dev10 dan androidx.compose:compose-runtime:0.1.0-dev10 dirilis. Versi 0.1.0-dev10 berisi commit berikut ini.

Fitur Baru

  • Dikembangkan ulang berdasarkan versi backend IR compiler Kotlin yang lebih baru, artinya ada banyak fitur yang sebelumnya tidak berfungsi dengan backend IR (seperti coroutine yang tidak bisa dikomposisi!) kini menjadi berfungsi. Artinya, Anda akan menerima lebih sedikit pesan "Error Backend Internal", serta tidak perlu repot memisahkan kode Anda ke modul IR dan non-IR. Namun, backend IR masih bersifat eksperimental dan memiliki beberapa bug (hanya saja jauh lebih sedikit), jadi cobalah berbagai hal dan nikmati, tetapi perlu diperhatikan bahwa ini masih dalam proses.

Versi 0.1.0-dev09

15 April 2020

androidx.compose:compose-compiler:0.1.0-dev09 dan androidx.compose:compose-runtime:0.1.0-dev09 dirilis. Versi 0.1.0-dev09 berisi commit berikut.

Perubahan API

  • Operator delegasi properti [Mutable]State dipindahkan ke ekstensi untuk mendukung pengoptimalan delegasi properti Kotlin 1.4. Pemanggil harus menambahkan impor untuk terus menggunakan by state { ... } atau by mutableStateOf(...). (I5312c)

Perbaikan Bug

  • Memperbarui wrapContentWidth dan wrapContentHeight yang mengharapkan Alignment vertikal atau horizontal, bukan Alignment. Pengubah gravitasi diperbarui untuk menerima Alignment vertikal atau horizontal. Row, Column, dan Stack diperbarui untuk mendukung Alignment kustom berkelanjutan. (Ib0728)
  • Modul ui-text diganti namanya menjadi ui-text-core (I57dec)
  • Menyempurnakan DrawModifier API ((Ibaced, b/152919067)):
    • Membuat cakupan penerima untuk draw() ContentDrawScope
    • Menghapus semua parameter pada draw()
    • DrawScope memiliki antarmuka yang sama seperti CanvasScope terdahulu
    • ContentDrawScope memiliki metode drawContent()
  • ColoredRect tidak digunakan lagi. Silakan gunakan Box(Modifier.preferredSize(width, height).drawBackground(color)). (I499fa, b/152753731)

Versi 0.1.0-dev08

1 April 2020

androidx.compose:compose-compiler:0.1.0-dev08 dan androidx.compose:compose-runtime:0.1.0-dev08 dirilis. Versi 0.1.0-dev08 berisi commit berikut.

Perbaikan Bug

  • Penggantian operator Modifier plus dengan fungsi ekstensi pabrik (I225e4)
  • Anggota RowScope dan ColumnScope kini dapat diakses dari luar Baris dan Kolom. (I3a641)

Versi 0.1.0-dev07

18 Maret 2020

androidx.compose:compose-compiler:0.1.0-dev07 dan androidx.compose:compose-runtime:0.1.0-dev07 dirilis. Versi 0.1.0-dev07 berisi commit berikut.

Perubahan API

  • androidx.compose.ViewComposer telah dipindahkan ke androidx.ui.node.UiComposer. (Idef00)
  • androidx.compose.Emittable telah dihapus Kode ini redundan dengan ComponentNode. (Idef00)
  • `androidx.compose.ViewAdapters telah dihapus. Hal tersebut bukan lagi kasus penggunaan yang didukung. (Idef00)
  • Compose.composeInto tidak digunakan lagi. Gunakan setContent atau setViewContent saja. (Idef00)
  • Compose.disposeComposition tidak digunakan lagi. Gunakan saja metode dispose pada Composition yang ditampilkan oleh setContent. (Idef00)
  • androidx.compose.Compose.subcomposeInto telah pindah ke androidx.ui.core.subcomposeInto. (Idef00)
  • ComponentNode#emitInsertAt diganti namanya menjadi ComponentNode#insertAt. (Idef00)
  • ComponentNode#emitRemoveAt diganti namanya menjadi ComponentNode#removeAt. (Idef00)
  • ComponentNode#emitMode diganti namanya menjadi ComponentNode#move. (Idef00)

Perbaikan Bug

  • Mengganti nama LayoutFlexible menjadi LayoutWeight. Mengganti nama parameter tight menjadi fill. (If4738)
  • WithConstraints mendapatkan parameter LayoutDirection (I6d6f7)

Versi 0.1.0-dev06

4 Maret 2020

androidx.compose:compose-compiler:0.1.0-dev06 dan androidx.compose:compose-runtime:0.1.0-dev06 dirilis. Versi 0.1.0-dev06 berisi commit berikut.

Fitur Baru

  • Memperbarui flag ComposeFlags.COMPOSER_PARAM menjadi true, yang akan mengubah strategi pembuatan kode untuk plugin compose. Pada tingkat tinggi, hal ini menyebabkan fungsi @Composable dibuat dengan parameter sintetik tambahan, yang akan diteruskan ke panggilan @Composable berikutnya agar runtime dapat mengelola eksekusi dengan benar. Ini adalah perubahan yang dapat menyebabkan gangguan biner yang signifikan, tetapi semestinya dapat menjaga kompatibilitas tingkat sumber pada semua penggunaan compose yang disetujui. (aosp/1226314)

Versi 0.1.0-dev05

19 Februari 2020

androidx.compose:compose-compiler:0.1.0-dev05 dan androidx.compose:compose-runtime:0.1.0-dev05 dirilis. Versi 0.1.0-dev05 berisi commit berikut.

Perubahan API

  • Perubahan yang dapat menyebabkan gangguan pada API ambien. Lihat log dan dokumentasi Ambient<T> untuk detail selengkapnya (I4c7ee, b/143769776)

Perbaikan Bug

  • Mengganti ButtonStyle dengan fungsi yang berbeda dan penghapusan kelebihan beban pada teks (string). Lihat contoh terbaru untuk informasi penggunaan. (If63ab, b/146478620, b/146482131)

Versi 0.1.0-dev04

29 Januari 2020

androidx.compose:compose-compiler:0.1.0-dev04 dan androidx.compose:compose-runtime:0.1.0-dev04 dirilis. Commit yang disertakan dalam versi ini dapat dilihat di sini.

Perubahan API

  • Callback areEquivalent telah ditambahkan ke MutableState (Ic2ef8)
  • API komponen dan komposisi tingkat atas refactor telah dihapus (I1f22e)
  • Mentransformasi panggilan yang dapat dikomposisi dengan parameter composer (I1691e)
  • Menghapus class Composition yang menggantikan class dasar Composer (Ieadbf)
  • Menandai State<T> dan MutableState<T> sebagai jenis stabil (b/146557624)
  • Menambahkan currentComposerIntrinsic dan pengujian untuk memastikan penerusan parameter yang tepat (I133f0)
  • ModelObserver telah dibuat menjadi thread tunggal. (Ica33d)
  • Membuat grup dengan tepat dalam panggilan yang dapat dikomposisi inline (Ibf739)
  • Menghapus anotasi EffectsDsl yang tidak digunakan Ibe81d)
  • Anotasi @Stable telah ditambahkan. Pengubah telah ditandai sebagai stabil. (Iacba7)
  • API MutableState, State, mutableStateOf telah diperkenalkan (I98291)
  • Efek telah difaktorkan ulang ke @Composable (Ie2686)
  • Performa ObserverMap dan ModelObserver telah ditingkatkan. (Ieb9b6)
  • Pengamatan baca telah diubah untuk memungkinkan pengamatan non-ComponentNode. (Ia4d93)