Вроде робит, хз насколько правильно только я это сделал

This commit is contained in:
Максим 2023-11-23 15:18:36 +03:00
parent a11e81ab27
commit 25cdd9b083
9 changed files with 107 additions and 36 deletions

View File

@ -1,3 +1,5 @@
import org.jetbrains.kotlin.kapt3.base.Kapt.kapt
plugins { plugins {
id("com.android.application") id("com.android.application")
id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.android")
@ -58,6 +60,8 @@ dependencies {
implementation("androidx.room:room-ktx:2.6.0") implementation("androidx.room:room-ktx:2.6.0")
kapt("androidx.room:room-compiler:2.6.0") kapt("androidx.room:room-compiler:2.6.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2")
implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0")
implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")

View File

@ -4,20 +4,34 @@ import android.annotation.SuppressLint
import androidx.compose.material.Scaffold import androidx.compose.material.Scaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.example.labwork.database.DAO.BicycleDao import com.example.labwork.database.DAO.BicycleDao
import com.example.labwork.database.DAO.UserDao import com.example.labwork.database.DAO.UserDao
import com.example.labwork.repository.BicycleRepository
import com.example.labwork.repository.UserRepository
@SuppressLint("UnusedMaterialScaffoldPaddingParameter") @SuppressLint("UnusedMaterialScaffoldPaddingParameter")
@Composable @Composable
fun MainScreen(bicycleDao: BicycleDao, userDao: UserDao) { fun MainScreen(bicycleDao: BicycleDao, userDao: UserDao) {
val navController = rememberNavController() val navController = rememberNavController()
val bicycleRepository = remember {
BicycleRepository(bicycleDao)
}
val userRepository = remember {
UserRepository(userDao)
}
Scaffold( Scaffold(
bottomBar = { bottomBar = {
SlideNavigation(navController = navController) SlideNavigation(navController = navController)
} }
) { ) {
SlideGraph(navHostController = navController, bicycleDao = bicycleDao, userDao = userDao) SlideGraph(
navHostController = navController,
bicycleRepository = bicycleRepository,
userRepository = userRepository
)
} }
} }

View File

@ -4,21 +4,25 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import com.example.labwork.database.DAO.BicycleDao
import com.example.labwork.database.DAO.UserDao import com.example.labwork.database.DAO.UserDao
import com.example.labwork.models.Bicycle import com.example.labwork.models.Bicycle
import com.example.labwork.pages.ListInfo import com.example.labwork.pages.ListInfo
import com.example.labwork.pages.product.FormNewProduct import com.example.labwork.pages.product.FormNewProduct
import com.example.labwork.pages.product.ListProduct import com.example.labwork.pages.product.ListProduct
import com.example.labwork.pages.user.RegisteryOrLogin import com.example.labwork.pages.user.RegisteryOrLogin
import com.example.labwork.repository.BicycleRepository
import com.example.labwork.viewmodel.BicycleViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -32,27 +36,31 @@ fun ScreenProfile(userDao: UserDao, navHostController: NavHostController) {
RegisteryOrLogin(userDao, navHostController) RegisteryOrLogin(userDao, navHostController)
} }
@Composable @Composable
fun ScreenListProduct(bicycleDao: BicycleDao, navHostController: NavHostController) { fun ScreenListProduct(
val bicycles = remember { mutableStateListOf<Bicycle>() } bicycleViewModel: BicycleViewModel,
navHostController: NavHostController
) {
val bicycles by bicycleViewModel.bicycles.collectAsState()
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
val fetchedBicycles = withContext(Dispatchers.IO) { bicycleViewModel.fetchBicycles()
bicycleDao.getAllBicycles()
}
bicycles.addAll(fetchedBicycles)
} }
Column( Column(
modifier = Modifier.fillMaxHeight().padding(bottom = 65.dp) modifier = Modifier.fillMaxHeight().padding(bottom = 65.dp)
) { ) {
FormNewProduct(bicycleDao, navHostController) //FormNewProduct(bicycleViewModel, navHostController)
LazyColumn { LazyColumn {
items(bicycles) { item -> itemsIndexed(bicycles) { index, item ->
ListProduct(item = item, bicycleDao = bicycleDao, navHostController = navHostController) ListProduct(
item = item,
bicycleViewModel = bicycleViewModel,
navHostController = navHostController
)
} }
} }
} }
} }

View File

@ -2,30 +2,43 @@ package com.example.labwork.button_navigation
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import com.example.labwork.database.DAO.BicycleDao import com.example.labwork.database.DAO.BicycleDao
import com.example.labwork.database.DAO.UserDao import com.example.labwork.database.DAO.UserDao
import com.example.labwork.repository.BicycleRepository
import com.example.labwork.repository.BicycleViewModelFactory
import com.example.labwork.repository.UserRepository
import com.example.labwork.repository.UserViewModelFactory
import com.example.labwork.viewmodel.BicycleViewModel
import com.example.labwork.viewmodel.UserViewModel
@Composable @Composable
fun SlideGraph( fun SlideGraph(
navHostController: NavHostController, navHostController: NavHostController,
bicycleDao: BicycleDao, bicycleRepository: BicycleRepository,
userDao: UserDao userRepository: UserRepository
) { ) {
NavHost(navController = navHostController, startDestination = "Profile"){ val bicycleViewModel: BicycleViewModel = viewModel(
factory = BicycleViewModelFactory(bicycleRepository)
)
val userViewModel: UserViewModel = viewModel(
factory = UserViewModelFactory(userRepository)
)
NavHost(navController = navHostController, startDestination = "Profile") {
composable("Profile") { composable("Profile") {
ScreenProfile(userDao, navHostController = navHostController) //ScreenProfile(userViewModel, navHostController = navHostController)
ScreenListProduct(bicycleViewModel, navHostController = navHostController)
} }
composable("Info") { composable("Info") {
ScreenInfo() ScreenInfo()
} }
composable("ListProduct") { composable("ListProduct") {
ScreenListProduct(bicycleDao, navHostController = navHostController) ScreenListProduct(bicycleViewModel, navHostController = navHostController)
} }
} }
} }

View File

@ -39,13 +39,15 @@ import androidx.navigation.NavHostController
import com.example.labwork.R import com.example.labwork.R
import com.example.labwork.database.DAO.BicycleDao import com.example.labwork.database.DAO.BicycleDao
import com.example.labwork.models.Bicycle import com.example.labwork.models.Bicycle
import com.example.labwork.repository.BicycleRepository
import com.example.labwork.ui.theme.LightBluePolitech import com.example.labwork.ui.theme.LightBluePolitech
import com.example.labwork.viewmodel.BicycleViewModel
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Composable @Composable
fun ListProduct(item: Bicycle, bicycleDao: BicycleDao, navHostController: NavHostController) { fun ListProduct(item: Bicycle, bicycleViewModel : BicycleViewModel, navHostController: NavHostController) {
var isFullAbout by remember { mutableStateOf(false) } var isFullAbout by remember { mutableStateOf(false) }
val scale by animateFloatAsState(if (isFullAbout) 1f else 0f) val scale by animateFloatAsState(if (isFullAbout) 1f else 0f)
val textSize by animateDpAsState(if (isFullAbout) 18.dp else 24.dp) val textSize by animateDpAsState(if (isFullAbout) 18.dp else 24.dp)
@ -87,17 +89,14 @@ fun ListProduct(item: Bicycle, bicycleDao: BicycleDao, navHostController: NavHos
) )
} }
Column { Column {
FormUpdateProduct(item,bicycleDao, navHostController) //FormUpdateProduct(item,bicycleDao, navHostController)
Button( Button(
colors = ButtonDefaults.buttonColors(backgroundColor = LightBluePolitech), colors = ButtonDefaults.buttonColors(backgroundColor = LightBluePolitech),
modifier = Modifier modifier = Modifier
.padding(start = 9.dp, bottom = 9.dp) .padding(start = 9.dp, bottom = 9.dp)
.size(height = 32.dp, width = 128.dp), .size(height = 32.dp, width = 128.dp),
onClick = { onClick = {
// СУПЕР ЖОСКИЙ КОСТЫЛЬ ЭТО ВООБЩЕ ТРЕШ bicycleViewModel.deleteBicycle(item)
GlobalScope.launch {
bicycleDao.deleteBicycle(item)
}
navHostController.navigate("ListProduct") navHostController.navigate("ListProduct")
}, },
shape = RoundedCornerShape(15.dp) shape = RoundedCornerShape(15.dp)

View File

@ -1,7 +1,10 @@
package com.example.labwork.repository package com.example.labwork.repository
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.example.labwork.database.DAO.BicycleDao import com.example.labwork.database.DAO.BicycleDao
import com.example.labwork.models.Bicycle import com.example.labwork.models.Bicycle
import com.example.labwork.viewmodel.BicycleViewModel
class BicycleRepository(private val bicycleDao: BicycleDao) { class BicycleRepository(private val bicycleDao: BicycleDao) {
suspend fun insertBicycle(bicycle: Bicycle) { suspend fun insertBicycle(bicycle: Bicycle) {
@ -27,3 +30,13 @@ class BicycleRepository(private val bicycleDao: BicycleDao) {
return bicycleDao.getBicycleById(bicycleId) return bicycleDao.getBicycleById(bicycleId)
} }
} }
class BicycleViewModelFactory(private val bicycleRepository: BicycleRepository): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(BicycleViewModel::class.java)) {
return BicycleViewModel(bicycleRepository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}

View File

@ -1,7 +1,10 @@
package com.example.labwork.repository package com.example.labwork.repository
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.example.labwork.database.DAO.UserDao import com.example.labwork.database.DAO.UserDao
import com.example.labwork.models.User import com.example.labwork.models.User
import com.example.labwork.viewmodel.UserViewModel
class UserRepository(private val userDao: UserDao) { class UserRepository(private val userDao: UserDao) {
suspend fun getAllUsers(): List<User> { suspend fun getAllUsers(): List<User> {
@ -32,3 +35,12 @@ class UserRepository(private val userDao: UserDao) {
return userDao.getUserByEmailAndPassword(email, password) return userDao.getUserByEmailAndPassword(email, password)
} }
} }
class UserViewModelFactory(private val userRepository: UserRepository): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(UserViewModel::class.java)) {
return UserViewModel(userRepository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}

View File

@ -6,12 +6,20 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.example.labwork.models.Bicycle import com.example.labwork.models.Bicycle
import com.example.labwork.repository.BicycleRepository import com.example.labwork.repository.BicycleRepository
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class BicycleViewModel(private val bicycleRepository: BicycleRepository) : ViewModel() { class BicycleViewModel(private val bicycleRepository: BicycleRepository) : ViewModel() {
private val _bicycles = MutableLiveData<List<Bicycle>>() private val _bicycles = MutableLiveData<List<Bicycle>>()
val bicycles: LiveData<List<Bicycle>> get() = _bicycles val bicycles: StateFlow<List<Bicycle>> = MutableStateFlow(emptyList())
fun fetchBicycles() {
viewModelScope.launch {
val fetchedBicycles = bicycleRepository.getAllBicycles()
(bicycles as MutableStateFlow).value = fetchedBicycles
}
}
fun getAllBicycles() { fun getAllBicycles() {
viewModelScope.launch { viewModelScope.launch {
_bicycles.value = bicycleRepository.getAllBicycles() _bicycles.value = bicycleRepository.getAllBicycles()