Atasi onSaveInstanceState Tidak Bekerja

Hi Gaes, kesempatan kali ini saya ingin berbagi pengalaman mengatasi bug official android ulah si orang-orang India ini gaes.

Sepertinya mereka mulai abai terhadap dampak buruk yang ditimbulkan dari inovasi-inovasi mereka, padahal era sebelum di dominasi orang india, Android tampak elegan dan smooth dari masa ke masa disetiap perkembangannya.. tapi kali ini, banyak sekali bug2x kampret yang saya temui dan saya harus menggunakan ilmu dukun untuk mengatasinya, salah satunya terkait:

override fun onSaveInstanceState(outState: Bundle)

override fun onRestoreInstanceState(savedInstanceState: Bundle)

Bagimana tidak, bug ini saya temui di tahun 20 May 2024 setelah dikomplain oleh klien kami karena mendapati UX yang tidak seperti biasanya.

Akhirnya saya menyimpulkan sendiri bahwa kedua override tersebut sudah dilenyapkan dari lifecycle Android, sehingga apa boleh buat, saya harus menggunakan metode manual untuk menyimpan UI state yang saya kekendaki.

Langkah 1 - Inisialisasi Variable Bundle via onCreated

class Abc : Activity{
    private var savedSate: Bundle? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        //inisialisasi di sini
        savedSate = savedInstanceState
    }
}

Langkah 2 - Simpan UI State Anda

Simpan UI state Anda dimanapun Anda inginkan, dalam kasus ini, saya menyimpan ui state nested recyclerview saya untuk mempertahankan ui state posisi scroll terakhir recyclerview parent dan child yang saya miliki.

    private fun saveUIState(){
        rvState = listManager?.onSaveInstanceState()
        rvStateChild = childManager?.onSaveInstanceState()
        savedSate?.putParcelable(RV_STATE, rvState)
        savedSate?.putParcelable(RV_STATE_CHILD, rvStateChild)
    }

Saya memanggilnya disetiap event klik item recyclerview.

Langkah 3 - Restore UI State Anda

Seharusnya Anda familiar dengan observer satu ini, tentu saya menggunakan mvvm pattern, jadi saya restore ui sate saya setiap kali feching data dari server berhasil dilakukan

private val prepareHistoryDetail = Observer<ResponseWeeklyReportMkt> {
    rvState?.let { listManager?.onRestoreInstanceState(rvState) }
}

Post a Comment

Previous Next

نموذج الاتصال