Turns out the lifecycle owner changes quite a bit and thus it's a requirement to make it the key of a Disposable Effect.

This commit is contained in:
Vitor Pamplona
2023-09-22 13:24:37 -04:00
parent a0308bd3a1
commit d5220324c4
21 changed files with 95 additions and 46 deletions

View File

@@ -194,7 +194,7 @@ private fun RenderSearch(
} }
} }
DisposableEffect(Unit) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Join Start") println("Join Start")

View File

@@ -614,7 +614,7 @@ fun ZoomableImageDialog(
) { ) {
val view = LocalView.current val view = LocalView.current
DisposableEffect(key1 = Unit) { DisposableEffect(key1 = view) {
if (Build.VERSION.SDK_INT >= 30) { if (Build.VERSION.SDK_INT >= 30) {
view.windowInsetsController?.hide( view.windowInsetsController?.hide(
android.view.WindowInsets.Type.systemBars() android.view.WindowInsets.Type.systemBars()

View File

@@ -284,7 +284,7 @@ fun AppNavigation(
actionableNextPage = null actionableNextPage = null
} }
DisposableEffect(navController) { DisposableEffect(activity) {
val consumer = Consumer<Intent> { intent -> val consumer = Consumer<Intent> { intent ->
val uri = intent?.data?.toString() val uri = intent?.data?.toString()
val newPage = uriToRoute(uri) val newPage = uriToRoute(uri)

View File

@@ -4,7 +4,6 @@ import android.util.Log
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import com.google.zxing.client.android.Intents import com.google.zxing.client.android.Intents
import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanContract
@@ -40,8 +39,6 @@ fun NIP19QrCodeScanner(onScan: (String?) -> Unit) {
@Composable @Composable
fun SimpleQrCodeScanner(onScan: (String?) -> Unit) { fun SimpleQrCodeScanner(onScan: (String?) -> Unit) {
val lifecycleOwner = LocalLifecycleOwner.current
val qrLauncher = val qrLauncher =
rememberLauncherForActivityResult(ScanContract()) { rememberLauncherForActivityResult(ScanContract()) {
if (it.contents != null) { if (it.contents != null) {
@@ -59,7 +56,7 @@ fun SimpleQrCodeScanner(onScan: (String?) -> Unit) {
addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN) addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN)
} }
DisposableEffect(lifecycleOwner) { DisposableEffect(Unit) {
qrLauncher.launch(scanOptions) qrLauncher.launch(scanOptions)
onDispose { } onDispose { }
} }

View File

@@ -70,16 +70,20 @@ class RelayFeedViewModel : ViewModel() {
} }
fun subscribeTo(user: User) { fun subscribeTo(user: User) {
currentUser = user if (currentUser != user) {
user.live().relays.observeForever(listener) currentUser = user
user.live().relayInfo.observeForever(listener) user.live().relays.observeForever(listener)
invalidateData() user.live().relayInfo.observeForever(listener)
invalidateData()
}
} }
fun unsubscribeTo(user: User) { fun unsubscribeTo(user: User) {
user.live().relays.removeObserver(listener) if (currentUser == user) {
user.live().relayInfo.removeObserver(listener) user.live().relays.removeObserver(listener)
currentUser = null user.live().relayInfo.removeObserver(listener)
currentUser = null
}
} }
private val bundler = BundledUpdate(250, Dispatchers.IO) private val bundler = BundledUpdate(250, Dispatchers.IO)

View File

@@ -47,7 +47,7 @@ fun rememberForeverLazyListState(
savedOffset.roundToInt() savedOffset.roundToInt()
) )
} }
DisposableEffect(Unit) { DisposableEffect(scrollState) {
onDispose { onDispose {
val lastIndex = scrollState.firstVisibleItemIndex val lastIndex = scrollState.firstVisibleItemIndex
val lastOffset = scrollState.firstVisibleItemScrollOffset val lastOffset = scrollState.firstVisibleItemScrollOffset

View File

@@ -196,9 +196,6 @@ fun ChannelScreen(
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
NostrChannelDataSource.start()
feedViewModel.invalidateData(true)
launch(Dispatchers.IO) { launch(Dispatchers.IO) {
newPostModel.imageUploadingError.collect { error -> newPostModel.imageUploadingError.collect { error ->
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
@@ -209,6 +206,17 @@ fun ChannelScreen(
} }
DisposableEffect(accountViewModel) { DisposableEffect(accountViewModel) {
NostrChannelDataSource.loadMessagesBetween(accountViewModel.account, channel)
NostrChannelDataSource.start()
feedViewModel.invalidateData(true)
onDispose {
NostrChannelDataSource.clear()
NostrChannelDataSource.stop()
}
}
DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Channel Start") println("Channel Start")

View File

@@ -67,7 +67,7 @@ fun ChatroomListScreen(
WatchAccountForListScreen(knownFeedViewModel, newFeedViewModel, accountViewModel) WatchAccountForListScreen(knownFeedViewModel, newFeedViewModel, accountViewModel)
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
NostrChatroomListDataSource.start() NostrChatroomListDataSource.start()

View File

@@ -234,9 +234,6 @@ fun ChatroomScreen(
LaunchedEffect(room, accountViewModel) { LaunchedEffect(room, accountViewModel) {
launch(Dispatchers.IO) { launch(Dispatchers.IO) {
NostrChatroomDataSource.start()
feedViewModel.invalidateData()
newPostModel.imageUploadingError.collect { error -> newPostModel.imageUploadingError.collect { error ->
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText(context, error, Toast.LENGTH_SHORT).show() Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
@@ -246,6 +243,16 @@ fun ChatroomScreen(
} }
DisposableEffect(room, accountViewModel) { DisposableEffect(room, accountViewModel) {
NostrChatroomDataSource.loadMessagesBetween(accountViewModel.account, room)
NostrChatroomDataSource.start()
feedViewModel.invalidateData()
onDispose {
NostrChatroomDataSource.stop()
}
}
DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Private Message Start") println("Private Message Start")

View File

@@ -56,7 +56,7 @@ fun CommunityScreen(note: AddressableNote, feedViewModel: NostrCommunityFeedView
feedViewModel.invalidateData() feedViewModel.invalidateData()
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Community Start") println("Community Start")

View File

@@ -88,7 +88,7 @@ fun DiscoverScreen(
accountViewModel = accountViewModel accountViewModel = accountViewModel
) )
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Discovery Start") println("Discovery Start")

View File

@@ -65,12 +65,16 @@ fun GeoHashScreen(tag: String, feedViewModel: NostrGeoHashFeedViewModel, account
NostrGeohashDataSource.loadHashtag(tag) NostrGeohashDataSource.loadHashtag(tag)
LaunchedEffect(tag) { DisposableEffect(tag) {
NostrGeohashDataSource.start() NostrGeohashDataSource.start()
feedViewModel.invalidateData() feedViewModel.invalidateData()
onDispose {
NostrGeohashDataSource.loadHashtag(null)
NostrGeohashDataSource.stop()
}
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Hashtag Start") println("Hashtag Start")
@@ -88,8 +92,6 @@ fun GeoHashScreen(tag: String, feedViewModel: NostrGeoHashFeedViewModel, account
lifeCycleOwner.lifecycle.addObserver(observer) lifeCycleOwner.lifecycle.addObserver(observer)
onDispose { onDispose {
lifeCycleOwner.lifecycle.removeObserver(observer) lifeCycleOwner.lifecycle.removeObserver(observer)
NostrGeohashDataSource.loadHashtag(null)
NostrGeohashDataSource.stop()
} }
} }

View File

@@ -12,7 +12,6 @@ import androidx.compose.material.Divider
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
@@ -61,12 +60,17 @@ fun HashtagScreen(tag: String, feedViewModel: NostrHashtagFeedViewModel, account
NostrHashtagDataSource.loadHashtag(tag) NostrHashtagDataSource.loadHashtag(tag)
LaunchedEffect(tag) { DisposableEffect(tag) {
NostrHashtagDataSource.start() NostrHashtagDataSource.start()
feedViewModel.invalidateData() feedViewModel.invalidateData()
onDispose {
NostrHashtagDataSource.loadHashtag(null)
NostrHashtagDataSource.stop()
}
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Hashtag Start") println("Hashtag Start")
@@ -84,8 +88,6 @@ fun HashtagScreen(tag: String, feedViewModel: NostrHashtagFeedViewModel, account
lifeCycleOwner.lifecycle.addObserver(observer) lifeCycleOwner.lifecycle.addObserver(observer)
onDispose { onDispose {
lifeCycleOwner.lifecycle.removeObserver(observer) lifeCycleOwner.lifecycle.removeObserver(observer)
NostrHashtagDataSource.loadHashtag(null)
NostrHashtagDataSource.stop()
} }
} }

View File

@@ -61,7 +61,7 @@ fun HiddenUsersScreen(
) { ) {
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Hidden Users Start") println("Hidden Users Start")

View File

@@ -63,7 +63,7 @@ fun HomeScreen(
} }
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
NostrHomeDataSource.invalidateFilters() NostrHomeDataSource.invalidateFilters()

View File

@@ -16,6 +16,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State import androidx.compose.runtime.State
@@ -33,7 +34,10 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavBackStackEntry import androidx.navigation.NavBackStackEntry
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
@@ -323,6 +327,20 @@ fun WatchNavStateToUpdateBarVisibility(navState: State<NavBackStackEntry?>, bott
LaunchedEffect(key1 = navState.value) { LaunchedEffect(key1 = navState.value) {
bottomBarOffsetHeightPx.value = 0f bottomBarOffsetHeightPx.value = 0f
} }
val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) {
bottomBarOffsetHeightPx.value = 0f
}
}
lifeCycleOwner.lifecycle.addObserver(observer)
onDispose {
lifeCycleOwner.lifecycle.removeObserver(observer)
}
}
} }
@Composable @Composable

View File

@@ -75,7 +75,7 @@ fun NotificationScreen(
CheckifItNeedsToRequestNotificationPermission() CheckifItNeedsToRequestNotificationPermission()
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
NostrAccountDataSource.invalidateFilters() NostrAccountDataSource.invalidateFilters()

View File

@@ -238,11 +238,15 @@ fun ProfileScreen(
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
LaunchedEffect(Unit) { DisposableEffect(accountViewModel) {
NostrUserProfileDataSource.start() NostrUserProfileDataSource.start()
onDispose {
NostrUserProfileDataSource.loadUserProfile(null)
NostrUserProfileDataSource.stop()
}
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Profidle Start") println("Profidle Start")
@@ -259,9 +263,6 @@ fun ProfileScreen(
lifeCycleOwner.lifecycle.addObserver(observer) lifeCycleOwner.lifecycle.addObserver(observer)
onDispose { onDispose {
lifeCycleOwner.lifecycle.removeObserver(observer) lifeCycleOwner.lifecycle.removeObserver(observer)
println("Profile Dispose")
NostrUserProfileDataSource.loadUserProfile(null)
NostrUserProfileDataSource.stop()
} }
} }
@@ -1567,6 +1568,13 @@ fun TabRelays(user: User, accountViewModel: AccountViewModel, nav: (String) -> U
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(user) { DisposableEffect(user) {
feedViewModel.subscribeTo(user)
onDispose {
feedViewModel.unsubscribeTo(user)
}
}
DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Profile Relay Start") println("Profile Relay Start")

View File

@@ -104,7 +104,7 @@ fun SearchScreen(
WatchAccountForSearchScreen(accountViewModel) WatchAccountForSearchScreen(accountViewModel)
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Search Start") println("Search Start")

View File

@@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.LocalLifecycleOwner
@@ -28,11 +27,15 @@ fun ThreadScreen(noteId: String?, accountViewModel: AccountViewModel, nav: (Stri
NostrThreadDataSource.loadThread(noteId) NostrThreadDataSource.loadThread(noteId)
LaunchedEffect(noteId) { DisposableEffect(noteId) {
feedViewModel.invalidateData(true) feedViewModel.invalidateData(true)
onDispose {
NostrThreadDataSource.loadThread(null)
NostrThreadDataSource.stop()
}
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Thread Start") println("Thread Start")

View File

@@ -89,7 +89,7 @@ fun VideoScreen(
WatchAccountForVideoScreen(videoFeedView = videoFeedView, accountViewModel = accountViewModel) WatchAccountForVideoScreen(videoFeedView = videoFeedView, accountViewModel = accountViewModel)
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Video Start") println("Video Start")