标签: kotlin-stateflow

执行com.android.build.gradle.internal.tasks.MergeJavaResWorkAction时发生故障

请帮助解决构建错误。

Kotlin 版本:1.5.31 Gradle-zip:7.2 Gradle 版本:7.0.3

任务“:app:mergeDebugJavaResource”执行失败。

执行 com.android.build.gradle.internal.tasks.MergeJavaResWorkAction 时发生故障 2 个文件从输入中找到路径“kotlin/internal/internal.kotlin_builtins”:/Users/Umut/.gradle/caches/transforms-3/98f5d2ab243e47179d111ce52d349da0 /transformed/jetified-kotlin-compiler-embeddable-1.5.31.jar /Users/Umut/.gradle/caches/transforms-3/3af4d33202657704115aebc723152cf8/transformed/jetified-kotlin-stdlib-1.5.31.jar 添加打包选项块可能会帮助,请参阅 https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html了解更多信息

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}
apply from: "$rootDir/ktlint.gradle"

android {
    compileSdkVersion 31
    buildToolsVersion "31.0.0"

    defaultConfig {
        applicationId "com.umut.example"
        minSdkVersion 26
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"
        multiDexEnabled true

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }

    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but …
Run Code Online (Sandbox Code Playgroud)

android kotlin build.gradle android-jetpack-compose kotlin-stateflow

5
推荐指数
1
解决办法
1729
查看次数

StateFlow 在用于导航到其他可组合项时会多次触发

我一直在使用 StateFlow + 密封接口来表示 Android 应用程序中的各种 UI 状态。在我的 ViewModel 中,我有一个密封接口UiState来执行此操作,并且各种状态公开为StateFlow

sealed interface UiState {
    class LocationFound(val location: CurrentLocation) : UiState
    object Loading : UiState
    // ...
    class Error(val message: String?) : UiState
}


@HiltViewModel
class MyViewModel @Inject constructor(private val getLocationUseCase: GetLocationUseCase): ViewModel() {

    private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
    val uiState: StateFlow<UiState> = _uiState

// ...
}
Run Code Online (Sandbox Code Playgroud)

然后在可组合项中,我以这种方式观察事件:

@Composable
fun MyScreen(
    viewModel: HomeScreenViewModel,
    onLocationFound: (CurrentLocation) -> Unit,
    onSnackbarButtonClick: () -> Unit
) {

// ...
    LaunchedEffect(true) { …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-navigation android-jetpack-compose kotlin-stateflow

5
推荐指数
0
解决办法
1049
查看次数

AndroidcollectAsStateWithLifecycle() 未在可组合项内收集

我正在使用 composeLazyColumn和 viewModel 通过在我的 viewModel 中更新列表项:

    data class ContactsListUiState(
       val contacts: MutableList<Contact>
    )
    @HiltViewModel
    class ContactsViewModel @Inject constructor(savedStateHandle: SavedStateHandle) : ViewModel() {
    private val _contactsListUiState = MutableStateFlow(ContactsListUiState(mutableListOf()))
    val contactsListUiState: StateFlow<ContactsListUiState> = _contactsListUiState.asStateFlow()

    private fun updateContactsList(newContacts: MutableList<Contact>) {
        _contactsListUiState.update{ currentState ->
            currentState.copy(
                contacts = newContacts
            )
        }
    }
Run Code Online (Sandbox Code Playgroud)

这样我的updateContactsList()函数就会更新 stateFlow,并且我应该在collectAsStateWithLifecycle()可组合函数内部收集联系人列表MainActivity

@OptIn(ExperimentalLifecycleComposeApi::class, ExperimentalFoundationApi::class)
    @Composable
    fun ContactsListScreen(
        navController: NavController,
        modifier: Modifier = Modifier
    ) {
        Log.d("ViewModel", "ContactsListScreen recomposed")
        val uiState by contactsViewModel.contactsListUiState.collectAsStateWithLifecycle()
        Box(modifier = modifier) { …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose kotlin-stateflow compose-recomposition

5
推荐指数
1
解决办法
1977
查看次数

Android - 如何从 kotlin 流程中读取值?

我有一个房间数据库中的剧集流。我可以毫无问题地将这个流程作为实时数据进行观察。

但我也想在用户单击按钮时读取此流程中的最后一个值。我尝试使用 first() 终端流运算符,但它无法编译。你能帮忙或提出其他建议吗?

从流中读取的非编译尝试:

bd.buttonNext.setOnClickListener {
    lifecycleScope.launch {
        val episode: Episode? = viewModel.episodeFlow().first()           <=== Compile ERROR
        Snackbar.make(bd.root, "episode ${episode?.name}", Snackbar.LENGTH_SHORT).show()
    }
}
Run Code Online (Sandbox Code Playgroud)

此流程来自 ROOM :

@Query("SELECT * FROM Episode WHERE id = :id")
fun getEpisode(id: Long): Flow<Episode?>
Run Code Online (Sandbox Code Playgroud)

存储库:

fun getEpisode(episodeId: Long): Flow<Episode?> = dao.getEpisode(episodeId)
Run Code Online (Sandbox Code Playgroud)

视图模型 - Id 来自 StateFlow :

fun episodeFlow(): Flow<Episode?> 
  = episodeIdStateFlow.flatMapLatest { episodeId ->
    repository.getEpisode(episodeId)
  }
Run Code Online (Sandbox Code Playgroud)

编译错误:

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
public fun <T> Array<out …
Run Code Online (Sandbox Code Playgroud)

android kotlin-flow kotlin-coroutines-flow kotlin-stateflow

4
推荐指数
1
解决办法
1028
查看次数

与 Livedata 不同,使用 Flow in Room 查询在更新表条目时不会触发刷新,但在删除或插入条目时会起作用

当使用 Livedata 作为 Room 中表上的 select* 查询的返回类型时,然后我观察它,如果我更新/插入/删除该表中的条目,我会得到触发器。然而,当我尝试使用 Kotlin Flow 时,我只得到 2 个触发器。

第一个触发器给出一个空值,因为状态流的初始值为空。第二个触发器是 Room 表中的条目列表。

如果我对数据库执行插入/删除操作,我会收到来自 StateFlow 的触发器。但是,如果我更新条目,Stateflow 不会触发。

注意:更新操作在数据库上正常工作。我使用 DB 检查器进行了检查。

数据类和 DAO

@Entity
data class CartItem (
    @PrimaryKey
    val itemId: Int,
    var itemQuantity: Int=1
)

@Dao
interface CartDao {

    @Query("SELECT * FROM CartItem")
    fun getAllItems(): Flow<List<CartItem>>

    @Update
    suspend fun changeQuantityInCart(cartItem:CartItem)

    @Insert
    suspend fun insert(item: CartItem)

    @Delete
    suspend fun delete(cartItem:CartItem)
}
Run Code Online (Sandbox Code Playgroud)

视图模型

val cartItems: StateFlow<List<CartItem>?> =
        repo.fetchCartItems().stateIn(viewModelScope, SharingStarted.Lazily, null)
Run Code Online (Sandbox Code Playgroud)

分段

viewLifecycleOwner.lifecycleScope.launchWhenStarted {
            viewModel.cartItems.collect {
              Log.e("Update","Update")
 }
Run Code Online (Sandbox Code Playgroud)

android android-room kotlin-flow kotlin-stateflow

4
推荐指数
1
解决办法
3727
查看次数

我可以同时观察多少个 Stateflow?

我为 Android 开发应用程序。我想知道我可以同时观察多少个 Kotlin Stateflow?我所做的每件事observe都是在我自己创建的、由 IO 调度程序调度或由 Android 框架的生命周期组件提供的不同 CoroutineScope 上完成的。

我已经完成了各种操作,例如在协程内无限循环中进行简单添加,并使用 Android Studio 分析器,我观察到启动大量执行计算的协程会导致 CPU 负载过高。

考虑到Stateflow 永远不会完成,它上的每个收集都是阻塞的,并且在不同的 CoroutineScope 上完成,如示例和文档所述,我可以一次观察到的 Stateflow 的最大数量是多少,而不必担心我会高度使用 CPU,创建太多线程还是只是耗尽了设备资源?

multithreading android kotlin kotlin-coroutines kotlin-stateflow

4
推荐指数
1
解决办法
1292
查看次数

Jetpack Compose 导航和 StateFlow 的问题

Composable函数Application创建一个NavHostController定义 2 个目标的函数。一个StartScreen和一个ContentScreen。只有StartScreen一个按钮,它会触发模拟后端请求并StateFlow根据请求的状态更改状态(使用 kotlins )。当结果返回时,将调用NavControllersnavigate方法以在 上显示返回的内容ContentScreen

问题:状态InitLoading工作正常,但是一旦应该显示内容,就会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() …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-navigation android-jetpack-compose kotlin-stateflow

4
推荐指数
1
解决办法
2091
查看次数

为什么在 kotlin 中流收集调用超过两次?

嘿,我正在 android 中的 kotlin flow 工作。我注意到我的 kotlin 流程collectLatest调用了两次,有时甚至更多。我尝试过这个答案,但它对我不起作用。我在我的函数中打印了日志,collectLatest它打印了日志。我正在添加代码

MainActivity.kt

class MainActivity : AppCompatActivity(), CustomManager {

    private val viewModel by viewModels<ActivityViewModel>()
    private lateinit var binding: ActivityMainBinding
    private var time = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        setupView()
    }

    private fun setupView() {
        viewModel.fetchData()

        lifecycleScope.launchWhenStarted {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.conversationMutableStateFlow.collectLatest { data ->
                    Log.e("time", "${time++}")
                   ....
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ActivityViewModel.kt

class ActivityViewModel(app: Application) : AndroidViewModel(app) {

    var conversationMutableStateFlow = MutableStateFlow<List<ConversationDate>>(emptyList()) …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-coroutines kotlin-flow kotlin-stateflow

4
推荐指数
1
解决办法
1万
查看次数

挂起直到 StateFlow 达到所需状态之一并返回结果

考虑一个密封类状态。

sealed class State {
    object Unknown : State()
    object Loading : State()
    object Success : State()
    data class Failure(val exception: Exception)
}
Run Code Online (Sandbox Code Playgroud)

我有一个状态流,消费者可以在其中主动监听状态更新。

val state:State = MutableStateFlow(State.Unknown)
Run Code Online (Sandbox Code Playgroud)

现在,我还想要一个简单的挂起方法,该方法会等待状态达到成功或失败,因此只需要一次结果的消费者不需要了解状态流。

如何实现这一目标?

generics kotlin kotlin-coroutines kotlin-stateflow

3
推荐指数
1
解决办法
1019
查看次数

jetpack 撰写stateflow不刷新列表

在我的项目中,我有两个片段。

一个是 a normal fragment,另一个是 a bottomSheetDialogFragment

在我的中normal fragment,我有一个lazyColumn。

我想在 BottomSheetDialogFragment 中进行一些设置并创建一个新Hiit对象并将其放入hiitItems我的viewmodel.

问题是,由于我的部分被 覆盖normal fragment,当我的列表更改时,jetpack compose 将不会重新组合。bottomSheetDialogFragment

所以我决定转向考虑stateFlow到它总是在触发,并且我认为这可能会导致重组。但不幸的是,事实并非如此。

下面是我的代码:

// in my viewmodel
// using stateflow to hold the list of hiitItems 
    private var _hiitItems = MutableStateFlow(mutableListOf(HiitItem()))
    val hiitItems = _hiitItems
Run Code Online (Sandbox Code Playgroud)

在我的中normal fragment,我使用 composeView 来利用jetpack compose

 setContent {

// get hiitItems
val hiitItems by vm.hiitItems.collectAsState()
...

 // lazyColumn
LazyColumn(modifier …
Run Code Online (Sandbox Code Playgroud)

android-jetpack-compose kotlin-stateflow

3
推荐指数
1
解决办法
3585
查看次数