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

Compose Runtime

Elemen penyusun penting model pemrograman dan pengelolaan status Compose, serta runtime inti untuk Compose Compiler Plugin untuk ditargetkan.
Update Terbaru Rilis Stabil Saat Ini Kandidat Rilis Berikutnya Rilis Beta Rilis Alfa
24 Maret 2021 - - 1.0.0-beta03 -

Struktur

Compose adalah kombinasi 6 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 fungsi @Composable 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 entri 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.

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

android {
    buildFeatures {
        compose true
    }

    composeOptions {
        kotlinCompilerVersion "1.4.31"
        kotlinCompilerExtensionVersion "1.0.0-beta03"
    }
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

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 pada masalah yang ada dengan mengklik tombol bintang.

Laporkan masalah baru

Lihat dokumentasi Issue Tracker untuk informasi selengkapnya.

Versi 1.0.0

Versi 1.0.0-beta03

24 Maret 2021

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

Perubahan API

  • DefaultMonotonicFrameClock tidak digunakan lagi. Memanggil withFrameNanos atau Recomposer.runRecomposeAndApplyChanges tanpa MonotonicFrameClock sekarang akan menampilkan IllegalStateException. (I4eb0d)

Versi 1.0.0-beta02

10 Maret 2021

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

Perbaikan Bug

  • Menerapkan batasan di penggunaan API eksperimental publik (I6aa29, b/174531520)
  • Memperbaiki rememberSaveable { mutableStateOf(0) } yang rusak saat digunakan di dalam tujuan navigation-compose. (I1312b, b/180042685, b/180701630)

Versi 1.0.0-beta01

24 Februari 2021

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

Ini adalah rilis pertama Compose 1.0.0 Beta.

Perubahan API

  • Menambahkan API Recomposer.runRecomposeConcurrentlyAndApplyChanges eksperimental untuk mengubah komposisi yang tidak valid dari loop bingkai utama. (I342d0)
  • Semua composable yang ditandai dengan @ReadOnlyComposable kini divalidasi di waktu kompilasi untuk memastikan bahwa komponen tersebut hanya melakukan panggilan ke @ReadOnlyComposables lainnya (I58961)
  • defaultFactory untuk compositionLocalOf dan staticCompositionLocalOf sekarang bersifat wajib, bukan opsional.

    Perubahan ini menghapus error jenis potensial untuk jenis non-nullable jika tidak ada factory default yang tersedia. Sebelumnya, ini akan menyediakan referensi null untuk jenis non-nullable.

    Untuk jenis nullable, pertimbangkan untuk menyediakan { null } sebagai factory default.

    Sebaiknya jangan gunakan lokal dengan jenis non-nullable kecuali jika default yang logis tersedia. Jika tidak ada default yang logis, lambda defaultFactory akan memunculkan pengecualian. Namun, memunculkan pengecualian berarti bahwa konsumen lokal akan memiliki dependensi implisit yang diberikan yang tidak diterapkan oleh sistem jenis. (Ifbd2a)

  • Simbol yang tidak digunakan lagi dihapus dari runtime compose (I3252c)

  • emptyContent() yang tidak digunakan lagi dihapus. Sebagai gantinya, gunakan {}. (Idb33f, b/179432510)

  • Penyedia telah diganti namanya menjadi CompositionLocalProvider

    • Konstruktor Komposisi tidak lagi menerima parameter kunci, dan sudah tidak digunakan lagi.
    • currentCompositeKeyHash telah diubah menjadi properti tingkat atas yang dapat disusun, bukan fungsi tingkat atas yang dapat disusun.
    • CompositionData dan CompositionGroup telah dipindahkan ke namespace androidx.compose.runtime.tooling
    • ComposableLambda telah dibuat sebagai antarmuka, bukan class konkret, dan tidak lagi memiliki parameter jenis.
    • ComposableLambdaN telah dibuat sebagai antarmuka, bukan class konkret, dan tidak lagi memiliki parameter jenis.
    • Fungsi snapshotFlow telah dipindahkan ke namespace androidx.compose.runtime
    • metode penggabungan SnapshotMutationPolicy tidak lagi bersifat eksperimental
    • Fungsi clearRoots level atas @TestOnly telah dihapus. Fungsi tersebut tidak diperlukan lagi.
    • Fungsi keySourceInfoOf dan resetSourceInfo telah dihapus. Fungsi tersebut tidak diperlukan lagi.
    • Composer.collectKeySourceInformation telah dihapus. Fungsi tersebut tidak diperlukan lagi.
    • Metode isJoinedKey, joinedKeyLeft, dan joinedKeyRight telah dihapus. Fungsi tersebut tidak diperlukan lagi.
    • Berbagai API tingkat atas telah dipindahkan dan diatur ulang menjadi file yang berbeda. Karena semantik class file Kotlin, ini akan memutus kompatibilitas biner, tetapi tidak dengan kompatibilitas sumber, sehingga tidak menjadi masalah bagi sebagian besar pengguna.
    • (I99b7d, b/177245490)
  • SnapshotStateObserver tidak lagi bersifat Eksperimental (Id2e6a)

  • Menghapus beberapa API sebelumnya yang tidak digunakan lagi (Ice5da, b/178633932)

  • Membuat perubahan Material API berikut:

    • Menambahkan parameter contentPadding ke Top/BottomAppBar untuk memungkinkan penyesuaian padding default.
    • Parameter yang diurutkan ulang dalam BackdropScaffold untuk mengikuti panduan API bagi parameter wajib sebelum parameter opsional.
    • Memindahkan parameter icon di BottomNavigationItem ke setelah selected dan onClick.
    • Mengganti nama parameter alwaysShowLabels di BawahNavigationItem menjadi alwaysShowLabel.
    • Mengganti nama parameter bodyContent di beberapa komponen menjadi hanya content.
    • Parameter yang diurutkan ulang di ButtonDefaults.buttonColors(). Harap perhatikan bahwa karena jenis parameter tidak berubah, hal ini tidak akan menyebabkan error di kode Anda. Pastikan Anda menggunakan parameter bernama atau memperbarui urutannya secara manual. Jika tidak, kode Anda tidak akan berfungsi sama seperti sebelumnya.
    • Menambahkan parameter secondaryVariant ke darkColors(). Warna ini biasanya sama dengan secondary dalam tema gelap, tetapi menambahkan konsistensi dan penyesuaian lebih lanjut.
    • Menghapus ElevationDefaults dan animateElevation() dari tampilan API publik karena tidak umum digunakan/berguna.
    • Mengganti nama onValueChangeEnd di Slider menjadi onValueChangeFinished dan membuatnya nullable.
    • Mengganti nama parameter text di Snackbar menjadi content untuk konsistensi.
    • Menambahkan parameter contentPadding ke DropdownMenuItem untuk memungkinkan penyesuaian padding default dan menjadikan content sebagai ekstensi di RowScope.
    • Mengganti nama ModalDrawerLayout menjadi ModalDrawer.
    • Mengganti nama BottomDrawerLayout menjadi BottomDrawer.
    • (I1cc66)

Versi 1.0.0-alpha12

10 Februari 2021

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

Perubahan API

  • Dukungan untuk ViewGroups telah dihapus dari UiApplier. emitView yang dapat dikomposisi, tetapi tidak digunakan lagi, telah dihapus. (Ifb214)
  • CompositionReference diganti namanya menjadi CompositionContext (I53fcb)
  • ComponentActivity.setContent telah dipindahkan ke androidx.activity.compose.setContent di dalam modul androidx.activity:activity-compose. (Icf416)
  • API cuplikan diupdate agar lebih konsisten dengan pedoman API serta menyembunyikan class implementasi internal dari API publik. (Id9e32)
  • Mengganti nama Ambients agar cocok dengan penggantian nama Ambient -> CompositionLocal. Ambients sebelumnya bernama AmbientFoo, dan sekarang CompositionLocals diberi nama LocalFoo. (I2d55d)
  • Mengganti nama Ambient menjadi CompositionLocal, dan ambientOf/staticAmbientOf masing-masing menjadi compositionLocalOf/staticCompositionLocalOf. Perubahan ini membantu memperjelas tujuan dari CompositionLocal: mekanisme untuk memberikan/mengambil nilai yang bersifat lokal di suatu komposisi. Instance CompositionLocal harus diawali dengan Local, seperti val LocalFoo = compositionLocalOf { Foo() }. (Ia55b6)
  • takeMutableSnapshot dan takeSnapshot telah berpindah menjadi metode pendamping Cuplikan. (I91f19)
  • @ComposableContract tidak digunakan lagi dan digantikan dengan tiga anotasi yang lebih spesifik.

    @ComposableContract(restartable = false) telah menjadi @NonRestartableComposable @ComposableContract(readonly = true) telah menjadi @ReadOnlyComposable @ComposableContract(preventCapture = true) telah menjadi @DisallowComposableCalls @ComposableContract(tracked = true) telah dihapus. (I60a9d)

  • Utilitas emptyContent() dan (@Composable () -> Unit).orEmpty() tidak digunakan lagi karena tidak lagi memiliki dampak atau nilai performa yang bagus (I0484d)

  • snapshotFlow dan withMutableSnapshot tidak lagi bersifat eksperimental (I6a45f)

  • Kini Recomposer dapat ditutup. Recomposer yang ditutup akan melanjutkan rekomposisi hingga coroutine turunan komposisi selesai. Recomposer.shutDown diganti namanya menjadi batal untuk membedakannya dengan tutup. (Ib6d76)

  • Artefak compose:runtime-dispatch kini tidak digunakan lagi. MonotonicFrameClock kini dapat ditemukan di compose:runtime dan AndroidUiDispatcher dapat ditemukan di compose:ui. (Ib5c36)

  • API yang menjadi target plugin Compiler Compose telah difaktorkan ulang agar dapat menggunakan antarmuka, bukan class konkret. Antarmuka juga tidak lagi menggunakan parameter jenis.

    Perubahan internal ini seharusnya tidak memengaruhi kompatibilitas kode sumber, tetapi merupakan perubahan yang dapat menyebabkan gangguan biner. (I3b922, b/169406779)

  • SnapshotMutableState diperkenalkan (Icfd03)

  • DisposableEffectDisposable diganti namanya menjadi DisposaleEffectResult (Ica7c6)

  • Recomposer.current(). [Abstract]ComposeView yang dihapus kini ditetapkan secara default ke Recomposers dengan cakupan jendela yang dibuat secara lambat dan didorong oleh ViewTreeLifecycleOwner untuk jendela. Rekomposisi dan tick animasi withFrameNanos-based dijeda selama Lifecycle host dihentikan. (I38e11)

  • Recomposer.runningRecomposers sekarang menawarkan StateFlow global dari RecomposerInfo yang hanya dapat dibaca untuk mengamati status komposisi yang sedang berlangsung dalam proses. Pilih API ini daripada Recomposer.current(), yang sekarang tidak digunakan lagi. (If8ebe)

  • DisposableEffectDisposable diganti namanya menjadi DisposaleEffectResult (I3ea68)

Versi 1.0.0-alpha11

28 Januari 2021

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

Perubahan API

  • onCommit, onDispos, dan onActive sudah tidak digunakan lagi dan digantikan dengan API SideEffect dan DisposableEffect (If760e)
  • API emit() dan semua overload tidak digunakan lagi dan diganti namanya menjadi ComposeNode. API identik, hanya nama yang berbeda untuk mengikuti konvensi penamaan Compose (I4137b)
  • invalidate dan compositionReference() sekarang tidak digunakan lagi dan masing-masing telah digantikan dengan currentRecomposeScope dan rememberCompositionReference. (I583a8)
  • RememberObserver menggantikan CompositionLifecycleObserver dan CompositionLifecycleObserver kini tidak digunakan lagi.

    RememberObserver adalah pengganti untuk CompositionLifecycleObserver dengan metode modifikasi semantik dan penggantian nama. Mengubah ke API baru dapat dilakukan secara mekanis untuk objek yang hanya diingat satu kali, dan terus menjadi, praktik yang direkomendasikan. Namun, jika referensi diingat lebih dari sekali dalam suatu komposisi onRemembered dipanggil untuk setiap referensi ketika onEnter hanya dipanggil sekali. onEnter dipanggil beberapa kali jika objek digunakan dalam subkomposisi, seperti WithConstraints dan Scaffold, yang membuat jaminan panggilan onEnter tunggal tidak dapat diandalkan dan telah dihapus untuk RememberObserver.

    RememberObserver menambahkan onAbandoned yang dipanggil jika instance RememberObserver ditampilkan dari callback yang diteruskan ke remember tetapi tidak diingat dalam status komposisi, dan, oleh karena itu, tidak akan pernah memanggil onRemembered. Hal ini dapat terjadi jika pengecualian menghentikan komposisi sebelum selesai atau komposisi dibuang karena status tujuan komposisi itu diproduksi tidak lagi aktif atau tidak diperlukan lagi. Jika instance RememberObserver yang mengikuti rekomendasi referensi tunggal di atas melacak resource eksternal onForgotten dan onAbandoned, masing-masing menunjukkan bahwa resource tidak lagi diperlukan. Jika objek sedang melacak pekerjaan yang dimulai atau resource yang dialokasikan di onRemembered, onAbandoned dapat diabaikan karena tidak akan dipanggil jika onRemembered dipanggil. (I02c36)

  • Jangan tandai fungsi collectAsState() sebagai inline (Ia73e4)

Perbaikan Bug

  • WithConstraints didesain ulang sebagai BoxWithConstraints dan dipindahkan ke foundation.layout. (I9420b, b/173387208)
  • Memanfaatkan TestCoroutineDispatcher dalam pengujian (I532b6)

Versi 1.0.0-alpha10

13 Januari 2021

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

Perubahan yang Dapat Menyebabkan Gangguan

  • Restrukturisasi API compiler internal memungkinkan perubahan batch pada node yang dihasilkan sebagai hasil komposisi ke dalam fase "terapkan perubahan" komposisi, setelah semua fungsi @Composable selesai.

    Ini adalah perubahan perilaku yang dapat memengaruhi kode aplikasi karena node tidak lagi tersedia dari API internal dan eksperimental hingga perubahan diterapkan. Hal ini biasanya dapat diatasi dengan mengelilingi kode dengan dependensi tersebut dalam SideEffect yang dapat dikomposisi untuk menunda eksekusi kode hingga node dibuat dan diinisialisasi. (I018da)

Perubahan API

  • Menambahkan cara untuk melacak jika recomposer telah menerapkan perubahan. (I1b3e2)
  • Luaskan API [Abstraksi]ComposeView untuk memungkinkan pendaurulangan tampilan berbasis Compose, membuang komposisinya untuk dibuat kembali nanti. Tambahkan API untuk menginstal dan menemukan Recomposers dan ComposisiReferences dengan cakupan jendela untuk membuat komposisi turunan.

    Tambahkan ViewCompositionStrategy untuk mengonfigurasi strategi penghapusan komposisi dari [Abstract]ComposeViews; perilaku default adalah membuang pada jendela yang dilepas. (I860ab)

Perbaikan Bug

  • Recomposer kini menampilkan Alur dari statusnya saat ini, memungkinkan pemantauan aktivitasnya dan aktivitas efek terkait. (Ifb2b9)
  • keyEvent native sekarang dapat diakses melalui keyEvent.nativeKeyEvent (I87c57, b/173086397)

Versi 1.0.0-alpha09

16 Desember 2020

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

Perubahan API

  • Menghapus SlotTable, SlotReader, dan SlotWriter dari API publik. Sebelumnya, ini ditandai sebagai InternalComposeAPI. Kini keduanya bersifat internal untuk modul compose.

    Menambahkan CompositionData dan CompositionGroup sebagai pengganti ui-tooling API yang digunakan untuk mengekstrak informasi komposisi. Ini bersifat publik tetapi tidak dimaksudkan untuk digunakan di luar ui-tooling API karena menyediakan informasi mentah yang ditafsirkan oleh ui-tooling API (I31a9c)

  • Class Applier tidak lagi dianggap sebagai API eksperimental. (Id85b0)

  • Antarmuka Applier telah diubah untuk menyederhanakan hierarki build dari bawah ke atas, bukan dari atas ke bawah.

    Metode insert() telah diganti namanya menjadi insertTopDown().

    Menambahkan metode baru, insertBottomUp().

    Applier akan memasukkan node ke hierarki yang sedang diedit menggunakan insertTopDown() atau insertBottomUp() tergantung mana yang berperforma lebih baik.

    Beberapa hierarki, seperti LayoutNode dan View, jauh lebih efisien untuk dibuat dari bawah ke atas daripada dari atas ke bawah. Sebelum perubahan ini, stack insert diperlukan untuk menerapkan konstruksi dari bawah ke atas yang perlu disalin ke setiap applier yang memerlukan konstruksi tersebut untuk performanya. Dengan perubahan ini, Applier akan menggantikan insertBottomUp() untuk membuat hierarki dari bawah ke atas dan insertTopDown() untuk mem-build hierarki dari atas ke bawah. (Icbdc2)

  • Compose mendukung pengambil properti yang dapat membuat pemanggilan yang dapat dikomposisi. Dukungan untuk ini tidak akan dihapus, tetapi sintaksis untuk mendeklarasikan pengambil properti sebagai @Composable akan berubah.

    Sintaksis yang kini tidak digunakan lagi untuk melakukan tindakan ini adalah dengan menganotasi properti itu sendiri:

        @Composable val someProperty: Int get() = ...
    

    Sintaksis yang sekarang benar untuk melakukan tindakan ini adalah dengan menganotasi pengambil properti:

       val someProperty: Int @Composable get() = ...
    

    Kedua sintaksis akan berfungsi selama beberapa waktu, tetapi sintaksis yang tidak digunakan lagi pada akhirnya akan menjadi error kompilasi. (Id9197)

Perbaikan Bug

Versi 1.0.0-alpha08

2 Desember 2020

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

Perubahan API

  • Menambahkan pemeriksaan lint untuk penamaan dan posisi parameter lambda yang dapat dikomposisi, untuk memeriksa apakah konsisten dengan panduan Compose. Selain itu, memigrasikan beberapa API menggunakan children sebagai nama untuk lambda akhirnya ke content, sesuai dengan pemeriksaan lint dan panduan. (Iec48e)
  • Recomposer tidak lagi menerima EmbeddingContext; dependensi penjadwalan yang diperlukan diperoleh dari effectCoroutineContext. FrameManager tidak digunakan lagi; integrasi platform harus melakukan inisialisasi penanganan snapshot globalnya sendiri. (I02369)
  • Fungsi RestorableStateHolder.withRestorableState diganti namanya menjadi RestorableStateProvider (I66640)

Perbaikan Bug

  • Ambient yang tidak digunakan lagi dinamai dengan Ambient sebagai akhiran, dan menggantinya dengan properti baru yang diawali dengan Ambient, mengikuti pedoman Ambients API dan Compose API lainnya. (I33440)
  • Menghapus modul ui-test lama dan stub-nya (I3a7cb)

Versi 1.0.0-alpha07

11 November 2020

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

Fitur Baru

Perubahan API

  • Anotasi @UnionType sudah tidak digunakan lagi (I57cde)
  • provideDefault ditambahkan sebagai alternatif untuk menyediakan ambient, dan dapat digunakan untuk menentukan nilai ambient yang hanya akan ditetapkan jika tidak ada nilai ambient yang telah disediakan. (Id6635, b/171024925)
  • LaunchedTask diganti namanya menjadi LaunchedEffect agar konsisten dengan SideEffect dan DisposableEffect API. LaunchedEffect tanpa parameter subjek tidak diizinkan agar mendorong praktik terbaik. (Ifd3d4)
  • Applier kini memiliki callback onBeginChanges/onEndChanges yang dipanggil saat Composer dimulai/selesai menerapkan perubahan ke hierarki. Ini dapat digunakan untuk mengelompokkan pengelolaan resource jika diperlukan. (Icf476)
  • Recomposer kini memerlukan CoroutineContext saat pembuatan (Ic4610)
  • Perubahan pada implementasi SlotTable internal yang tidak akan memengaruhi API publik. (If9828)
  • Adaptor rxjava2 yang tidak digunakan lagi dan tidak menggunakan nilai awal telah dihapus (Idb72f)

Perbaikan Bug

  • foundation.Text sudah tidak digunakan lagi dan diganti dengan material.Text. Untuk API teks dasar tidak terkonfigurasi yang tidak memakai nilai dari tema, lihat androidx.compose.foundation.BasicText. (If64cb)
  • BaseTextField sudah tidak digunakan lagi. BasicTextField digunakan sebagai gantinya. (I896eb)
  • Beberapa simbol terkait tata letak dipindahkan dari androidx.compose.ui ke androidx.compose.layout.ui. (I0fa98, b/170475424)

Kontribusi Eksternal

  • Menambahkan modul runtime-rxjava3 untuk Compose. Serupa dengan runtime-rxjava2 (I02cbf)

Versi 1.0.0-alpha06

28 Oktober 2020

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

Perubahan API

  • Recomposer kini menjadi CompositionReference dan merupakan induk komposisi yang valid. Recomposer eksplisit kini diperlukan di lebih sedikit tempat. (I4036f)
  • Menambahkan API yang setara DisposableEffect ke SideEffect, mengisi peran onCommit-with-params, tetapi dengan onDispose yang diperlukan.
    • Menambahkan rememberUpdatedState API untuk memublikasikan data dari rekomposisi ke proses yang sedang berlangsung atau berlangsung lama, seperti DisposableEffect atau LaunchedTask.
    • (Id50b9)
  • MutableVector kini mengimplementasikan RandomAccess (I85d73, b/170461551)
  • Menambahkan fungsi SideEffect yang dapat dikomposisi untuk menerapkan efek samping komposisi ke objek yang dikelola oleh komposisi. SideEffect ditujukan untuk menggantikan fungsi onCommit yang dapat dikomposisi. (Ia77c2)
  • API eksperimental baru, RestorableStateHolder. API ini memungkinkan penyimpanan status yang didefinisikan dengan [savedInstanceState] dan [rememberSavedInstanceState] untuk subhierarki sebelum membuangnya agar dapat ditulis kembali nanti dengan status yang dipulihkan. (I66884, b/166586419)

Perbaikan Bug

  • Mengaktifkan transisi di ComposeTestRule; menghapus opsi untuk mengaktifkan kursor yang berkedip dari ComposeTestRule. (If0de3)

Versi 1.0.0-alpha05

14 Oktober 2020

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

Perubahan API

  • Pengubah input penangguhan Modifier.pointerInput eksperimental (Ia77d2)
  • Performa scroll LazyColumn/Row ditingkatkan dengan melakukan lebih sedikit pekerjaan dalam subkomposisi pada setiap scroll. Metode hasInvalidations() baru ditambahkan untuk class Composition. Metode hasPendingChanges() dari Recomposer diganti nama menjadi hasInvalidations() (Ib2f32, b/168293643, b/167972292, b/165028371)
  • Menambahkan API produceState untuk meluncurkan coroutine dari komposisi yang memperbarui satu nilai State<T> dari waktu ke waktu (Id4a57)
  • launchInComposition diganti nama menjadi LaunchedTask agar sesuai dengan pedoman Compose API (I99a8e)
  • Urutan panggilan telepon yang dilakukan dalam Layouts kustom kini menentukan urutan gambar untuk turunan (Ibc9f6)

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

  • menambahkan 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/153369097)

  • 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 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, API ini 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 DrawModifier API:
    • 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 overload 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)