请帮助解决构建错误。
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
我一直在使用 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
我正在使用 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
我有一个房间数据库中的剧集流。我可以毫无问题地将这个流程作为实时数据进行观察。
但我也想在用户单击按钮时读取此流程中的最后一个值。我尝试使用 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) 当使用 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 开发应用程序。我想知道我可以同时观察多少个 Kotlin Stateflow?我所做的每件事observe都是在我自己创建的、由 IO 调度程序调度或由 Android 框架的生命周期组件提供的不同 CoroutineScope 上完成的。
我已经完成了各种操作,例如在协程内无限循环中进行简单添加,并使用 Android Studio 分析器,我观察到启动大量执行计算的协程会导致 CPU 负载过高。
考虑到Stateflow 永远不会完成,它上的每个收集都是阻塞的,并且在不同的 CoroutineScope 上完成,如示例和文档所述,我可以一次观察到的 Stateflow 的最大数量是多少,而不必担心我会高度使用 CPU,创建太多线程还是只是耗尽了设备资源?
multithreading android kotlin kotlin-coroutines kotlin-stateflow
该Composable函数Application创建一个NavHostController定义 2 个目标的函数。一个StartScreen和一个ContentScreen。只有StartScreen一个按钮,它会触发模拟后端请求并StateFlow根据请求的状态更改状态(使用 kotlins )。当结果返回时,将调用NavControllersnavigate方法以在 上显示返回的内容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() …Run Code Online (Sandbox Code Playgroud) android android-architecture-navigation android-jetpack-compose kotlin-stateflow
嘿,我正在 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
考虑一个密封类状态。
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)
现在,我还想要一个简单的挂起方法,该方法会等待状态达到成功或失败,因此只需要一次结果的消费者不需要了解状态流。
如何实现这一目标?
在我的项目中,我有两个片段。
一个是 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) kotlin-stateflow ×10
android ×8
kotlin ×5
kotlin-flow ×3
android-architecture-navigation ×1
android-room ×1
build.gradle ×1
generics ×1