簡體   English   中英

在 jetpack compose 中將實時數據轉換為 kotlin 流

[英]Convert Live Data to kotlin flow in jetpack compose

嘿,我是jetpack compose的新手。 我正在檢查互聯網是否可用,並通過實時數據進行消費。 現在我開始學習 jetpack compose,所以我想使用 Flow,所以任何人都幫我將這個 LiveData 轉換為 flow 並在 jetpack compose 中使用。

網絡連接.kt

import android.app.Application
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkRequest
import androidx.lifecycle.LiveData

class NetworkConnection(private val connectivityManager: ConnectivityManager) : LiveData<Boolean>() {

    constructor(application: Application) : this(application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)

    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            postValue(true)
        }

        override fun onLost(network: Network) {
            super.onLost(network)
            postValue(false)
        }
    }

    override fun onActive() {
        super.onActive()
        val builder = NetworkRequest.Builder()
        connectivityManager.registerNetworkCallback(builder.build(), networkCallback)
    }

    override fun onInactive() {
        super.onInactive()
        connectivityManager.unregisterNetworkCallback(networkCallback)
    }

}

有人可以幫我在jetpack compose中為kotlin flow推薦哪種方式。

MainActivity.kt

class MainActivity : ComponentActivity() {

    private lateinit var checkNetworkConnection: NetworkConnection

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        checkNetworkConnection = NetworkConnection(application)
        setContent {
            SportsResultTheme {
                SetupView()
            }
        }
    }
}

我也很困惑如何以推薦的方式在我的撰寫中使用流程。 謝謝

網絡連接.kt ->

    class NetworkConnection(private val connectivityManager: ConnectivityManager) {

    init {
        registerNetworkCallback()
    }

    constructor(application: Application) : this(application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)

    val stateFlow: StateFlow<State>
        get() = _stateFlow

    private val _stateFlow: MutableStateFlow<State> = MutableStateFlow(State.Init)

    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            _stateFlow.value = State.Available
        }

        override fun onLost(network: Network) {
            super.onLost(network)
            _stateFlow.value = State.Gone
        }
    }

    fun registerNetworkCallback(){
        val builder = NetworkRequest.Builder()
        connectivityManager.registerNetworkCallback(builder.build(), networkCallback)
    }

    fun unregisterNetworkCallback() {
        connectivityManager.unregisterNetworkCallback(networkCallback)
    }

    sealed interface State {
        object Init : State
        object Available : State
        object Gone : State
    }

}

MainActivity.kt

class MainActivity : ComponentActivity() {

    private lateinit var checkNetworkConnection: NetworkConnection

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        checkNetworkConnection = NetworkConnection(application)
        setContent {
            SportsResultTheme {
            checkNetworkConnection.stateFlow.collectAsState()
                SetupView()
            }
        }
    }
}

Jetpack compose 具有可用於將 LiveData 轉換為可在 Compose UI 中使用的狀態的函數 (LiveData.observeAsState())。 如果您的代碼庫中已有 LiveData,則不必使用 Flow。 將實時數據傳遞給可組合並將其轉換為狀態。 您還可以在調用SetupView可組合之前將實時數據轉換為狀態並傳遞狀態本身。

@Composable
fun SetupView(networkConnection : NetworkConnection) {
    val isConnected = networkConnection.observeAsState()
    
    if(isConnected) {
        // update for connected state
    } else {
        // handle offline state
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM