From f1c0642cf784f2287dcc0623a08ef39eda0d787b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=90=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?=D0=BA=D0=B8=D0=BD?= Date: Fri, 22 Dec 2023 23:07:54 +0400 Subject: [PATCH] =?UTF-8?q?3-=D0=B0=D1=8F=20=D0=B2=D1=80=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/myapplication/MainActivity.kt | 29 ++- .../myapplication/components/InputContent.kt | 69 ++++++ .../myapplication/components/navBar.kt | 2 +- .../myapplication/database/MobileDatabase.kt | 26 --- .../myapplication/database/dao/CardDao.kt | 2 +- .../myapplication/database/dao/UserDao.kt | 2 +- .../myapplication/screens/createcard.kt | 50 ---- .../example/myapplication/screens/editcard.kt | 213 ++++++++++++++++-- .../myapplication/screens/mainScreen.kt | 30 +-- .../com/example/myapplication/screens/user.kt | 33 ++- app/src/main/res/drawable/plus.png | Bin 0 -> 22467 bytes 11 files changed, 323 insertions(+), 133 deletions(-) create mode 100644 app/src/main/java/com/example/myapplication/components/InputContent.kt delete mode 100644 app/src/main/java/com/example/myapplication/screens/createcard.kt create mode 100644 app/src/main/res/drawable/plus.png diff --git a/app/src/main/java/com/example/myapplication/MainActivity.kt b/app/src/main/java/com/example/myapplication/MainActivity.kt index 1e7152e..cb9682a 100644 --- a/app/src/main/java/com/example/myapplication/MainActivity.kt +++ b/app/src/main/java/com/example/myapplication/MainActivity.kt @@ -19,12 +19,14 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -41,11 +43,14 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.navigation.compose.NavHost import androidx.navigation.NavHostController +import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +import androidx.navigation.navArgument +import com.example.myapplication.database.MobileAppDataBase import com.example.myapplication.screens.Authorization -import com.example.myapplication.screens.CreateCard -import com.example.myapplication.screens.EditCard +import com.example.myapplication.screens.EditCardScreen +import com.example.myapplication.screens.EditUserScreen import com.example.myapplication.ui.theme.MyApplicationTheme import com.example.myapplication.screens.MainScreen import com.example.myapplication.screens.Registration @@ -69,11 +74,13 @@ class MainActivity : ComponentActivity() { } } +@OptIn(ExperimentalMaterial3Api::class) @Composable fun AppNavigation(navController: NavHostController){ NavHost( navController = navController, startDestination = "authorization" ) { + composable("authorization") { Authorization(navController = navController) } @@ -83,14 +90,22 @@ fun AppNavigation(navController: NavHostController){ composable("registration") { Registration(navController = navController) } - composable("createCard") { - CreateCard(navController = navController) - } composable("userSettings") { UserSettings(navController = navController) } - composable("editCard") { - EditCard(navController = navController) + composable("editcard") { + EditCardScreen(navController = navController) + } + composable( + "editcard/{id}", + arguments = listOf(navArgument("id") { type = NavType.IntType }) //С аргументом + ) { backStackEntry -> + backStackEntry.arguments?.let { + EditCardScreen(navController = navController, cardId = it.getInt("id")) + } + } + composable("edituser"){ + EditUserScreen(navController = navController) } } } diff --git a/app/src/main/java/com/example/myapplication/components/InputContent.kt b/app/src/main/java/com/example/myapplication/components/InputContent.kt new file mode 100644 index 0000000..5da51dd --- /dev/null +++ b/app/src/main/java/com/example/myapplication/components/InputContent.kt @@ -0,0 +1,69 @@ +package com.example.myapplication.components + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +val buttonHeightStandard = 72.dp + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PlaceholderInputField(label: String, startValue: String? = null, isSingleLine: Boolean, onTextChanged: (String) -> Unit){ + var text = remember { mutableStateOf("") } + startValue?.let{ + text.value = startValue + } + Text( + modifier = Modifier.padding(horizontal = 8.dp), + text = label, + fontSize = 20.sp + ) + OutlinedTextField( + value = text.value, + onValueChange = { + text.value = it + onTextChanged(it) + }, + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp, start = 16.dp, bottom = 8.dp, end = 16.dp), + shape = RoundedCornerShape(10.dp), + singleLine = isSingleLine + ) +} + +@Composable +fun ActiveButton(label: String, backgroundColor: Color, textColor: Color, onClickAction: () -> Unit){ + Button( + onClick = onClickAction, + modifier = Modifier + .fillMaxWidth() + .requiredHeight(buttonHeightStandard) + .padding(top = 8.dp, start = 16.dp, bottom = 8.dp, end = 16.dp), + colors = ButtonDefaults.buttonColors( + containerColor = backgroundColor + ), + shape = RoundedCornerShape(10.dp) + ) { + Text( + text = label, + fontSize = 20.sp, + fontWeight = FontWeight.Bold, + color = textColor + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/components/navBar.kt b/app/src/main/java/com/example/myapplication/components/navBar.kt index 7fb396c..63c3261 100644 --- a/app/src/main/java/com/example/myapplication/components/navBar.kt +++ b/app/src/main/java/com/example/myapplication/components/navBar.kt @@ -41,7 +41,7 @@ fun navBar(navController: NavHostController) { verticalAlignment = Alignment.CenterVertically ) { navItem(navController = navController, ImageId = R.drawable.home_image, "mainScreen") - navItem(navController = navController, ImageId = R.drawable.note_image, "createCard") + navItem(navController = navController, ImageId = R.drawable.note_image, "editcard") navItem(navController = navController, ImageId = R.drawable.profile_image, "userSettings") } } diff --git a/app/src/main/java/com/example/myapplication/database/MobileDatabase.kt b/app/src/main/java/com/example/myapplication/database/MobileDatabase.kt index 88f64f3..5a38fa0 100644 --- a/app/src/main/java/com/example/myapplication/database/MobileDatabase.kt +++ b/app/src/main/java/com/example/myapplication/database/MobileDatabase.kt @@ -83,32 +83,6 @@ abstract class MobileAppDataBase : RoomDatabase() { userId = 2 ) ) - cardDao.insert( - Card( - name = "Феррари Имба", - location = "г. Ульяновск", - image = BitmapFactory.decodeResource( - appContext.resources, - R.drawable.ferrari_laferrari_car2 - ), - mileage = 7322, - price = 125000, - userId = 1 - ) - ) - cardDao.insert( - Card( - name = "Феррари Два", - location = "г. Ульяновск", - image = BitmapFactory.decodeResource( - appContext.resources, - R.drawable.ferrari_laferrari_car2 - ), - mileage = 1233, - price = 15000, - userId = 2 - ) - ) } } } diff --git a/app/src/main/java/com/example/myapplication/database/dao/CardDao.kt b/app/src/main/java/com/example/myapplication/database/dao/CardDao.kt index baccba4..dd3ff98 100644 --- a/app/src/main/java/com/example/myapplication/database/dao/CardDao.kt +++ b/app/src/main/java/com/example/myapplication/database/dao/CardDao.kt @@ -15,7 +15,7 @@ interface CardDao { fun getAll(): Flow> @Query("select * from cards where cards.id = :id") - fun getById(id: Int): Flow + fun getById(id: Int): Card? @Query("select * from cards where cards.user_id = :userId") fun getByUserId(userId: Int): Flow> diff --git a/app/src/main/java/com/example/myapplication/database/dao/UserDao.kt b/app/src/main/java/com/example/myapplication/database/dao/UserDao.kt index dbdcb09..c092ae7 100644 --- a/app/src/main/java/com/example/myapplication/database/dao/UserDao.kt +++ b/app/src/main/java/com/example/myapplication/database/dao/UserDao.kt @@ -19,7 +19,7 @@ interface UserDao { fun getAll(): Flow> @Query("select * from users where users.id = :id") - fun getById(id: Int): Flow + fun getById(id: Int): User? @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insert(user: User) diff --git a/app/src/main/java/com/example/myapplication/screens/createcard.kt b/app/src/main/java/com/example/myapplication/screens/createcard.kt deleted file mode 100644 index 836fb46..0000000 --- a/app/src/main/java/com/example/myapplication/screens/createcard.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.example.myapplication.screens - -import android.view.Display.Mode -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material3.Button -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.navigation.NavController -import androidx.navigation.NavHostController -import com.example.myapplication.components.LoginField -import com.example.myapplication.components.navBar -import com.example.myapplication.components.navButton -import com.example.myapplication.ui.theme.SkyBlue - -@Composable -fun CreateCard(navController: NavHostController) { - Column { - Box (modifier = Modifier.fillMaxHeight(0.9f)) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Button(onClick = { /*TODO*/ }) { - Text("Добавить картинку") - } - LoginField(text = "Название/Марка") - LoginField(text = "Пробег") - LoginField(text = "Расположение") - LoginField(text = "Цена") - Button(onClick = { /*TODO*/ }) { - Text("Создать объявление") - } - } - } - Column(modifier = Modifier - .fillMaxSize() - .background(SkyBlue), - verticalArrangement = Arrangement.Center) { - navBar(navController = navController) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/screens/editcard.kt b/app/src/main/java/com/example/myapplication/screens/editcard.kt index 0242dfa..149f697 100644 --- a/app/src/main/java/com/example/myapplication/screens/editcard.kt +++ b/app/src/main/java/com/example/myapplication/screens/editcard.kt @@ -1,50 +1,223 @@ package com.example.myapplication.screens +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.ImageDecoder +import android.net.Uri +import android.os.Build +import android.provider.MediaStore import android.view.Display.Mode +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.scrollable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp import androidx.navigation.NavController import androidx.navigation.NavHostController +import com.example.myapplication.R +import com.example.myapplication.components.ActiveButton import com.example.myapplication.components.LoginField +import com.example.myapplication.components.PlaceholderInputField import com.example.myapplication.components.navBar import com.example.myapplication.components.navButton +import com.example.myapplication.database.MobileAppDataBase +import com.example.myapplication.database.entities.Card import com.example.myapplication.ui.theme.SkyBlue +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext @Composable -fun EditCard(navController: NavHostController) { - Column { - Box (modifier = Modifier.fillMaxHeight(0.9f)) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Button(onClick = { /*TODO*/ }) { - Text("Добавить картинку") - } - LoginField(text = "Название/Марка") - LoginField(text = "Пробег") - LoginField(text = "Расположение") - LoginField(text = "Цена") - Button(onClick = { /*TODO*/ }) { - Text("Изменить объявление") +fun EditCardScreen(navController: NavHostController, cardId: Int? = null) { + val context = LocalContext.current + + val image = remember { mutableStateOf(BitmapFactory.decodeResource(context.resources, R.drawable.ferrari_laferrari_car2)) } + val name = remember { mutableStateOf("") } + val location = remember { mutableStateOf("") } + val price = remember { mutableStateOf(0) } + val mileage = remember { mutableStateOf(0) } + + val imageData = remember { mutableStateOf(null) } + val launcher = + rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> + imageData.value = uri + } + imageData.value?.let { + if (Build.VERSION.SDK_INT < 28) { + image.value = MediaStore.Images + .Media.getBitmap(context.contentResolver, imageData.value) + + } else { + val source = ImageDecoder + .createSource(context.contentResolver, imageData.value!!) + image.value = ImageDecoder.decodeBitmap(source) + } + } + + cardId?.let{ + LaunchedEffect(Unit) { + withContext(Dispatchers.IO) { + val card = MobileAppDataBase.getInstance(context).cardDao().getById(cardId!!) + image.value = card!!.image + name.value = card!!.name + location.value = card!!.location + price.value = card!!.price + mileage.value = card!!.mileage + } + } + } + + val edit = remember { mutableStateOf(false) } + if (edit.value){ + LaunchedEffect(Unit) { + withContext(Dispatchers.IO) { + cardId?.let { + MobileAppDataBase.getInstance(context).cardDao() + .update( + Card( + id = cardId, + name = name.value, + location = location.value, + price = price.value, + mileage = mileage.value, + image = image.value, + userId = 1) + ) + + } ?: run { + MobileAppDataBase.getInstance(context).cardDao() + .insert( + Card( + name = name.value, + location = location.value, + price = price.value, + mileage = mileage.value, + image = image.value, + userId = 1) + ) } } } - Column(modifier = Modifier + edit.value = !edit.value + navController.navigate("mainScreen") + } + + Column( + modifier = Modifier .fillMaxSize() - .background(SkyBlue), - verticalArrangement = Arrangement.Center) { - navBar(navController = navController) + .padding(bottom = 8.dp) + .verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.Bottom, + + ) { + Image( + bitmap = image.value.asImageBitmap(), + contentDescription = "editplaceholder", + contentScale = ContentScale.Crop, + modifier = Modifier + .size(384.dp) + .padding(8.dp) + .align(Alignment.CenterHorizontally)) + ActiveButton(label = "Выбрать обложку", backgroundColor = SkyBlue, textColor = Color.Black, onClickAction = { + launcher.launch("image/*") + }) + PlaceholderInputField(label = "Название", isSingleLine = true, + startValue = name.value, onTextChanged = { newName -> + name.value = newName + }) + PlaceholderInputField(label = "Расположение", isSingleLine = true, + startValue = location.value, onTextChanged = { newLocation -> + location.value = newLocation + }) + PlaceholderInputField(label = "Пробег", isSingleLine = true, + startValue = mileage.value.toString(), onTextChanged = { newMileage -> + mileage.value = newMileage.toIntOrNull() ?: 500 + }) + PlaceholderInputField(label = "Цена", isSingleLine = true, + startValue = price.value.toString(), onTextChanged = { newPrice -> + price.value = newPrice.toIntOrNull() ?: 10000 + }) + ActiveButton(label = "Сохранить", backgroundColor = SkyBlue, textColor = Color.Black, onClickAction = { + edit.value = !edit.value + }) + navButton(navController = navController, destination = "mainScreen", label = "Назад", backgroundColor = SkyBlue, textColor = Color.Black) + } +} + +@Composable +fun EditUserScreen(navController: NavHostController){ + val context = LocalContext.current + + val photo = remember { mutableStateOf(BitmapFactory.decodeResource(context.resources, R.drawable.login)) } + val name = remember { mutableStateOf("") } + val password = remember { mutableStateOf("") } + + val imageData = remember { mutableStateOf(null) } + val launcher = + rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) {uri: Uri? -> + imageData.value = uri + } + imageData.value?.let { + if (Build.VERSION.SDK_INT < 28) { + photo.value = MediaStore.Images + .Media.getBitmap(context.contentResolver, imageData.value) + + } else { + val source = ImageDecoder + .createSource(context.contentResolver, imageData.value!!) + photo.value = ImageDecoder.decodeBitmap(source) } } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(bottom = 8.dp), + verticalArrangement = Arrangement.Bottom + ) { + Image( + bitmap = photo.value.asImageBitmap(), + contentDescription = "editplaceholder", + contentScale = ContentScale.Crop, + modifier = Modifier + .size(384.dp) + .padding(8.dp) + .align(Alignment.CenterHorizontally)) + ActiveButton(label = "Выбрать фото", backgroundColor = SkyBlue, textColor = Color.Black, onClickAction = { + launcher.launch("image/*") + }) + PlaceholderInputField(label = "Никнейм", isSingleLine = true, + startValue = name.value, onTextChanged = { newName -> + name.value = newName + }) + PlaceholderInputField(label = "Пароль", isSingleLine = true, + startValue = password.value, onTextChanged = { newPassword -> + password.value = newPassword + }) + ActiveButton(label = "Сохранить", backgroundColor = SkyBlue, textColor = Color.Black, onClickAction = { + //edit.value = !edit.value + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/screens/mainScreen.kt b/app/src/main/java/com/example/myapplication/screens/mainScreen.kt index e2d8c26..ede4d2f 100644 --- a/app/src/main/java/com/example/myapplication/screens/mainScreen.kt +++ b/app/src/main/java/com/example/myapplication/screens/mainScreen.kt @@ -70,7 +70,7 @@ fun MainScreen(navController: NavHostController) { } } } - + Column { Box(modifier = Modifier .padding(horizontal = 10.dp) @@ -122,10 +122,6 @@ inline fun List<*>.isListOf(): Boolean { fun CardListItem(item: Card, navController: NavHostController){ val context = LocalContext.current - val isExpanded = remember { - mutableStateOf(false) - } - val showDialog = remember { mutableStateOf(false) } @@ -158,24 +154,14 @@ fun CardListItem(item: Card, navController: NavHostController){ modifier = Modifier.padding(8.dp) ){ Text( - text = "${item.name} | ${item.location} | ${item.mileage} | ${item.price}", + text = "Название: ${item.name} \nРасположение: ${item.location} \nПробег: ${item.mileage} \nЦена: ${item.price}", fontSize = 20.sp, fontWeight = FontWeight.Bold ) - } - } - AnimatedVisibility( - visible = isExpanded.value, - modifier = Modifier.fillMaxWidth() - ) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.End - ){ - DataListItemButton("Изменить", Color.Yellow, Color.White, onClickAction = { - navController.navigate("editstory/${item.id}") + DataListItemButton("Изменить", Color.LightGray, Color.White, onClickAction = { + navController.navigate("editcard/${item.id}") }) - DataListItemButton("Удалить", Color.Red, Color.White, onClickAction = { + DataListItemButton("Удалить", Color.Black, Color.White, onClickAction = { showDialog.value = !showDialog.value }) } @@ -200,7 +186,7 @@ fun CardListItem(item: Card, navController: NavHostController){ } } delete.value = !delete.value - navController.navigate("story") + navController.navigate("mainScreen") } } @@ -272,7 +258,7 @@ fun addNewListItem(navController: NavHostController, destination: String){ }, shape = RoundedCornerShape(15.dp), colors = CardDefaults.cardColors( - containerColor = SkyBlue + containerColor = Color.White ), elevation = CardDefaults.cardElevation( defaultElevation = 8.dp @@ -285,7 +271,7 @@ fun addNewListItem(navController: NavHostController, destination: String){ modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ){ - Image(painter = painterResource(id = R.drawable.login), + Image(painter = painterResource(id = R.drawable.plus), contentDescription = "additem", contentScale = ContentScale.Crop, modifier = Modifier diff --git a/app/src/main/java/com/example/myapplication/screens/user.kt b/app/src/main/java/com/example/myapplication/screens/user.kt index 1c637cb..666389f 100644 --- a/app/src/main/java/com/example/myapplication/screens/user.kt +++ b/app/src/main/java/com/example/myapplication/screens/user.kt @@ -12,9 +12,15 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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 import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.navigation.NavController @@ -22,10 +28,30 @@ import androidx.navigation.NavHostController import com.example.myapplication.R import com.example.myapplication.components.LoginField import com.example.myapplication.components.navBar +import com.example.myapplication.database.MobileAppDataBase +import com.example.myapplication.database.entities.User import com.example.myapplication.ui.theme.SkyBlue +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext @Composable fun UserSettings(navController: NavHostController) { + val context = LocalContext.current + + val login = remember { mutableStateOf("") } + val password = remember { mutableStateOf("") } + val userId = 1 + + userId?.let { + LaunchedEffect(Unit) { + withContext(Dispatchers.IO) { + val user = MobileAppDataBase.getInstance(context).userDao().getById(userId!!) + login.value = user!!.login + password.value = user!!.password + } + } + } + Column { Box (modifier = Modifier.fillMaxHeight(0.9f)) { Column( @@ -39,10 +65,8 @@ fun UserSettings(navController: NavHostController) { modifier = Modifier .size(300.dp) ) - LoginField(text = "Логин пользователя") - LoginField(text = "Пароль пользователя") - LoginField(text = "Количество объявлений пользователя") - Button(onClick = {}) { Text("Посмотреть мои объявления") } + LoginField(text = "Логин пользователя: ${login.value}") + LoginField(text = "Пароль пользователя: ${password.value}") } } Column(modifier = Modifier @@ -52,5 +76,4 @@ fun UserSettings(navController: NavHostController) { navBar(navController = navController) } } - } \ No newline at end of file diff --git a/app/src/main/res/drawable/plus.png b/app/src/main/res/drawable/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..6372ce75c6f1c895b865d7c713c5b712e29f1535 GIT binary patch literal 22467 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 literal 0 HcmV?d00001