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

Compose Runtime

Elemen penyusun yang penting untuk model pemrograman dan pengelolaan status Compose, serta runtime inti untuk ditarget Compose Compiler Plugin.
Update Terbaru Rilis Stabil Saat Ini Kandidat Rilis Berikutnya Rilis Beta Rilis Alfa
1 Oktober 2020 - - - 1.0.0-alpha04

Struktur

Compose adalah kombinasi 7 ID Grup Maven dalam androidx. Setiap Grup berisi subkumpulan fungsi yang ditargetkan, masing-masing dengan kumpulan catatan rilisnya sendiri.

Tabel ini menjelaskan grup tersebut dan memiliki link ke setiap kumpulan catatan rilis.

GrupDeskripsi
compose.animationMem-build animasi di aplikasi Jetpack Compose untuk memperkaya pengalaman pengguna.
compose.compilerMentransformasi @Composable function dan mengaktifkan pengoptimalan dengan plugin compiler Kotlin.
compose.foundationMenulis aplikasi Jetpack Compose dengan elemen penyusun siap pakai dan memperluas dasar untuk mem-build bagian sistem desain Anda sendiri.
compose.materialMem-build Jetpack Compose UI dengan Komponen Desain Material siap pakai. Ini adalah titik masuk pada tingkat yang lebih tinggi untuk Compose, yang dirancang untuk menyediakan komponen yang cocok dengan yang dijelaskan di www.material.io.
compose.runtimeElemen penyusun yang penting untuk model pemrograman dan pengelolaan status Compose, serta runtime inti untuk ditarget Compose Compiler Plugin.
compose.uiKomponen dasar compose UI yang diperlukan untuk berinteraksi dengan perangkat, termasuk tata letak, gambar, dan input.
uiBerfungsi dengan library Jetpack Compose.

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.runtime:runtime:1.0.0-alpha03"
    implementation "androidx.compose.runtime:runtime-livedata:1.0.0-alpha03"
    implementation "androidx.compose.runtime:runtime-rxjava2:1.0.0-alpha03"
}

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerVersion "1.4.0"
        kotlinCompilerExtensionVersion "1.0.0-alpha03"
    }
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
    kotlinOptions {
        jvmTarget = "1.8"
        freeCompilerArgs += ["-Xallow-jvm-ir-dependencies", "-Xskip-prerelease-check"]
    }
}

Untuk informasi dependensi selengkapnya, lihat Menambahkan dependensi build.

Masukan

Masukan Anda membantu meningkatkan kualitas Jetpack. Beri tahu kami jika Anda menemukan masalah baru atau punya masukan untuk meningkatkan kualitas library ini. Harap periksa masalah yang sudah diketahui dalam library ini sebelum membuat laporan baru. Anda dapat memberikan suara untuk masalah yang sudah diketahui dengan mengklik tombol bintang.

Melaporkan masalah baru

Lihat dokumentasi Issue Tracker untuk informasi selengkapnya.

Versi 1.0.0

Versi 1.0.0-alpha04

1 Oktober 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha04 dirilis. Versi 1.0.0-alpha04 berisi commit berikut ini.

Perubahan API

  • Menambahkan OwnerScope untuk mengizinkan pengumpulan cakupan tata letak dan observasi gambar setelah tidak valid lagi. (Ic4cf8)
  • Menambahkan API derivedStateOf untuk membuat objek State berdasarkan penghitungan yang dapat membaca (dan mengambil dari) objek State lain (If758b)
  • Menambahkan API TestOnly untuk SnapshotStateObserver (I6e2a9)

Perbaikan Bug

  • foundation.Box sudah tidak digunakan lagi. Sebagai gantinya, gunakan foundation.layout.Box. (Ie5950, b/167680279)

Versi 1.0.0-alpha03

16 September 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha03 dirilis. Versi 1.0.0-alpha03 berisi commit berikut ini.

Perubahan API

  • CompositionCoroutineScope tidak lagi mengimplementasikan MonotonicFrameClock. Pemanggil withFrameNanos harus mengimpor fungsi tingkat atas secara eksplisit. (Icb642, b/166778123)

Perbaikan Bug

  • Fungsi pengujian global seperti onNode atau waitForIdle kini tidak digunakan lagi. Bermigrasilah ke fungsi versi baru yang ditetapkan di ComposeTestRule (I7f45a)
  • launchInComposition tidak lagi meluncurkan coroutine yang tidak dikirimkan (Ief6af, b/166486000)

Versi 1.0.0-alpha02

2 September 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha02 dirilis. Versi 1.0.0-alpha02 berisi commit berikut.

Perubahan API

  • Menambahkan API snapshotFlow dan withMutableSnapshot untuk menggunakan dan memproduksi perubahan data Snapshot. (I3e722)
  • Konvensi pemanggilan untuk fungsi yang dapat dikomposisi telah berubah. Ini adalah perubahan yang dapat menyebabkan gangguan biner. Semua library harus dikompilasi ulang agar berfungsi dengan versi plugin compiler compose saat ini.

    Perubahan ini tidak membuat perubahan yang dapat menyebabkan gangguan tingkat sumber karena satu-satunya API yang telah berubah adalah API compiler yang memiliki keikutsertaan eksplisit. (I7afd2, b/158123185)

  • Menghapus metode penjadwalan dari EmbeddingContext (I7b9be)

  • onPreCommit sudah tidak digunakan lagi; onCommit kini memiliki perilaku onPreCommit.

    onCommit dan onActive kini dijalankan dalam frame choreographer yang sama dengan tempat perubahan komposisi dilakukan, bukan di awal frame choreographer berikutnya. (I70403)

Versi 1.0.0-alpha01

26 Agustus 2020

androidx.compose.runtime:runtime-*:1.0.0-alpha01 dirilis. Versi 1.0.0-alpha01 berisi commit berikut ini.

Versi 0.1.0-dev

Versi 0.1.0-dev17

19 Agustus 2020

androidx.compose.runtime:runtime-*:0.1.0-dev17 dirilis. Versi 0.1.0-dev17 berisi commit berikut ini.

Perubahan API

  • Emit khusus kini dapat mendeklarasikan bahwa satu atau beberapa penyetelnya dapat dilewati dan dikomposisi ulang secara terpisah dari emit. (Ibbd13)
  • Menghapus panggilan FrameManager yang tidak digunakan lagi.

    API compose internal telah diubah guna mengurangi jumlah overhead untuk melacak objek status seperti mutableStateof() (I80ba6)

  • state { ... } yang dapat dikomposisi kini tidak lagi digunakan agar panggilan eksplisit ke remember { mutableStateOf(...) } menjadi lebih jelas. Ini mengurangi keseluruhan tampilan API dan jumlah konsep untuk pengelolaan status, serta mencocokkan pola by mutableStateOf() untuk delegasi properti class. (Ia5727)

  • Flow.collectAsState kini menentukan dispatcher default dari komposisi itu sendiri, bukan menetapkan Dispatchers.Main sebagai default. (I9c1d9)

  • Memperbaiki error saat sesuatu yang menyimpan status sebelumnya digunakan di dalam for loop. Kini, memiliki kunci yang sama di savedInstanceState() diizinkan, dan api UiSavedStateRegistry disesuaikan dengan persyaratan baru ini (I4ab76, b/160042650, b/156853976, b/159026663, b/154920561)

Perbaikan Bug

  • emitView tidak digunakan lagi. Sebagai gantinya, gunakan AndroidView ketika memungkinkan untuk memunculkan Views di dalam Compose. Perlu diperhatikan bahwa pengomposisian langsung Views dan ViewGroups tidak akan dapat dilakukan di masa mendatang, kecuali keduanya merupakan daun dalam struktur pohon komposisi terkait dan tindakan itu dapat dilakukan menggunakan AndroidView. (I29b1e, b/163871221)

Versi 0.1.0-dev16

5 Agustus 2020

androidx.compose.runtime:runtime-*:0.1.0-dev16 dirilis. Versi 0.1.0-dev16 berisi commit berikut ini.

Perubahan API

  • Kebijakan mutasi default mutableStateOf(), ambientOf(), dan savedInstanceStateOf() telah diubah menjadi structuralEqualityPolicy(), bukan referentialEqualityPolicy().

    Untuk memutuskan apakah nilai baru yang ditetapkan ke instance mutableStateOf() akan dianggap perubahan, setelan default yang digunakan sekarang adalah ==, bukan ===.

    Lihat https://kotlinlang.org/docs/reference/equality.html

    ambientOf() dan savedInstanceStateOf() menggunakan mutableStateOf() dalam implementasinya sehingga menjadi konsisten dengan mutableStateOf().

    Menggunakan persamaan struktural lebih cocok dengan ekspektasi developer.

    Misalnya,

    val state = mutableStateOf(1f)
    

    diikuti dengan,

    state.value = 1f
    

    tidak akan dianggap lagi sebagai perubahan pada state dan penggunaan state selama komposisi tidak perlu lagi dikomposisi ulang.

    Ini adalah perubahan yang dapat menyebabkan gangguan. Namun, pada sebagian besar kasus (seperti saat menggunakan class yang tidak mengganti equals()), perubahan ini tidak akan berpengaruh nyata pada aplikasi.

    Class yang mengganti equals(), seperti class data, mungkin mengalami penurunan performa karena metode equals()-nya kini secara default dipanggil saat ditetapkan ke mutableStateOf().

    Perilaku sebelumnya dapat dipulihkan dengan menambahkan parameter kebijakan policy = referentialEqualityPolicy() ke panggilan untuk mutableStateOf(), ambientOf(), dan savedInstanceStateOf(). (Ic21a7)

  • Row dan Column kini berfungsi inline yang secara signifikan mengurangi overhead penggunaannya. (I75c10)

Perbaikan Bug

  • setViewContent tidak digunakan lagi. Sebagai gantinya, setContent harus digunakan. (I7e497, b/160335130)
  • Menambahkan MonotonicFrameAnimationClock yang memungkinkan Anda menggunakan MonotonicFrameClock sebagai AnimationClockObservable untuk menutup kesenjangan antara jam berbasis coroutine baru dan API yang masih menggunakan jam berbasis callback lama.

    MonotonicFrameClock yang setara dengan ManualAnimationClock kini menjadi ManualFrameClock. (I111c7, b/161247083)

  • Modifier.stateDraggable telah dikerjakan ulang sepenuhnya dan namanya diganti menjadi Modifier.swipeable. Class SwipeableState baru sudah diperkenalkan, serta DrawerState dan BottomDrawerState difaktorkan ulang untuk mewarisi class tersebut. [Modal/Bottom]DrawerLayout tidak lagi menggunakan parameter onStateChange. (I72332, b/148023068)

  • Modifier.plus tidak digunakan lagi. Sebagai gantinya, gunakan Modifier.then. 'Then' memiliki sinyal pengurutan yang lebih kuat, serta melarang pengetikan Modifier.padding().background() + anotherModifier yang memutus rantai dan lebih sulit dibaca (Iedd58, b/161529964)

  • SubcomposeLayout ditambahkan. Ini adalah primitif tingkat rendah yang memungkinkan komposisi pada turunan selama pengukuran. Hal itu terjadi jika kita ingin menggunakan beberapa nilai yang hanya tersedia selama pengukuran untuk komposisi sub-pohon. Misalnya, WithConstraints tidak diimplementasikan menggunakan SubcomposeLayout. (I25cc8)

  • Nama Material FillingTextField diganti menjadi TextField dan nama TextField dasar diganti menjadi BaseTextField, agar API paling sederhana yang diinginkan mudah ditemukan dan digunakan (Ia6242, b/155482676)

  • Nama Modifier.drawBackground telah diganti menjadi Modifier.background (I13677)

Versi 0.1.0-dev15

22 Juli 2020

androidx.compose.runtime:runtime-*:0.1.0-dev15 dirilis. Versi 0.1.0-dev15 berisi commit berikut.

Update Dependensi

  • Untuk menggunakan Compose versi 0.1.0-dev15, Anda harus memperbarui dependensi sesuai dengan cuplikan kode baru yang ditampilkan di atas dalam Mendeklarasikan dependensi.

Perubahan API

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

    Pembenaran

    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.
    • Meniadakan penggunaan corner-case dan pertanyaan yang sulit dijawab tentang mengonfigurasi @Model sebagai hal-hal yang perlu ditangani
    • Class data @Model, sama dengan, 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 "magic" di 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 status yang tidak dapat diubah atau kami “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 gunakan pendekatan berikutnya.

    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)

  • 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 sortWith dan removeRange ke MutableVector (Icccf7)

  • Menambahkan implementasi metode default untuk CompositionLifecycleObserver (I24289)

  • Appier kini memerlukan metode clear() untuk memisahkan posisi (Ibe697)

  • Menambahkan asMutableList() ke MutableVector untuk memungkinkannya diteruskan ke API publik tanpa harus menyalin seluruh daftar. (I298df)

  • Menambahkan rememberCoroutineScope() untuk mendapatkan CoroutineScope dalam komposisi untuk meluncurkan tugas sebagai respons terhadap peristiwa. (I0e264)

  • MutableVector adalah koleksi baru yang tidak menerapkan antarmuka Collection standar apa pun. Collection ini menawarkan kecepatan di atas persyaratan lainnya dan ditujukan hanya untuk digunakan dalam implementasi internal. (I8ebd6)

  • Menghapus sementara StableMutableList dan StableMutableMap untuk menghindari masalah pada versi penulisan Kotlin diperlukan. Antarmuka ini akan diperkenalkan kembali setelah compose diupdate ke versi Kotlin yang tidak memiliki masalah.

    SnapshotStateList dan SnapshotStateMap kini bersifat publik, tetapi tidak akan digunakan lagi setelah StableMutableList dan StableMutableMap dipulihkan. (Ia7769)

  • tambahkan fungsi top-level withFrameNanos untuk pengaturan waktu animasi (Ie34c5)

  • Anotasi @Untracked sudah tidak digunakan lagi. Ganti dengan @ComposableContract(tracked=false) (Id211e)

  • Nama RestartableFunction dan API terkait telah diganti menjadi ComposableLambda, dll. API ini hanya ditargetkan oleh compiler sehingga seharusnya tidak memengaruhi kompatibilitas tingkat sumber secara normal. Penggantian nama dilakukan untuk mengomunikasikan class ini dengan lebih baik saat muncul dalam pelacakan tumpukan (I7eb25)

  • Anotasi @Composable tidak berlaku lagi di class (Ia5f02)

  • Ambient<T> kini menjadi @Stable, bukan @Immutable (I0b4bb)

  • Sebelum perubahan ini, plugin compiler tulis akan melakukan intersepsi panggilan terhadap konstruktor di dalam fungsi @Composable jika terdapat (I5205a, b/158123804)

  • 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)

  • 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)

  • Menambahkan adapter untuk Flow. Contoh penggunaan: nilai value oleh flow.collectAsState() (If2198, b/153375923)

  • 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)

  • androidx.compose.ViewComposer telah dipindahkan ke androidx.ui.node.UiComposer androidx.compose.Emittable telah dihapus. Berlebihan dengan ComponentNode. androidx.compose.ViewAdapters telah dihapus. Kasus penggunaannya sudah tidak didukung. Compose.composeInto sudah tidak digunakan lagi. Sebagai gantinya, gunakan setContent atau setViewContent. Compose.disposeComposition sudah tidak digunakan lagi. Sebagai gantinya, gunakan metode dispose pada Composition yang ditampilkan oleh setContent. androidx.compose.Compose.subcomposeInto telah dipindahkan ke androidx.ui.core.subcomposeInto Nama ComponentNode#emitInsertAt telah diganti menjadi ComponentNode#insertAt Nama ComponentNode#emitRemoveAt telah diganti menjadi ComponentNode#removeAt Nama ComponentNode#emitMode telah diganti menjadi ComponentNode#move (Idef00)

  • 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. (I7971c)

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

  • Menambahkan ui-livedata - artefak baru dengan adaptor untuk LiveData. Contoh penggunaan: nilai value oleh liveData.observeAsState() (Ie9e8c, b/150465596)

  • Adaptor Rx tanpa nilai awal eksplisit tidak digunakan lagi. Menggunakan null tidak selalu merupakan default terbaik, misalnya jika Anda memiliki List, akan lebih baik dimulai dengan emptyList() atau default lain yang wajar (I00025, b/161348384)

  • Menambahkan ui-rxjava2 - artefak baru dengan adaptor untuk RxJava2. Contoh penggunaan: nilai value oleh observasiable.subscribeAsState() (Ifab4b, b/150369097)

  • savedInstanceState() sekarang dapat digunakan dengan jenis nullable (I6847f, b/153532190)

  • ListSaver() dan mapSaver() baru untuk memudahkan penulisan objek Saver kustom (I8cf68, b/152331508)

  • Fungsi baru: savedInstanceState() dan rememberSavedInstanceState(). Keduanya mirip dengan state() dan remember(), tetapi memiliki dukungan status instance yang tersimpan di (If1987, b/152025209)

Perbaikan Bug

  • Nama runOnIdleCompose diganti menjadi runOnIdle (I83607)
  • Membuat API eksperimental LayoutNode (I4f2e9)
  • androidx.ui.foundation.TextFieldValue dan androidx.ui.input.EditorValue tidak digunakan lagi. Fungsi yang dapat dikomposisi TextField, FilledTextField, dan CoreTextField yang menggunakan tipe tersebut juga tidak digunakan lagi. Sebagai gantinya, gunakan androidx.ui.input.TextFieldValue instead (I4066d, b/155211005)
  • Menghapus API DrawBackground API yang tidak digunakan lagi dan digantikan dengan API ekstensi drawBackground di Pengubah. Memfaktorkan ulang implementasi drawBackground cat, kuas, dan warna untuk mengurangi jalur kode serta menghapus persyaratan agar Pengubah dibuat sebagai bagian dari komposisi. (I0343a)
  • 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. Sekarang, sebagai ganti dua parameter, memiliki cakupan penerima yang merupakan tambahan untuk batasan dan layoutDirection menyediakan properti minWidth, maxWidth, minHeight, dan maxHeight di Dp (I91b9a, b/149979702)
  • Menambahkan pengubah padding simetris. (I39840)
  • Memperbarui wrapContentWidth dan wrapContentHeight untuk mengharapkan Alignment vertikal atau horizontal, bukan sembarang Alignment. Pengubah gravitasi diperbarui untuk menerima Alignment vertikal atau horizontal. Row, Column, dan Stack telah diperbarui untuk mendukung Alignment berkelanjutan khusus. (Ib0728)
  • Nama modul ui-text diganti menjadi ui-text-core (I57dec)
  • Menyempurnakan API DrawModifier:
    • Membuat cakupan penerima untuk draw() ContentDrawScope
    • Menghapus semua parameter pada draw()
    • DrawScope memiliki antarmuka yang sama dengan CanvasScope
    • ContentDrawScope memiliki metode drawContent() (Ibaced, b/152919067)
  • ColoredRect tidak digunakan lagi. Sebagai gantinya, gunakan Box(Modifier.preferredSize(width, height).drawBackground(color)). (I499fa, b/152753731)
  • Penggantian operator Modifier plus dengan fungsi ekstensi pabrik (I225e4)
  • Anggota RowScope dan ColumnScope kini dapat diakses dari luar Baris dan Kolom. (I3a641)
  • Mengganti nama LayoutFlexible menjadi LayoutWeight. Mengganti nama parameter tight menjadi fill. (If4738)
  • WithConstraints mendapatkan parameter LayoutDirection (I6d6f7)
  • Mengganti nama latar belakang menjadi DrawBackground dan menjadikannya agar dapat diingat secara default (Ia0bd3)
  • Mengganti ButtonStyle dengan fungsi yang berbeda dan penghapusan kelebihan beban pada teks (string). Lihat contoh terbaru untuk informasi penggunaan. (If63ab, b/146478620, b/146482131)
  • Sekarang runOnIdleCompose dan runOnUiThread menjadi fungsi global, bukan metode di ComposeTestRule. (Icbe8f)

Kontribusi Eksternal

  • Hapus API yang tidak diperlukan seperti Looper dan Handler dari lapisan porting Compose Runtime (I6847d)
  • Tidak lagi menggunakan Flow<T>.collectAsState() tanpa nilai awal. Gunakan StateFlow<T> atau teruskan nilai awal eksplisit. (I63f98, b/157674865)