loginscreen

This commit is contained in:
2025-07-19 02:22:26 +03:00
parent 224cd8e411
commit e83535e871
9 changed files with 89 additions and 84 deletions

View File

@ -7,6 +7,8 @@ plugins {
alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.composeHotReload)
id("org.jetbrains.kotlin.plugin.serialization") version "1.9.20"
}
kotlin {
@ -44,6 +46,7 @@ kotlin {
implementation(compose.components.uiToolingPreview)
implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.lifecycle.runtimeCompose)
implementation("org.jetbrains.androidx.navigation:navigation-compose:2.9.0-beta03")
}
commonTest.dependencies {
implementation(libs.kotlin.test)

View File

@ -1,44 +1,18 @@
package su.sonoma.sclient
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import org.jetbrains.compose.resources.painterResource
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavController
import org.jetbrains.compose.ui.tooling.preview.Preview
import sclient.composeapp.generated.resources.Res
import sclient.composeapp.generated.resources.compose_multiplatform
@Composable
@Preview
fun App() {
MaterialTheme {
var showContent by remember { mutableStateOf(false) }
Column(
modifier = Modifier
.safeContentPadding()
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Button(onClick = { showContent = !showContent }) {
Text("Click me!")
}
AnimatedVisibility(showContent) {
val greeting = remember { Greeting().greet() }
Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
Image(painterResource(Res.drawable.compose_multiplatform), null)
Text("Compose: $greeting")
}
}
}
fun App(
onNavHostReady: suspend (NavController) -> Unit = {}
) {
val navController = Navigation().getNavController()
LaunchedEffect(navController) {
onNavHostReady(navController)
}
}

View File

@ -1,9 +0,0 @@
package su.sonoma.sclient
class Greeting {
private val platform = getPlatform()
fun greet(): String {
return "Hello, ${platform.name}!"
}
}

View File

@ -0,0 +1,26 @@
package su.sonoma.sclient
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import kotlinx.serialization.Serializable
import su.sonoma.sclient.screen.LoginScreen
@Serializable
class Navigation {
@Serializable
object Login
@Composable
fun getNavController(): NavHostController {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Login) {
composable<Login> { LoginScreen() }
}
return navController
}
}

View File

@ -1,7 +0,0 @@
package su.sonoma.sclient
interface Platform {
val name: String
}
expect fun getPlatform(): Platform

View File

@ -0,0 +1,50 @@
package su.sonoma.sclient.screen
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@Composable
fun LoginScreen() {
MaterialTheme {
Column(
modifier = Modifier
.safeContentPadding()
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
) {
var login by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
TextField(
value = login,
onValueChange = { login = it},
label = { Text("Login") }
)
TextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") }
)
Button(
onClick = { print("$login, $password") }
) {
Text("Login")
}
}
}
}

View File

@ -1,7 +0,0 @@
package su.sonoma.sclient
class JVMPlatform: Platform {
override val name: String = "Java ${System.getProperty("java.version")}"
}
actual fun getPlatform(): Platform = JVMPlatform()

View File

@ -1,7 +0,0 @@
package su.sonoma.sclient
class WasmPlatform: Platform {
override val name: String = "Web with Kotlin/Wasm"
}
actual fun getPlatform(): Platform = WasmPlatform()