fix: 源变量无法设置的问题

This commit is contained in:
HapeLee
2026-06-04 00:59:30 +08:00
parent 429667d74a
commit e6dcc7229f
3 changed files with 84 additions and 14 deletions
@@ -1,9 +1,6 @@
@file:Suppress("DEPRECATION")
package io.legado.app.ui.rss.article
import android.app.Activity
import androidx.activity.compose.LocalActivity
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -14,15 +11,12 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.appcompat.app.AppCompatActivity
import io.legado.app.R
import io.legado.app.data.entities.RssReadRecord
import io.legado.app.ui.login.SourceLoginActivity
import io.legado.app.ui.rss.read.RedirectPolicy
import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
import io.legado.app.ui.widget.dialog.VariableDialog
import io.legado.app.utils.StartActivityContract
import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.startActivity
import io.legado.app.utils.toastOnUi
import kotlinx.coroutines.Dispatchers
@@ -40,7 +34,6 @@ fun RssSortRouteScreen(
viewModel: RssSortViewModel = koinViewModel()
) {
val context = LocalContext.current
val activity = LocalActivity.current as? AppCompatActivity
val scope = rememberCoroutineScope()
var sortList by remember(sourceUrl) { mutableStateOf<List<Pair<String, String>>>(emptyList()) }
@@ -52,6 +45,7 @@ fun RssSortRouteScreen(
var showReadRecordSheet by remember { mutableStateOf(false) }
var readRecords by remember { mutableStateOf<List<RssReadRecord>>(emptyList()) }
var sourceVariableSheet by remember { mutableStateOf<RssSourceVariableSheetState?>(null) }
suspend fun reloadSourceState() {
withContext(Dispatchers.IO) {
@@ -83,6 +77,7 @@ fun RssSortRouteScreen(
redirectPolicy = redirectPolicy,
showReadRecordSheet = showReadRecordSheet,
readRecords = readRecords,
sourceVariableSheet = sourceVariableSheet,
onBackClick = onBackClick,
onLogin = {
context.startActivity<SourceLoginActivity> {
@@ -105,16 +100,19 @@ fun RssSortRouteScreen(
}
val comment = source.getDisplayVariableComment("源变量可在js中通过source.getVariable()获取")
val variable = withContext(Dispatchers.IO) { source.getVariable() }
activity?.showDialogFragment(
VariableDialog(
setSourceVariableText,
source.getKey(),
variable,
comment
)
sourceVariableSheet = RssSourceVariableSheetState(
title = setSourceVariableText,
variable = variable,
comment = comment
)
}
},
onDismissSourceVariable = { sourceVariableSheet = null },
onSaveSourceVariable = { variable ->
viewModel.setSourceVariable(variable)
sourceVariableSheet = null
context.toastOnUi(R.string.save_success)
},
onEditSource = {
viewModel.rssSource?.sourceUrl?.let { srcUrl ->
editSourceResult.launch { putExtra("sourceUrl", srcUrl) }
@@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
@@ -14,12 +15,15 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.FormatListBulleted
import androidx.compose.material.icons.automirrored.filled.Login
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.CleaningServices
import androidx.compose.material.icons.filled.Dataset
import androidx.compose.material.icons.filled.Done
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.History
import androidx.compose.material.icons.filled.Refresh
@@ -33,6 +37,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.runtime.Stable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
@@ -47,7 +52,9 @@ import io.legado.app.ui.rss.read.title
import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.theme.adaptiveHorizontalPaddingTab
import io.legado.app.ui.widget.components.AppScaffold
import io.legado.app.ui.widget.components.AppTextField
import io.legado.app.ui.widget.components.EmptyMessage
import io.legado.app.ui.widget.components.button.series.MediumPlainButton
import io.legado.app.ui.widget.components.button.series.SmallPlainButton
import io.legado.app.ui.widget.components.button.series.SmallToggleButton
import io.legado.app.ui.widget.components.button.series.ToggleStyle
@@ -65,6 +72,13 @@ import io.legado.app.ui.widget.components.topbar.TopBarActionButton
import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton
import kotlinx.coroutines.launch
@Stable
data class RssSourceVariableSheetState(
val title: String,
val variable: String,
val comment: String
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun RssSortScreen(
@@ -75,10 +89,13 @@ fun RssSortScreen(
redirectPolicy: RedirectPolicy,
showReadRecordSheet: Boolean,
readRecords: List<RssReadRecord>,
sourceVariableSheet: RssSourceVariableSheetState?,
onBackClick: () -> Unit,
onLogin: () -> Unit,
onRefreshSort: () -> Unit,
onSetSourceVariable: () -> Unit,
onDismissSourceVariable: () -> Unit,
onSaveSourceVariable: (String) -> Unit,
onEditSource: () -> Unit,
onSwitchLayout: () -> Unit,
onReadRecord: () -> Unit,
@@ -305,6 +322,12 @@ fun RssSortScreen(
onClear = onClearReadRecord,
onOpen = onOpenReadRecord
)
RssSourceVariableSheet(
state = sourceVariableSheet,
onDismissRequest = onDismissSourceVariable,
onSave = onSaveSourceVariable
)
}
@Composable
@@ -367,3 +390,48 @@ private fun RssReadRecordSheet(
}
}
}
@Composable
private fun RssSourceVariableSheet(
state: RssSourceVariableSheetState?,
onDismissRequest: () -> Unit,
onSave: (String) -> Unit
) {
var variable by remember(state) { mutableStateOf(state?.variable.orEmpty()) }
AppModalBottomSheet(
data = state,
onDismissRequest = onDismissRequest,
title = state?.title,
endAction = {
MediumPlainButton(
onClick = { onSave(variable) },
icon = Icons.Default.Done,
contentDescription = stringResource(R.string.ok)
)
}
) { sheetState ->
Column(
modifier = Modifier
.fillMaxWidth()
.verticalScroll(rememberScrollState())
.navigationBarsPadding()
.padding(bottom = 32.dp)
) {
AppText(
text = sheetState.comment,
style = LegadoTheme.typography.bodyMedium,
color = LegadoTheme.colorScheme.onSurfaceVariant,
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 12.dp)
)
AppTextField(
value = variable,
onValueChange = { variable = it },
modifier = Modifier.fillMaxWidth(),
minLines = 8
)
}
}
}
@@ -75,6 +75,10 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {
rssSource?.removeSortCache()
}
fun setSourceVariable(variable: String?) {
rssSource?.setVariable(variable)
}
fun getRecords(): List<RssReadRecord> {
return appDb.rssReadRecordDao.getRecords()
}