小编Sun*_*vel的帖子

Kotlin Flow 的 GroupBy 运算符

我正在尝试从 RxJava 切换到 Kotlin Flow。流量真的很震撼。但是现在在 kotlin Flow 中是否有类似于 RxJava 的“GroupBy”的运算符?

kotlin kotlin-flow

7
推荐指数
2
解决办法
1392
查看次数

如何在 Jetpack Compose 中支持智能重组

Jetpack compose 文档表示,如果所有输入稳定且未更改,它可以跳过重组。稳定类型的定义是这样的......

稳定类型必须遵守以下合同:

  1. 对于相同的两个实例,两个实例的 equals 结果将永远相同。
  2. 如果该类型的公共属性发生变化,Composition 将会收到通知。
  3. 所有公共财产类型也都很稳定。

我无法清楚地理解这一点。有人可以向我解释一下 compose 如何检查类型是否稳定吗?我可以理解如果 compose 确定类型是稳定的,那么它将使用 equals 方法检查是否相等。但是如何说一个类是否稳定,以便我们能够尽可能地理解和支持智能重组呢?

我试着玩了一下,发现了以下内容。

This data class Student is not stable, even if I pass the same instance again, its recomposing


data class Student(
     var id:Int=1,
     var name:String="Anonymous")
Run Code Online (Sandbox Code Playgroud)

然而,当我们再次传递相同的实例时,以下类被视为稳定的并且有利于智能重组

This class is stable when all the public parameters are changed to val

data class Student(
     val id:Int=1,
     val name:String="Anonymous")
Run Code Online (Sandbox Code Playgroud)

所以,我可以理解所有公共属性都应该是不可变的。但令我困惑的是,下面的类也被视为稳定的并且支持智能重组。为什么?

This MainActivityVM class is considered Stable when passing like

@Composable
fun StudentList(viewModel:MainActivityVM){
   ...
}

class MainActivityVM …
Run Code Online (Sandbox Code Playgroud)

android-jetpack-compose compose-recomposition

6
推荐指数
1
解决办法
1288
查看次数

如何在ItemKeyedDataSource.LoadInitialParams中使用requestedInitialKey

我正在学习 android 分页库,一切正常。但是每当我使数据源无效时,只要将新项目添加到列表顶部,列表就会跳转到起始位置。我想在列表中将项目添加到顶部。但是列表应该保持在当前的滚动位置。我想我应该使用 LoadInitialParams.requestedInitialKey 失效时它不为空。但我不确定如何使用此键加载数据以避免列表跳转到起始位置。

我使用 Firestore 数据库作为数据源。我发现提供给回调的requestedInitialKey实际上是当前滚动位置的recyclerview中的最后一个可见项目。我已经尝试了以下方法来获取有关 requestsInitialKey 的数据

.get().startAt(requestedIntitalKey).limit(25)

.get().endBefore(requestedIntitalKey).limit(25)

.get().startAfter(requestedIntitalKey).limit(25)

.get().endAt(requestedIntitalKey).limit(25)
Run Code Online (Sandbox Code Playgroud)

其中 25 是我的页面大小。以上都没有解决问题。有人可以为我提供一个示例,以便列表将停留在其当前滚动位置,只更新内容而不跳转开始吗?

android android-paging-library

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

为什么我们不能从逆变类型中读取

我正在学习 Java 中的泛型,我正在学习协方差和逆变。我了解协方差,为什么我们不能写入协方差类型。但对我来说,逆变是令人困惑的。我想知道为什么从逆变读取总是对象类型

假设我们有以下课程

Class Animal
Class Dog extends Animal
Class Tiger extends Animal
Run Code Online (Sandbox Code Playgroud)

现在,考虑以下代码

List<Animal> animals = new ArrayList<>();
List<? super Animal> contraVarianceList=animals;

animals.add(new Dog()); // Allowed
animals.add(new Tiger()); //Allowed
Animal animal = contraVarianceList.get(0); // Not allowed. Why?
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么我们不能从逆变列表中读取“动物”。为什么总是而且只有“Object”可以返回?如果我们从逆变列表中读取“Animal”,将会或可能会出现什么问题?

java generics contravariance

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

进程死亡时导航图作用域 ViewModel

当我尝试在 Android 应用程序中处理进程死亡时,我注意到范围为导航图的 ViewModel 在从进程死亡中重新创建时崩溃了。下面是 ViewModel 和使用 ViewModel 的 Fragment 的代码。

\n
@ExperimentalCoroutinesApi\n@HiltViewModel\nclass ViewPrintOrderVM @Inject constructor(\nprivate val repository: Repository,\nprivate val application: Application,\nprivate val savedStateHandle: SavedStateHandle\n) : ViewModel() {\n\n     // Code inside the ViewModel\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在我的片段中,我得到的参考如下

\n
@ExperimentalComposeUiApi\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass ComposeFragmentPostPressDetails : Fragment() {\n\n        //Here we are scoping the ViewModel to the Navigation graph with graph-id instead of this fragment\n        private val viewModel: ManagePrintOrderVM by navGraphViewModels(R.id.print_order_flow)\n\n       //Rest of the Fragment code\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

现在,当我尝试通过在模拟器中启动应用程序,将其放在后台,然后使用 android studio 中的“终止应用程序”按钮终止进程来测试应用程序的进程死亡时,它在使用以下命令重新创建时崩溃错误

\n
2022-03-19 19:06:44.633 7174-7174/com.sivakasi.papco.jobflow E/AndroidRuntime: FATAL EXCEPTION: …
Run Code Online (Sandbox Code Playgroud)

java android viewmodel

2
推荐指数
1
解决办法
572
查看次数