JetPack Compose-搜索栏将允许我搜索,并且光标将不会出现

发布于 2025-02-08 14:29:30 字数 5879 浏览 2 评论 0原文

我有一个自定义搜索栏将不允许我放置光标并在其中键入文本。在添加ViewModel和State之前,我能够进行TextField的工作,并允许在其中键入文本。

我已经尝试在合并中使用状态变量,而不是将逻辑分开为视图模型,不幸地收到相同的结果。我觉得我缺少但找不到它很简单。

自定义搜索栏:

@Composable
fun SearchBar(
    modifier: Modifier,
    viewModel: ToolSetListViewModel = hiltViewModel()
){

    Surface (
        modifier = modifier
            .fillMaxWidth()
            .height(74.dp)
            .padding(20.dp, 15.dp, 20.dp, 0.dp),
        elevation = 10.dp,
        color = MaterialTheme.colors.primary,
        shape = RoundedCornerShape(25)
            ){

        TextField(
            modifier = modifier
                .fillMaxWidth(),
            value = viewModel.searchText,
            onValueChange = {
                viewModel.onEvent(ToolSetListEvent.OnSearchToolSet(it))
            },
            placeholder = {
                Text(
                    modifier = modifier
                        .alpha(ContentAlpha.medium),
                    text = "Search...",
                    color = White
                )
            },
            textStyle = TextStyle(
                fontSize = MaterialTheme.typography.subtitle1.fontSize,
            ),
            singleLine = true,
            colors = TextFieldDefaults.textFieldColors(
                backgroundColor = Color.Transparent,
                cursorColor = White
            )
        )

    }

屏幕:

@Composable
fun ToolSetListScreen(
    onNavigate: (UiEvent.Navigate) -> Unit,
    viewModel: ToolSetListViewModel = hiltViewModel()
) {
    val toolSets = viewModel.toolSets.collectAsState(initial = emptyList())
    LaunchedEffect(key1 = true) {
        viewModel.uiEvent.collect { event ->
            when(event) {
                is UiEvent.Navigate -> onNavigate(event)
            }
        }
    }
    Scaffold (
        floatingActionButton = {
            FloatingActionButton(onClick = {
                viewModel.onEvent(ToolSetListEvent.OnAddToolSetClick)
            }) {
                Icon(
                    imageVector = Icons.Default.Add,
                    contentDescription = "Add")
            }
        }
            ) {
        SearchBar(
            modifier = Modifier,
            )
        LazyColumn(
            modifier = Modifier.fillMaxSize()
                .padding(0.dp, 20.dp)
        ) {
            items(toolSets.value) { toolset ->
                ToolSetItem(
                    toolSet = toolset,
                    onEvent = viewModel::onEvent,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(16.dp)
                        .clickable {
                            viewModel.onEvent(ToolSetListEvent.OnToolSetClick(toolset))
                        }
                )
            }
        }
    }
}

ViewModel:

@HiltViewModel
class ToolSetListViewModel @Inject constructor(
    private val repository: ToolSetRepository
): ViewModel() {

    val toolSets = repository.getAllToolSets()
    private val _uiEvent =  Channel<UiEvent>()
    val uiEvent = _uiEvent.receiveAsFlow()

    var searchText by mutableStateOf("")
        private set

    fun onEvent(event: ToolSetListEvent) {
        when(event) {
            is ToolSetListEvent.OnToolSetClick -> {
                sendUiEvent(UiEvent.Navigate(Routes.ADD_EDIT_TOOL_SET + "?PONumber=${event.toolSet.PONumber}"))
            }
            is ToolSetListEvent.OnDeleteToolSetClick -> {
                viewModelScope.launch {
                    repository.deleteToolSet(event.toolset)
                }
            }
            is ToolSetListEvent.OnAddToolSetClick -> {
                sendUiEvent(UiEvent.Navigate(Routes.ADD_EDIT_TOOL_SET))
            }
            is ToolSetListEvent.OnSearchToolSet -> {
                viewModelScope.launch {
                    if (event.searchText.isNotBlank()) {
                        searchText = event.searchText
                        repository.getToolSetByPO(event.searchText)
                    }
                }
            }

        }
    }

    private fun sendUiEvent(event: UiEvent) {
        viewModelScope.launch {
            _uiEvent.send(event)
        }
    }

MainActivity:

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            PunchesManagerTheme {
                val navController = rememberNavController()
                Scaffold (
                    content = {
                        Navigation(navController)
                              },
                    bottomBar = { BottomNavigationBar(navController = navController) },
                )
            }
        }
    }
}

@Composable
fun BottomNavigationBar(navController: NavHostController) {
    BottomNavigation {
      val backStackEntry by navController.currentBackStackEntryAsState()
      val currentRoute = backStackEntry?.destination?.route


        NavBarItems.bottomNavItem.forEach { navItem ->
            BottomNavigationItem(selected = currentRoute == navItem.route, onClick = {
                navController.navigate(navItem.route) {
                    popUpTo(navController.graph.findStartDestination().id) {
                        saveState = false
                    }
                    launchSingleTop = true
                    restoreState = true
                }
            },
                icon = {
                    Icon(imageVector = navItem.icon,
                    contentDescription = navItem.name)
                },
                label = {
                    Text(text = navItem.name)
                },
            )
        }
    }
}

关于问题的任何建议?

I have a custom search bar will not allow me to place a cursor and type text into it. Before adding the viewmodel and state, I was able to have the TextField work and allow typing text into it.

I've tried using state variables within the composable instead of separating the logic into the view model and unfortunatly recieved the same result. I have a feeling it's something simple that I'm missing but can't quite find it.

Custom Search Bar:

@Composable
fun SearchBar(
    modifier: Modifier,
    viewModel: ToolSetListViewModel = hiltViewModel()
){

    Surface (
        modifier = modifier
            .fillMaxWidth()
            .height(74.dp)
            .padding(20.dp, 15.dp, 20.dp, 0.dp),
        elevation = 10.dp,
        color = MaterialTheme.colors.primary,
        shape = RoundedCornerShape(25)
            ){

        TextField(
            modifier = modifier
                .fillMaxWidth(),
            value = viewModel.searchText,
            onValueChange = {
                viewModel.onEvent(ToolSetListEvent.OnSearchToolSet(it))
            },
            placeholder = {
                Text(
                    modifier = modifier
                        .alpha(ContentAlpha.medium),
                    text = "Search...",
                    color = White
                )
            },
            textStyle = TextStyle(
                fontSize = MaterialTheme.typography.subtitle1.fontSize,
            ),
            singleLine = true,
            colors = TextFieldDefaults.textFieldColors(
                backgroundColor = Color.Transparent,
                cursorColor = White
            )
        )

    }

Screen:

@Composable
fun ToolSetListScreen(
    onNavigate: (UiEvent.Navigate) -> Unit,
    viewModel: ToolSetListViewModel = hiltViewModel()
) {
    val toolSets = viewModel.toolSets.collectAsState(initial = emptyList())
    LaunchedEffect(key1 = true) {
        viewModel.uiEvent.collect { event ->
            when(event) {
                is UiEvent.Navigate -> onNavigate(event)
            }
        }
    }
    Scaffold (
        floatingActionButton = {
            FloatingActionButton(onClick = {
                viewModel.onEvent(ToolSetListEvent.OnAddToolSetClick)
            }) {
                Icon(
                    imageVector = Icons.Default.Add,
                    contentDescription = "Add")
            }
        }
            ) {
        SearchBar(
            modifier = Modifier,
            )
        LazyColumn(
            modifier = Modifier.fillMaxSize()
                .padding(0.dp, 20.dp)
        ) {
            items(toolSets.value) { toolset ->
                ToolSetItem(
                    toolSet = toolset,
                    onEvent = viewModel::onEvent,
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(16.dp)
                        .clickable {
                            viewModel.onEvent(ToolSetListEvent.OnToolSetClick(toolset))
                        }
                )
            }
        }
    }
}

ViewModel:

@HiltViewModel
class ToolSetListViewModel @Inject constructor(
    private val repository: ToolSetRepository
): ViewModel() {

    val toolSets = repository.getAllToolSets()
    private val _uiEvent =  Channel<UiEvent>()
    val uiEvent = _uiEvent.receiveAsFlow()

    var searchText by mutableStateOf("")
        private set

    fun onEvent(event: ToolSetListEvent) {
        when(event) {
            is ToolSetListEvent.OnToolSetClick -> {
                sendUiEvent(UiEvent.Navigate(Routes.ADD_EDIT_TOOL_SET + "?PONumber=${event.toolSet.PONumber}"))
            }
            is ToolSetListEvent.OnDeleteToolSetClick -> {
                viewModelScope.launch {
                    repository.deleteToolSet(event.toolset)
                }
            }
            is ToolSetListEvent.OnAddToolSetClick -> {
                sendUiEvent(UiEvent.Navigate(Routes.ADD_EDIT_TOOL_SET))
            }
            is ToolSetListEvent.OnSearchToolSet -> {
                viewModelScope.launch {
                    if (event.searchText.isNotBlank()) {
                        searchText = event.searchText
                        repository.getToolSetByPO(event.searchText)
                    }
                }
            }

        }
    }

    private fun sendUiEvent(event: UiEvent) {
        viewModelScope.launch {
            _uiEvent.send(event)
        }
    }

MainActivity:

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            PunchesManagerTheme {
                val navController = rememberNavController()
                Scaffold (
                    content = {
                        Navigation(navController)
                              },
                    bottomBar = { BottomNavigationBar(navController = navController) },
                )
            }
        }
    }
}

@Composable
fun BottomNavigationBar(navController: NavHostController) {
    BottomNavigation {
      val backStackEntry by navController.currentBackStackEntryAsState()
      val currentRoute = backStackEntry?.destination?.route


        NavBarItems.bottomNavItem.forEach { navItem ->
            BottomNavigationItem(selected = currentRoute == navItem.route, onClick = {
                navController.navigate(navItem.route) {
                    popUpTo(navController.graph.findStartDestination().id) {
                        saveState = false
                    }
                    launchSingleTop = true
                    restoreState = true
                }
            },
                icon = {
                    Icon(imageVector = navItem.icon,
                    contentDescription = navItem.name)
                },
                label = {
                    Text(text = navItem.name)
                },
            )
        }
    }
}

Any suggestions on what the issue may be?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

九局 2025-02-15 14:29:30

我想我找到了修复程序!

我调整了我的ToolSetListsCreen中粘合的布局:

 Scaffold (
        content = {
            SearchBar(
                modifier = Modifier,
            )
            LazyColumn(
                modifier = Modifier.fillMaxSize()
                    .padding(0.dp, 75.dp)
            ) {
                items(toolSets.value) { toolset ->
                    ToolSetItem(
                        toolSet = toolset,
                        onEvent = viewModel::onEvent,
                        modifier = Modifier
                            .fillMaxWidth()
                            .padding(16.dp)
                            .clickable {
                                viewModel.onEvent(ToolSetListEvent.OnToolSetClick(toolset))
                            }
                    )
                }
            }
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {
                viewModel.onEvent(ToolSetListEvent.OnAddToolSetClick)
            }) {
                Icon(
                    imageVector = Icons.Default.Add,
                    contentDescription = "Add")
            }
        }
            )
}

这似乎很有用。

I think I found the fix!

I adjusted the layout of my scaffoled in my ToolSetListScreen:

 Scaffold (
        content = {
            SearchBar(
                modifier = Modifier,
            )
            LazyColumn(
                modifier = Modifier.fillMaxSize()
                    .padding(0.dp, 75.dp)
            ) {
                items(toolSets.value) { toolset ->
                    ToolSetItem(
                        toolSet = toolset,
                        onEvent = viewModel::onEvent,
                        modifier = Modifier
                            .fillMaxWidth()
                            .padding(16.dp)
                            .clickable {
                                viewModel.onEvent(ToolSetListEvent.OnToolSetClick(toolset))
                            }
                    )
                }
            }
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {
                viewModel.onEvent(ToolSetListEvent.OnAddToolSetClick)
            }) {
                Icon(
                    imageVector = Icons.Default.Add,
                    contentDescription = "Add")
            }
        }
            )
}

and this seemed to work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文