Merge "Fix SearchScaffold navigation back arrow" into udc-dev

This commit is contained in:
Chaohui Wang
2023-03-13 06:49:20 +00:00
committed by Android (Google) Code Review

View File

@@ -41,6 +41,7 @@ import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
@@ -72,6 +73,7 @@ fun SearchScaffold(
actions: @Composable RowScope.() -> Unit = {}, actions: @Composable RowScope.() -> Unit = {},
content: @Composable (bottomPadding: Dp, searchQuery: State<String>) -> Unit, content: @Composable (bottomPadding: Dp, searchQuery: State<String>) -> Unit,
) { ) {
var isSearchMode by rememberSaveable { mutableStateOf(false) }
val viewModel: SearchScaffoldViewModel = viewModel() val viewModel: SearchScaffoldViewModel = viewModel()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
@@ -82,8 +84,11 @@ fun SearchScaffold(
title = title, title = title,
actions = actions, actions = actions,
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
isSearchMode = isSearchMode,
onSearchModeChange = { isSearchMode = it },
searchQuery = viewModel.searchQuery, searchQuery = viewModel.searchQuery,
) { viewModel.searchQuery = it } onSearchQueryChange = { viewModel.searchQuery = it },
)
}, },
) { paddingValues -> ) { paddingValues ->
Box( Box(
@@ -95,7 +100,7 @@ fun SearchScaffold(
content( content(
bottomPadding = paddingValues.calculateBottomPadding(), bottomPadding = paddingValues.calculateBottomPadding(),
searchQuery = remember { searchQuery = remember {
derivedStateOf { viewModel.searchQuery?.text ?: "" } derivedStateOf { if (isSearchMode) viewModel.searchQuery.text else "" }
}, },
) )
} }
@@ -103,7 +108,8 @@ fun SearchScaffold(
} }
internal class SearchScaffoldViewModel : ViewModel() { internal class SearchScaffoldViewModel : ViewModel() {
var searchQuery: TextFieldValue? by mutableStateOf(null) // Put in view model because TextFieldValue has not default Saver for rememberSaveable.
var searchQuery by mutableStateOf(TextFieldValue())
} }
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@@ -112,14 +118,16 @@ private fun SearchableTopAppBar(
title: String, title: String,
actions: @Composable RowScope.() -> Unit, actions: @Composable RowScope.() -> Unit,
scrollBehavior: TopAppBarScrollBehavior, scrollBehavior: TopAppBarScrollBehavior,
searchQuery: TextFieldValue?, isSearchMode: Boolean,
onSearchQueryChange: (TextFieldValue?) -> Unit, onSearchModeChange: (Boolean) -> Unit,
searchQuery: TextFieldValue,
onSearchQueryChange: (TextFieldValue) -> Unit,
) { ) {
if (searchQuery != null) { if (isSearchMode) {
SearchTopAppBar( SearchTopAppBar(
query = searchQuery, query = searchQuery,
onQueryChange = onSearchQueryChange, onQueryChange = onSearchQueryChange,
onClose = { onSearchQueryChange(null) }, onClose = { onSearchModeChange(false) },
actions = actions, actions = actions,
) )
} else { } else {
@@ -127,6 +135,7 @@ private fun SearchableTopAppBar(
SearchAction { SearchAction {
scrollBehavior.collapse() scrollBehavior.collapse()
onSearchQueryChange(TextFieldValue()) onSearchQueryChange(TextFieldValue())
onSearchModeChange(true)
} }
actions() actions()
} }