You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.5 KiB
82 lines
2.5 KiB
package com.gyf.lib.uikit
|
|
|
|
import androidx.compose.material.ScaffoldState
|
|
import androidx.compose.material.SnackbarDuration
|
|
import androidx.compose.material.SnackbarResult
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.LaunchedEffect
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.livedata.observeAsState
|
|
import androidx.lifecycle.LiveData
|
|
import androidx.lifecycle.MutableLiveData
|
|
import androidx.lifecycle.ViewModel
|
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
import com.orhanobut.logger.Logger
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
|
data class SnackBar(
|
|
val message: String?,
|
|
val actionLabel: String? = null,
|
|
val duration: SnackbarDuration = SnackbarDuration.Short,
|
|
val callback: () -> Unit?
|
|
)
|
|
|
|
/**
|
|
* snackbar
|
|
*
|
|
*/
|
|
class ScaffoldModel : ViewModel() {
|
|
private val _data = MutableLiveData<SnackBar?>()
|
|
val data: LiveData<SnackBar?> = _data
|
|
|
|
fun update(message: String? = null, actionLabel: String? = null, callback: () -> Unit? = {}) {
|
|
if (message == null) {
|
|
_data.postValue(null)
|
|
} else {
|
|
_data.postValue(
|
|
SnackBar(message = message, actionLabel = actionLabel, callback = callback)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 底部提示
|
|
*
|
|
* @param model
|
|
* @param scaffoldState
|
|
*/
|
|
@Composable
|
|
fun ShowSnackbar(model: ScaffoldModel = viewModel(), scaffoldState: ScaffoldState) {
|
|
val snackBar: SnackBar? by model.data.observeAsState()
|
|
snackBar?.apply {
|
|
if (message != null) {
|
|
LaunchedEffect(scaffoldState) {
|
|
launch {
|
|
if (actionLabel != null) {
|
|
val result = scaffoldState.snackbarHostState.showSnackbar(
|
|
message = message, actionLabel = actionLabel,
|
|
duration = duration
|
|
|
|
)
|
|
when (result) {
|
|
SnackbarResult.ActionPerformed -> {
|
|
Logger.i("点击操作按钮")
|
|
callback()
|
|
}
|
|
SnackbarResult.Dismissed -> {
|
|
Logger.d("窗口消失")
|
|
}
|
|
}
|
|
} else {
|
|
scaffoldState.snackbarHostState.showSnackbar(message = message)
|
|
}
|
|
model.update()
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|