Kotlin

【Kotlin】StateFlow 狀態資料流 範例

【Kotlin】StateFlow 狀態資料流 範例

本文將介紹Android StateFlow,它是一個新出現的API,可以更容易地實現跨自定義線程的狀態管理,以及在应用程序開發中強大而可靠的一致性。

它支持Android的轉場狀態,並可以在狀態更改時發出事件。

StateFlow可以在多個線程之間共享,而不會犧牲性能,讓你可以更輕鬆地使用同一片狀態。

在本文中,將深入討論StateFlow的用途,其他Android技術以及如何優化狀態管理系統,使其更有效並提高應用程序性能。

最後,將探索StateFlow API提供的額外功能,以及如何在每個新項目中使用它,以更好地控制你的状態管理系統。


文章目錄

  1. Fragment KTX 導入
  2. StateFlow Layout
  3. StateFlow MainActivity
  4. StateFlow MainViewModel
  5. StateFlow PersonState
  6. Developer Documents StateFlow

1.Fragment KTX 導入

build.gradle
dependencies {
    //lifecycleScope、viewModelScope、by viewModels()
    implementation 'androidx.fragment:fragment-ktx:1.5.5'
}

2.StateFlow Layout

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

3.StateFlow MainActivity

MainActivity.kt
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private val viewModel: MainViewModel by viewModels()

    @SuppressLint("SetTextI18n")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.personState.collect {
                    binding.name.apply {
                        text = "{it.name}\n{it.age}"
                        gravity = Gravity.CENTER
                    }
                }
            }
        }

        binding.name.setOnClickListener {
            viewModel.refreshData()
        }
    }
}

4.StateFlow MainViewModel

MainViewModel.kt
class MainViewModel : ViewModel() {

    private val _personState = MutableStateFlow(PersonState())
    val personState = _personState.asStateFlow()

    fun refreshData() {
        viewModelScope.launch {
            _personState.update {
                if (it.name == "wade") {
                    it.copy(name = "fly", age = 20)
                } else {
                    it.copy(name = "wade", age = 25)
                }
            }
        }
    }
}

5.StateFlow PersonState

PersonState.kt
data class PersonState(
    val name: String = "fly",
    val age: Int = 20
)

6.Developer Documents StateFlow

Open in Documents StateFlow

發表迴響