- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Composable
功能 Application
创建一个 NavHostController
它定义了 2 个目标。一个 StartScreen
和 ContentScreen
. StartScreen
只有一个按钮,它触发模拟的后端请求并根据请求的状态更改状态(使用 kotlins StateFlow
)。当结果返回时,NavController
小号 navigate
调用方法以在 ContentScreen
上显示返回的内容.
问题:
各州 Init
和 Loading
工作正常,但只要内容应该显示,ContentScreen
在循环中重绘并且不会停止。
我在这里做错了什么?
/** Dependencies
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation "androidx.compose.ui:ui:1.0.2"
implementation "androidx.compose.ui:ui:1.0.2"
implementation "androidx.compose.material:material:1.0.2"
implementation "androidx.compose.ui:ui-tooling-preview:1.0.2"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1'
implementation "androidx.navigation:navigation-compose:2.4.0-alpha08"
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07'
implementation 'androidx.activity:activity-compose:1.3.1'
*
* **/
sealed class MainState {
object Init : MainState()
object Loading : MainState()
data class Content(val data: String) : MainState()
}
class MainViewModel : ViewModel() {
private val _state = MutableStateFlow<MainState>(MainState.Init)
val state: StateFlow<MainState> = _state
fun dosomething() {
viewModelScope.launch {
_state.value = MainState.Loading
// emulating some BE call
delay(4000)
_state.value = MainState.Content("some backend result")
}
}
}
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Application()
}
}
}
@Composable
fun Application() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "start") {
composable("start") {
val viewmodel: MainViewModel = viewModel()
val state by viewmodel.state.collectAsState()
when (val state = state) {
is MainState.Content -> navController.navigate("content/${state.data}")
is MainState.Loading -> LoadingScreen()
MainState.Init -> StartScreen()
}
}
composable(
"content/{content}",
arguments = listOf(
navArgument("content") {
type = NavType.StringType
}
)
) {
ContentScreen(content = it.arguments!!.getString("content")!!)
}
}
}
@Composable
fun LoadingScreen() {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
CircularProgressIndicator()
}
}
@Composable
fun StartScreen(viewmodel: MainViewModel = viewModel()) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
Button(onClick = { viewmodel.dosomething() }) {
Text(text = "Click Me!")
}
}
}
@Composable
fun ContentScreen(content: String) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
) {
Card(modifier = Modifier.padding(8.dp)) {
Text(text = content)
}
}
}
最佳答案
在 compose 中,您正在使用 View 构建器创建 UI。这个函数可以被多次调用,当你开始使用动画时,它甚至可以在每一帧上重新组合。
这就是为什么您不应该直接从可组合函数执行任何副作用。您需要使用 side effects
在这种情况下 LaunchedEffect(Unit)
应该使用:里面的代码只会被启动一次。
when (val state = state) {
is MainState.Content -> LaunchedEffect(Unit) {
navController.navigate("content/${state.data}")
}
is MainState.Loading -> LoadingScreen()
MainState.Init -> StartScreen()
}
关于android - Jetpack Compose 导航和 StateFlow 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69113828/
我为 Android 开发应用程序。我想知道我一次可以观察多少个 Kotlin Stateflow?每observe我所做的是在我自己创建的不同 CoroutineScope 上完成的,由 IO 调度
我正在使用 RecyclerView 并使用 Retrofit 从服务器获取数据。我正在使用 Kotlin 和 MVVM 设计模式。我使用过 LiveData,它运行良好。但是当我们导航到另一个 fr
在我的应用中,我有一个 UIState 密封类来表示 UI 状态。 sealed class UIState { class ShowLoading : UIState() class
我最近开始在 Android 中使用 Flows。我读到 Flows 很冷 StateFlows 很热,那么为什么我们更喜欢使用 Android 的 StateFlows 而不是 Flows?使用 F
我想使用 StateFlow。但是现在,我找不到任何可以帮助我的讲座。 我面临一个问题: 首先,我有一个包含字符串列表的单例,我想要一些“容易”理解的东西,即使它不是现在的目标。目的是用字符串填充和发
所以我正在更新我的RecylerView与 StateFlow如下所示: 我的数据类: data class Student(val name: String, var isSelected: Boo
我今天下载了 Android Studio Bumblebee 测试版并注意到一个新警告: “不应在组合中调用 StateFlow.value” 为什么我们不应该在组合中调用 StateFlow.va
我有一个登录表单。我用 StateFlow发送LoginResult (调用 API 后)来自 ViewModel至Activity .在 Activity 中,如果登录失败,我将显示一个错误对话框。
我在 Compose 和 MVVM 架构中开发该应用程序。我有 viewModel 与每个屏幕的 View 状态。 View 模型: class ProfileViewModel : ViewMode
考虑一个密封类状态。 sealed class State { object Unknown : State() object Loading : State() object
我正在这样创建 MutableStateFlow: val intSet = MutableStateFlow(HashSet()) 稍后我想更新此流程中的集合: intSet.value.add(0
我在 Compose 和 MVVM 架构中开发该应用程序。我有 viewModel 与每个屏幕的 View 状态。 View 模型: class ProfileViewModel : ViewMode
考虑一个密封类状态。 sealed class State { object Unknown : State() object Loading : State() object
我正在这样创建 MutableStateFlow: val intSet = MutableStateFlow(HashSet()) 稍后我想更新此流程中的集合: intSet.value.add(0
我有一个从设备传感器接收数据的类。我已将回调包装在 callbackFlow 中以获得 Flow。 private var sensorFlow: Flow = callbackFlow {
我们可以用类似下面的方式创建 LiveData 或 StateFlow val _liveData = MutableLiveData(0) val _stateFlow = MutableState
有函数collectAsState()适用于 StateFlow属性以便在 Composable 中观察它. 可组合项需要 StateFlow因为StateFlow保证初始值。 Flow没有这种保证。
正如我在标题中提到的,我很好奇两者之间的一般差异。你能帮忙吗?我找不到具体的区别,因为互联网上有复杂的例子。 在性能方面有什么区别? 在哪些场景下有优势? 将 StateFlow 与 Kotlin F
和 有什么区别?共享流 和 状态流 ? 以及如何在 中使用这些MVI 建筑学?使用简单 更好吗?流量 还是这些状态和事件? 最佳答案 Flow 很冷!,这意味着它仅在收集数据时才发出数据。 Flow
一定是一个非常简单的解决方案,但是......我在我的 android 项目中使用 StateFlow 来替换在服务中用作 Observables 的 LiveData。我使用 LiveData 作为
我是一名优秀的程序员,十分优秀!