solidogen
06/07/2021, 4:15 PMDustin Lam
06/07/2021, 11:19 PMDustin Lam
06/07/2021, 11:19 PMDustin Lam
06/07/2021, 11:20 PMDustin Lam
06/07/2021, 11:20 PMsolidogen
06/09/2021, 9:34 AMsolidogen
06/09/2021, 9:35 AMsolidogen
06/09/2021, 7:34 PMflowWithLifecycle
from lifecycle 2.4.0-alpha01.
This does not work at all 🙂Dustin Lam
06/09/2021, 7:58 PMDustin Lam
06/09/2021, 7:58 PMDustin Lam
06/09/2021, 8:00 PMsolidogen
06/09/2021, 8:03 PM/**
* Do NOT use with paging - creates a bug
* */
fun <T> Flow<T>.observeIn(fragment: Fragment): Job {
return observeIn(fragment.viewLifecycleOwner)
}
fun <T> Flow<T>.observeIn(lifecycleOwner: LifecycleOwner): Job {
return flowWithLifecycle(lifecycleOwner.lifecycle)
.launchIn(lifecycleOwner.lifecycle.coroutineScope)
}
It seems to collect only once from Flow≤PagingData<T>> though, all other cases are fineDustin Lam
06/09/2021, 8:15 PMDustin Lam
06/09/2021, 8:19 PMDustin Lam
06/09/2021, 8:19 PMsolidogen
06/09/2021, 8:19 PMsolidogen
06/09/2021, 8:19 PMsolidogen
06/09/2021, 8:21 PMDustin Lam
06/09/2021, 8:21 PMDustin Lam
06/09/2021, 8:22 PMDustin Lam
06/09/2021, 8:22 PMDustin Lam
06/09/2021, 8:22 PMDustin Lam
06/09/2021, 8:22 PMDustin Lam
06/09/2021, 8:23 PMDustin Lam
06/09/2021, 8:23 PMsolidogen
06/09/2021, 8:24 PMsolidogen
06/09/2021, 8:24 PMDustin Lam
06/09/2021, 8:24 PMDustin Lam
06/09/2021, 8:24 PMDustin Lam
06/09/2021, 8:24 PMDustin Lam
06/09/2021, 8:24 PMDustin Lam
06/09/2021, 8:25 PMsolidogen
06/09/2021, 8:25 PMDustin Lam
06/09/2021, 8:25 PMDustin Lam
06/09/2021, 8:26 PMsolidogen
06/09/2021, 8:26 PMDustin Lam
06/09/2021, 8:27 PMsolidogen
06/09/2021, 8:27 PMsolidogen
06/09/2021, 8:27 PMsolidogen
06/09/2021, 8:28 PMsolidogen
06/09/2021, 8:28 PMDustin Lam
06/09/2021, 8:29 PMsolidogen
06/09/2021, 8:29 PMsolidogen
06/09/2021, 8:29 PMsolidogen
06/09/2021, 8:30 PMsolidogen
06/09/2021, 8:30 PMDustin Lam
06/09/2021, 8:30 PMDustin Lam
06/09/2021, 8:31 PMsolidogen
06/09/2021, 8:31 PMDustin Lam
06/09/2021, 8:32 PMsolidogen
06/09/2021, 8:32 PMsolidogen
06/09/2021, 8:33 PMsolidogen
06/09/2021, 8:33 PMsolidogen
06/09/2021, 8:33 PM@Entity(tableName = "profiles")
data class ProfileEntity(
@PrimaryKey(autoGenerate = true) @ColumnInfo(name = "auto_generated_id") val autoGeneratedId: Long,
@ColumnInfo(name = "bio") val bio: String,
@ColumnInfo(name = "birth_date") val birthDate: LocalDate?,
@ColumnInfo(name = "has_children") val hasChildren: Boolean?,
@ColumnInfo(name = "describe_tags") val describeTags: List<String>,
@ColumnInfo(name = "education_level") val educationLevel: EducationLevel,
@ColumnInfo(name = "id") val id: Long,
@ColumnInfo(name = "is_liked") val isLiked: Boolean,
@ColumnInfo(name = "like_tags") val likeTags: List<String>,
@ColumnInfo(name = "likes") val likes: Long,
@ColumnInfo(name = "marital_status") val maritalStatus: MaritalStatus,
@ColumnInfo(name = "photo_id") val photoId: Long?,
@ColumnInfo(name = "religiosity_level") val religiosityLevel: ReligiosityLevel,
@ColumnInfo(name = "gender") val gender: Gender,
@ColumnInfo(name = "username") val username: String,
@ColumnInfo(name = "api_page_index") val apiPageIndex: Int
)
solidogen
06/09/2021, 8:34 PM@Query("SELECT * FROM profiles ORDER BY api_page_index")
fun getRandomProfilesPagingSource(): PagingSource<Int, ProfileEntity>
dustin
06/09/2021, 8:35 PMdustin
06/09/2021, 8:35 PMdustin
06/09/2021, 8:35 PMsolidogen
06/09/2021, 8:35 PMsolidogen
06/09/2021, 8:36 PMdustin
06/09/2021, 8:37 PMval myPagingSourceFactory = InvalidatingPagingSourceFactory {
myDao.pagingSource()
}
val pager = Pager(pagingSourceFactory = myPagingSourceFactory)
...
// Whenever you need to:
myPagingSourceFactory.invalidate()
solidogen
06/09/2021, 8:37 PMdustin
06/09/2021, 8:37 PMdustin
06/09/2021, 8:38 PMsolidogen
06/09/2021, 8:38 PMsealed class ProfilesAdapterItem : AdapterItem {
data class ProfileItem(val profile: Profile) : ProfilesAdapterItem()
object ReadyToStartMatchingItem : ProfilesAdapterItem()
}
private suspend fun handlePagingData(pagingData: PagingData<Profile>) {
val mappedUiModels: PagingData<ProfilesAdapterItem> =
pagingData.map { ProfilesAdapterItem.ProfileItem(it) }
profilesPagingAdapter.submitData(mappedUiModels)
}
class ProfilesAdapterItemDiffCallback : DiffUtil.ItemCallback<ProfilesAdapterItem>() {
override fun areItemsTheSame(oldItem: ProfilesAdapterItem, newItem: ProfilesAdapterItem): Boolean {
return when {
oldItem is ProfileItem && newItem is ProfileItem -> oldItem.profile.id == newItem.profile.id
oldItem is ReadyToStartMatchingItem && newItem is ReadyToStartMatchingItem -> true
else -> false
}
}
override fun areContentsTheSame(oldItem: ProfilesAdapterItem, newItem: ProfilesAdapterItem): Boolean {
return oldItem == newItem
}
}
solidogen
06/09/2021, 8:39 PMdata class Profile(
val bio: String,
val birthDate: LocalDate?,
val hasChildren: Boolean?,
val describeTags: List<Tag>,
val educationLevel: EducationLevel,
val id: Long,
val isLiked: Boolean,
val likeTags: List<Tag>,
val likes: Long,
val maritalStatus: MaritalStatus,
val photoId: Long?,
val photoUrl: String?,
val religiosityLevel: ReligiosityLevel,
val gender: Gender,
val username: String,
) {
val age: Int?
get() = birthDate?.let { Period.between(birthDate, LocalDate.now()) }?.years
}
dustin
06/09/2021, 8:42 PMadapter.snapshot()
before invalidate and after when it jumps?dustin
06/09/2021, 8:42 PMdustin
06/09/2021, 8:42 PMadapter.loadStateFlow.collect {
if (it.source.refresh is NotLoading) {
println(adapter.snapshot())
}
}
dustin
06/09/2021, 8:43 PMdustin
06/09/2021, 8:43 PMsolidogen
06/09/2021, 8:43 PMdustin
06/09/2021, 8:44 PMadapter.loadStateFlow.collect {
if (it.source.refresh is Loading) {
println("refresh loading")
}
if (it.source.refresh is NotLoading) {
println(adapter.snapshot())
}
}
dustin
06/09/2021, 8:44 PMdustin
06/09/2021, 8:44 PMsolidogen
06/09/2021, 8:45 PMdustin
06/09/2021, 8:46 PMsolidogen
06/09/2021, 8:46 PMsolidogen
06/09/2021, 8:48 PMsolidogen
06/09/2021, 8:48 PMsolidogen
06/09/2021, 8:48 PMDustin Lam
06/09/2021, 8:49 PMDustin Lam
06/09/2021, 8:49 PMsolidogen
06/09/2021, 8:51 PMsolidogen
06/09/2021, 8:53 PMDustin Lam
06/09/2021, 8:53 PMsolidogen
06/09/2021, 8:53 PMsolidogen
06/09/2021, 8:53 PMsolidogen
06/09/2021, 8:54 PMDustin Lam
06/09/2021, 8:54 PMsolidogen
06/09/2021, 8:54 PMsolidogen
06/09/2021, 8:54 PMsolidogen
06/09/2021, 8:54 PMsolidogen
06/09/2021, 8:54 PMsolidogen
06/09/2021, 8:55 PMDustin Lam
06/09/2021, 8:55 PMsolidogen
06/09/2021, 8:55 PMsolidogen
06/09/2021, 8:56 PMDustin Lam
06/09/2021, 8:56 PMsolidogen
06/09/2021, 9:09 PMdustin
06/09/2021, 9:37 PMdustin
06/09/2021, 9:37 PMdustin
06/09/2021, 9:38 PMdustin
06/09/2021, 9:39 PMsolidogen
06/09/2021, 9:49 PMdustin
06/09/2021, 10:29 PMdustin
06/09/2021, 10:29 PMdustin
06/09/2021, 10:29 PMdustin
06/09/2021, 10:32 PMdustin
06/09/2021, 10:33 PMdustin
06/09/2021, 10:34 PMsolidogen
06/09/2021, 10:44 PMsolidogen
08/20/2021, 5:12 PMsolidogen
08/20/2021, 7:22 PMDustin Lam
08/22/2021, 12:23 AMDustin Lam
08/22/2021, 12:23 AMsolidogen
08/22/2021, 1:04 PMsolidogen
08/27/2021, 7:06 AM