refactor: 注释移除 Compose 相关代码,统一入口替换为 HomeActivity

- 注释掉全部 Compose UI 代码(ui/、theme/、NavController、MainActivity、InitActivity 等)
- BorderExt、TextExt、ToastUtils、LoadingState 中的 Compose 逻辑全部注释
- LoadingState 保留 show()/hide() 空方法避免编译报错
- 注释 SensorScaleUtils、BaseViewModel、DeviceViewModel 中的 ToastUtils 调用
- BootReceiver、CrashHandler 中 MainActivity 替换为 HomeActivity
- UserViewModel、PurchaseOrderActivity 删除残余 Compose import
- build.gradle.kts 替换为非 Compose 的 activity-ktx 和 coil 依赖

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 09:28:55 +08:00
co-authored by Claude Sonnet 4.6
parent b6c7570efd
commit 2c3ebd86f9
34 changed files with 2691 additions and 2692 deletions
+19 -19
View File
@@ -11,7 +11,7 @@ plugins {
id("kotlin-parcelize") id("kotlin-parcelize")
// id("compose.compiler") // id("compose.compiler")
kotlin("kapt") kotlin("kapt")
alias(libs.plugins.kotlin.compose) // alias(libs.plugins.kotlin.compose)
} }
android { android {
signingConfigs { signingConfigs {
@@ -63,7 +63,7 @@ android {
jvmTarget = "11" jvmTarget = "11"
} }
buildFeatures { buildFeatures {
compose = true // compose = true
viewBinding = true viewBinding = true
buildConfig = true buildConfig = true
} }
@@ -83,12 +83,12 @@ dependencies {
implementation(libs.androidx.core.ktx) implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose) implementation("androidx.activity:activity-ktx:1.8.0")
implementation(platform(libs.androidx.compose.bom)) // implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui) // implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics) // implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview) // implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3) // implementation(libs.androidx.material3)
implementation( implementation(
fileTree( fileTree(
mapOf( mapOf(
@@ -100,11 +100,11 @@ dependencies {
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom)) // androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4) // androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling) // debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest) // debugImplementation(libs.androidx.ui.test.manifest)
implementation(libs.androidx.navigation.compose) // implementation(libs.androidx.navigation.compose)
// camerax // camerax
implementation(libs.androidx.camera.core) implementation(libs.androidx.camera.core)
@@ -114,12 +114,12 @@ dependencies {
implementation(libs.androidx.camera.extensions) implementation(libs.androidx.camera.extensions)
// 权限申请 // 权限申请
implementation(libs.accompanist.permissions) // implementation(libs.accompanist.permissions)
// hilt注入 // hilt注入
implementation(libs.hilt.android) implementation(libs.hilt.android)
ksp(libs.hilt.android.compiler) ksp(libs.hilt.android.compiler)
implementation(libs.androidx.hilt.navigation.compose) // implementation(libs.androidx.hilt.navigation.compose)
// retrofit网络请求 // retrofit网络请求
implementation(libs.retrofit) implementation(libs.retrofit)
@@ -131,8 +131,8 @@ dependencies {
implementation(libs.gson) implementation(libs.gson)
// 日志打印 // 日志打印
implementation(libs.timber) implementation(libs.timber)
// 图片显示 // 图片显示(非Compose标准版)
implementation("io.coil-kt:coil-compose:2.4.0") implementation("io.coil-kt:coil:2.4.0")
implementation(libs.core) implementation(libs.core)
implementation(libs.android.core) implementation(libs.android.core)
@@ -140,8 +140,8 @@ dependencies {
implementation("androidx.recyclerview:recyclerview:1.4.0") implementation("androidx.recyclerview:recyclerview:1.4.0")
implementation("androidx.compose.foundation:foundation:1.7.0") // implementation("androidx.compose.foundation:foundation:1.7.0")
implementation("androidx.compose.foundation:foundation-layout:1.7.0") // implementation("androidx.compose.foundation:foundation-layout:1.7.0")
implementation (libs.pytorch.android) implementation (libs.pytorch.android)
implementation (libs.pytorch.android.torchvision) implementation (libs.pytorch.android.torchvision)
+181 -181
View File
@@ -1,183 +1,183 @@
package com.sw.inbound //package com.sw.inbound
//
import android.content.Intent //import android.content.Intent
import android.os.Bundle //import android.os.Bundle
import android.view.WindowManager //import android.view.WindowManager
import androidx.activity.ComponentActivity //import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent ////import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge //import androidx.activity.enableEdgeToEdge
import androidx.compose.animation.AnimatedVisibility ////import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.expandIn ////import androidx.compose.animation.expandIn
import androidx.compose.animation.shrinkOut ////import androidx.compose.animation.shrinkOut
import androidx.compose.foundation.Image ////import androidx.compose.foundation.Image
import androidx.compose.foundation.background ////import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column ////import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer ////import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets ////import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize ////import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBars ////import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding ////import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size ////import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width ////import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.windowInsetsBottomHeight ////import androidx.compose.foundation.layout.windowInsetsBottomHeight
import androidx.compose.foundation.layout.wrapContentWidth ////import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.shape.RoundedCornerShape ////import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button ////import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults ////import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Text ////import androidx.compose.material3.Text
import androidx.compose.runtime.Composable ////import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect ////import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.State ////import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState ////import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue ////import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment ////import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier ////import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color ////import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.asImageBitmap ////import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext ////import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource ////import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight ////import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview ////import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp ////import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp ////import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel ////import androidx.hilt.navigation.compose.hiltViewModel
import com.sw.inbound.utils.AppUtil ////import com.sw.inbound.utils.AppUtil
import com.sw.inbound.utils.QRCodeUtil ////import com.sw.inbound.utils.QRCodeUtil
import com.sw.inbound.viewmodel.DeviceViewModel ////import com.sw.inbound.viewmodel.DeviceViewModel
import dagger.hilt.android.AndroidEntryPoint //import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay ////import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.StateFlow ////import kotlinx.coroutines.flow.StateFlow
//
/** ///**
* 设备初始化界面 // * 设备初始化界面
*/ // */
@AndroidEntryPoint //@AndroidEntryPoint
class InitActivity : ComponentActivity() { //class InitActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { // override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) // super.onCreate(savedInstanceState)
enableEdgeToEdge() // enableEdgeToEdge()
window.setFlags( // window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN, // WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN // WindowManager.LayoutParams.FLAG_FULLSCREEN
)
setContent {
InitScreen()
}
}
private var scale = 0.8F
private val qrCodeBmp by lazy {
QRCodeUtil.generateQRCode(
content = GlobalData.deviceId,
size = (scale * 150).toInt()
)
}
@Preview(widthDp = 1920, heightDp = 1080)
@Composable
fun InitScreen(
viewModel: DeviceViewModel = hiltViewModel<DeviceViewModel>()
) {
// val context = LocalContext.current
val hasDeviceData = viewModel.checkEquipmentInfo()
val deviceInfoResult = viewModel.deviceInfoResult.collectAsState()
if (hasDeviceData) {
LaunchedEffect(this) {
delay(1500)
goLoginActivity()
}
} else {
FirstPage(viewModel)
}
if (deviceInfoResult.value == true) {
goLoginActivity()
}
}
@Composable
fun FirstPage(viewModel: DeviceViewModel) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.size(
1920.dp, 1080.dp
)
) {
Spacer(
modifier = Modifier
.padding(top = (scale * 112).dp)
.background(Color.White.copy(alpha = 0.0F))
.size((scale * 337).dp, (scale * 322).dp)
)
Button(
onClick = {
viewModel.getDeviceToken()
},
colors = ButtonDefaults.buttonColors(
contentColor = Color.Transparent,
containerColor = Color(0xFF08C6DC)
),
shape = RoundedCornerShape((scale * 8).dp),
modifier = Modifier
.width((scale * 225).dp)
.padding(top = (scale * 75).dp)
.padding((scale * 10).dp)
) {
Text(
text = "设备初始化",
color = Color.White,
fontSize = (scale * 22).sp,
fontWeight = FontWeight.Bold,
)
}
Spacer(
modifier = Modifier
.wrapContentWidth()
.weight(1F)
)
Image(
bitmap = qrCodeBmp!!.asImageBitmap(),
contentDescription = "",
modifier = Modifier
.padding(bottom = 10.dp)
.size((scale * 150).dp, (scale * 150).dp)
)
Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars))
}
}
// AnimatedVisibility(
// visible = isSuccess.not(),
// enter = expandIn(clip = false),
// exit = shrinkOut(clip = false)
// ) {}
// fun initialize() {
// var deviceId = AppUtil.getUDID(this)
// deviceId = "6ce7cd59-b875-38b2-b73d-88a570be3212"
// GlobalData.deviceId = deviceId
// val isSuccess = deviceViewModel.checkEquipmentInfo()
// if (isSuccess) {
// goLoginActivity()
// return
// }
// binding.ivQrCode.setImageBitmap(
// QRCodeUtil.generateQRCode(
// content = GlobalData.deviceId,
// size = 200
// )
// ) // )
// binding.btnInit.setOnClickListener { //// setContent {
// deviceViewModel.getDeviceToken() //// InitScreen()
// } //// }
// } // }
//
private fun goLoginActivity() { //// private var scale = 0.8F
val intent = Intent(this, MainActivity::class.java) ////
startActivity(intent) //// private val qrCodeBmp by lazy {
finish() //// QRCodeUtil.generateQRCode(
} //// content = GlobalData.deviceId,
//// size = (scale * 150).toInt()
//// )
} //// }
//
//// @Preview(widthDp = 1920, heightDp = 1080)
//// @Composable
//// fun InitScreen(
//// viewModel: DeviceViewModel = hiltViewModel<DeviceViewModel>()
//// ) {
////// val context = LocalContext.current
//// val hasDeviceData = viewModel.checkEquipmentInfo()
//// val deviceInfoResult = viewModel.deviceInfoResult.collectAsState()
////
//// if (hasDeviceData) {
//// LaunchedEffect(this) {
//// delay(1500)
//// goLoginActivity()
//// }
//// } else {
//// FirstPage(viewModel)
//// }
//// if (deviceInfoResult.value == true) {
//// goLoginActivity()
//// }
//// }
////
////
//// @Composable
//// fun FirstPage(viewModel: DeviceViewModel) {
//// Column(
//// horizontalAlignment = Alignment.CenterHorizontally,
//// modifier = Modifier.size(
//// 1920.dp, 1080.dp
//// )
//// ) {
//// Spacer(
//// modifier = Modifier
//// .padding(top = (scale * 112).dp)
//// .background(Color.White.copy(alpha = 0.0F))
//// .size((scale * 337).dp, (scale * 322).dp)
//// )
////
//// Button(
//// onClick = {
//// viewModel.getDeviceToken()
//// },
//// colors = ButtonDefaults.buttonColors(
//// contentColor = Color.Transparent,
//// containerColor = Color(0xFF08C6DC)
//// ),
//// shape = RoundedCornerShape((scale * 8).dp),
//// modifier = Modifier
//// .width((scale * 225).dp)
//// .padding(top = (scale * 75).dp)
//// .padding((scale * 10).dp)
//// ) {
//// Text(
//// text = "设备初始化",
//// color = Color.White,
//// fontSize = (scale * 22).sp,
//// fontWeight = FontWeight.Bold,
//// )
//// }
//// Spacer(
//// modifier = Modifier
//// .wrapContentWidth()
//// .weight(1F)
//// )
//// Image(
//// bitmap = qrCodeBmp!!.asImageBitmap(),
//// contentDescription = "",
//// modifier = Modifier
//// .padding(bottom = 10.dp)
//// .size((scale * 150).dp, (scale * 150).dp)
//// )
//// Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.navigationBars))
//// }
//// }
//// AnimatedVisibility(
//// visible = isSuccess.not(),
//// enter = expandIn(clip = false),
//// exit = shrinkOut(clip = false)
//// ) {}
//// fun initialize() {
//// var deviceId = AppUtil.getUDID(this)
//// deviceId = "6ce7cd59-b875-38b2-b73d-88a570be3212"
//// GlobalData.deviceId = deviceId
//// val isSuccess = deviceViewModel.checkEquipmentInfo()
//// if (isSuccess) {
//// goLoginActivity()
//// return
//// }
//// binding.ivQrCode.setImageBitmap(
//// QRCodeUtil.generateQRCode(
//// content = GlobalData.deviceId,
//// size = 200
//// )
//// )
//// binding.btnInit.setOnClickListener {
//// deviceViewModel.getDeviceToken()
//// }
//// }
//
// private fun goLoginActivity() {
// val intent = Intent(this, MainActivity::class.java)
// startActivity(intent)
// finish()
// }
//
//
//}
@@ -1,50 +1,50 @@
package com.sw.inbound //package com.sw.inbound
//
import android.os.Bundle //import android.os.Bundle
import android.view.WindowManager //import android.view.WindowManager
import androidx.activity.ComponentActivity //import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent ////import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge //import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels //import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope //import androidx.lifecycle.lifecycleScope
import com.sw.inbound.objbox.FoodModule //import com.sw.inbound.objbox.FoodModule
import com.sw.inbound.sdk.SensorScaleUtils //import com.sw.inbound.sdk.SensorScaleUtils
import com.sw.inbound.ui.AppScreen ////import com.sw.inbound.ui.AppScreen
import com.sw.inbound.utils.ThreadUtils //import com.sw.inbound.utils.ThreadUtils
import com.sw.inbound.viewmodel.ReceiptViewModel //import com.sw.inbound.viewmodel.ReceiptViewModel
import dagger.hilt.android.AndroidEntryPoint //import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch //import kotlinx.coroutines.launch
//
@AndroidEntryPoint //@AndroidEntryPoint
class MainActivity : ComponentActivity() { //class MainActivity : ComponentActivity() {
//
val viewModel: ReceiptViewModel by viewModels() // val viewModel: ReceiptViewModel by viewModels()
//
override fun onCreate(savedInstanceState: Bundle?) { // override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) // super.onCreate(savedInstanceState)
enableEdgeToEdge() // enableEdgeToEdge()
//
window.setFlags( // window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN, // WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN // WindowManager.LayoutParams.FLAG_FULLSCREEN
) // )
setContent { //// setContent {
AppScreen(onBackRequest = { //// AppScreen(onBackRequest = {
finish() //// finish()
}) //// })
} //// }
SensorScaleUtils.startScale(autoScale = true) // SensorScaleUtils.startScale(autoScale = true)
lifecycleScope.launch { // lifecycleScope.launch {
FoodModule.init(this@MainActivity) // FoodModule.init(this@MainActivity)
} // }
} // }
//
override fun onDestroy() { // override fun onDestroy() {
SensorScaleUtils.closeScale() // SensorScaleUtils.closeScale()
ThreadUtils.release() // ThreadUtils.release()
super.onDestroy() // super.onDestroy()
} // }
} //}
//
//
//
@@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import com.sw.inbound.base.BaseActivity import com.sw.inbound.base.BaseActivity
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.compose.runtime.collectAsState
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.sw.inbound.R import com.sw.inbound.R
@@ -1,44 +1,44 @@
package com.sw.inbound.ext //package com.sw.inbound.ext
//
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.composed //import androidx.compose.ui.composed
import androidx.compose.ui.draw.drawWithCache //import androidx.compose.ui.draw.drawWithCache
import androidx.compose.ui.geometry.CornerRadius //import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.PathEffect //import androidx.compose.ui.graphics.PathEffect
import androidx.compose.ui.graphics.drawscope.Stroke //import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.platform.LocalDensity //import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Dp //import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
//
/** ///**
* 虚线边框 // * 虚线边框
*/ // */
fun Modifier.dashedBorder( //fun Modifier.dashedBorder(
strokeWidth: Dp = 2.dp, // strokeWidth: Dp = 2.dp,
color: Color = Color(0xFFDCDCF0), // color: Color = Color(0xFFDCDCF0),
cornerRadiusDp: Dp = 10.dp // cornerRadiusDp: Dp = 10.dp
) = composed( //) = composed(
factory = { // factory = {
val density = LocalDensity.current // val density = LocalDensity.current
val strokeWidthPx = density.run { strokeWidth.toPx() } // val strokeWidthPx = density.run { strokeWidth.toPx() }
val cornerRadiusPx = density.run { cornerRadiusDp.toPx() } // val cornerRadiusPx = density.run { cornerRadiusDp.toPx() }
//
this.then( // this.then(
Modifier.drawWithCache { // Modifier.drawWithCache {
onDrawBehind { // onDrawBehind {
val stroke = Stroke( // val stroke = Stroke(
width = strokeWidthPx, // width = strokeWidthPx,
pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f) // pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
) // )
//
drawRoundRect( // drawRoundRect(
color = color, // color = color,
style = stroke, // style = stroke,
cornerRadius = CornerRadius(cornerRadiusPx) // cornerRadius = CornerRadius(cornerRadiusPx)
) // )
} // }
} // }
) // )
} // }
) //)
+33 -33
View File
@@ -1,33 +1,33 @@
package com.sw.inbound.ext //package com.sw.inbound.ext
//
import androidx.annotation.ColorRes //import androidx.annotation.ColorRes
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource //import androidx.compose.ui.res.colorResource
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight //import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign //import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.TextUnit //import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
//
// 快速修改颜色 //// 快速修改颜色
fun TextStyle.withColor(color: Color): TextStyle = this.copy(color = color) //fun TextStyle.withColor(color: Color): TextStyle = this.copy(color = color)
//
@Composable //@Composable
fun TextStyle.withColorRes(@ColorRes colorRes: Int): TextStyle { //fun TextStyle.withColorRes(@ColorRes colorRes: Int): TextStyle {
return this.copy(color = colorResource(id = colorRes)) // return this.copy(color = colorResource(id = colorRes))
} //}
//
// 快速修改字体大小 //// 快速修改字体大小
fun TextStyle.withSize(size: TextUnit): TextStyle = this.copy(fontSize = size) //fun TextStyle.withSize(size: TextUnit): TextStyle = this.copy(fontSize = size)
//
fun TextStyle.withSizeSp(sp: Float): TextStyle = this.copy(fontSize = sp.sp) //fun TextStyle.withSizeSp(sp: Float): TextStyle = this.copy(fontSize = sp.sp)
//
// 快速修改字体粗细 //// 快速修改字体粗细
fun TextStyle.withWeight(weight: FontWeight): TextStyle = this.copy(fontWeight = weight) //fun TextStyle.withWeight(weight: FontWeight): TextStyle = this.copy(fontWeight = weight)
//
fun TextStyle.bold(): TextStyle = this.copy(fontWeight = FontWeight.Bold) //fun TextStyle.bold(): TextStyle = this.copy(fontWeight = FontWeight.Bold)
fun TextStyle.medium(): TextStyle = this.copy(fontWeight = FontWeight.Medium) //fun TextStyle.medium(): TextStyle = this.copy(fontWeight = FontWeight.Medium)
fun TextStyle.light(): TextStyle = this.copy(fontWeight = FontWeight.Light) //fun TextStyle.light(): TextStyle = this.copy(fontWeight = FontWeight.Light)
//
fun TextStyle.textAlign(textAlign: TextAlign): TextStyle = this.copy(textAlign = textAlign) //fun TextStyle.textAlign(textAlign: TextAlign): TextStyle = this.copy(textAlign = textAlign)
@@ -1,19 +1,22 @@
package com.sw.inbound.network package com.sw.inbound.network
import androidx.compose.runtime.getValue //import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf //import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue //import androidx.compose.runtime.setValue
import java.util.concurrent.atomic.AtomicInteger //import java.util.concurrent.atomic.AtomicInteger
/** /**
* 进度条状态 * 进度条状态Compose 相关逻辑已注释,show/hide 保留为空方法供外部调用)
*/ */
object LoadingState { object LoadingState {
private var _isLoading by mutableStateOf(false) // private var _isLoading by mutableStateOf(false)
val isLoading: Boolean get() = _isLoading // val isLoading: Boolean get() = _isLoading
//
// private val counter = AtomicInteger(0)
//
// fun show() = counter.incrementAndGet().let { if (it == 1) _isLoading = true }
// fun hide() = counter.decrementAndGet().let { if (it <= 0) _isLoading = false }
private val counter = AtomicInteger(0) fun show() = Unit
fun hide() = Unit
fun show() = counter.incrementAndGet().let { if (it == 1) _isLoading = true }
fun hide() = counter.decrementAndGet().let { if (it <= 0) _isLoading = false }
} }
@@ -3,7 +3,7 @@ package com.sw.inbound.receiver
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import com.sw.inbound.MainActivity import com.sw.inbound.activity.HomeActivity
import timber.log.Timber import timber.log.Timber
/** /**
@@ -14,7 +14,7 @@ class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
if (Intent.ACTION_BOOT_COMPLETED == intent.action) { if (Intent.ACTION_BOOT_COMPLETED == intent.action) {
Timber.d("设备启动完成,开始执行自启动逻辑") Timber.d("设备启动完成,开始执行自启动逻辑")
val intent = Intent(context, MainActivity::class.java) val intent = Intent(context, HomeActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent) context.startActivity(intent)
} }
@@ -3,7 +3,7 @@ package com.sw.inbound.sdk
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import com.sw.inbound.utils.ThreadUtils import com.sw.inbound.utils.ThreadUtils
import com.sw.inbound.utils.ToastUtils //import com.sw.inbound.utils.ToastUtils
import com.wabon.wbintelligenthardwaresdk.api.SensorScale import com.wabon.wbintelligenthardwaresdk.api.SensorScale
import com.wabon.wbintelligenthardwaresdk.api.SensorScale.OnScaleResult import com.wabon.wbintelligenthardwaresdk.api.SensorScale.OnScaleResult
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@@ -52,7 +52,7 @@ object SensorScaleUtils {
isValidWeight = false isValidWeight = false
Timber.e("fail code = $errCode") Timber.e("fail code = $errCode")
Handler(Looper.getMainLooper()).post { Handler(Looper.getMainLooper()).post {
ToastUtils.showToast("秤读取数据异常") //ToastUtils.showToast("秤读取数据异常")
startScale() startScale()
} }
} }
@@ -115,7 +115,7 @@ object SensorScaleUtils {
fun tare() { fun tare() {
mSensorScale?.tare { mSensorScale?.tare {
Timber.d("去皮置零操作成功") Timber.d("去皮置零操作成功")
ToastUtils.showToast("去皮置零操作成功") //ToastUtils.showToast("去皮置零操作成功")
} }
} }
@@ -1,174 +1,174 @@
package com.sw.inbound.ui //package com.sw.inbound.ui
//
import androidx.compose.animation.core.tween //import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn //import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut //import androidx.compose.animation.fadeOut
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box //import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues //import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize //import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold //import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
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.setValue //import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale //import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
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 androidx.navigation.compose.currentBackStackEntryAsState //import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController //import androidx.navigation.compose.rememberNavController
import com.sw.inbound.GlobalKey //import com.sw.inbound.GlobalKey
import com.sw.inbound.R //import com.sw.inbound.R
import com.sw.inbound.ui.page.HomeScreen //import com.sw.inbound.ui.page.HomeScreen
import com.sw.inbound.ui.page.PurchaseOrderScreen //import com.sw.inbound.ui.page.PurchaseOrderScreen
import com.sw.inbound.utils.SPUtil //import com.sw.inbound.utils.SPUtil
import com.sw.inbound.utils.ToastUtils //import com.sw.inbound.utils.ToastUtils
//
@Composable //@Composable
fun AppScreen( //fun AppScreen(
onBackRequest: () -> Unit // onBackRequest: () -> Unit
) { //) {
val navController = rememberNavController() // val navController = rememberNavController()
val currentBackStackEntry by navController.currentBackStackEntryAsState() // val currentBackStackEntry by navController.currentBackStackEntryAsState()
var canBack by remember { mutableStateOf(false) } // var canBack by remember { mutableStateOf(false) }
//
// 拦截物理返回键 // // 拦截物理返回键
// BackHandler( //// BackHandler(
// onBack = { //// onBack = {
// val currentRoute = currentBackStackEntry?.destination?.route //// val currentRoute = currentBackStackEntry?.destination?.route
// Timber.d("BackHandler currentRouter = ${currentRoute}") //// Timber.d("BackHandler currentRouter = ${currentRoute}")
// if (currentRoute == Screen.Home.route && !canBack) { //// if (currentRoute == Screen.Home.route && !canBack) {
// ToastUtils.showToast("再次点击退出") //// ToastUtils.showToast("再次点击退出")
// canBack = true //// canBack = true
// } else if (currentRoute == Screen.Login.route) { //// } else if (currentRoute == Screen.Login.route) {
// onBackRequest() //// onBackRequest()
// } else { //// } else {
// navController.popBackStack() //// navController.popBackStack()
//// }
//// }
//// )
////
//// BackHandler(canBack) {
//// Timber.d("canBack = $canBack")
//// if (canBack) {
//// onBackRequest()
//// }
//// }
//
// Scaffold(
// modifier = Modifier
// .fillMaxSize()
// //.paint(painter = painterResource(R.mipmap.bg)),
// ,containerColor = Color.Transparent,
// content = { padding ->
// Box {
//// Image(
//// painter = painterResource(R.mipmap.bg),
//// contentDescription = null,
//// modifier = Modifier.fillMaxSize(),
//// contentScale = ContentScale.Crop
//// )
// Image(
// painter = painterResource(id = R.mipmap.bg),
// contentDescription = "背景图片",
// modifier = Modifier.fillMaxSize(),
// contentScale = ContentScale.Crop
// )
// NavHost(padding, navController, onBackRequest)
// } // }
// } // }
// ) // )
// ToastUtils.ToastComposable()
// //GlobalLoading() // 全局Loading
// //
// BackHandler(canBack) { //}
// Timber.d("canBack = $canBack") //
// if (canBack) { ///**
// onBackRequest() // * 导航
// */
//@Composable
//private fun NavHost(
// padding: PaddingValues,
// navController: NavHostController,
// onBackRequest: () -> Unit = {}
//) {
// val spUtil = SPUtil.getInstance()
// val token = spUtil.get(GlobalKey.KEY_TOKEN, "")!!
// NavHost(
// modifier = Modifier
// .fillMaxSize()
// .padding(padding),
// navController = navController,
// //startDestination = if (token.isEmpty()) Screen.Login.route else Screen.Home.route
// startDestination = Screen.Home.route
// ) {
//// composable(Screen.Test.route) {
//// TestScreen(modifier = Modifier, navController)
//// }
// // 首页
// composable(Screen.Home.route) {
// HomeScreen(modifier = Modifier, navController, onBackRequest = onBackRequest)
// } // }
// } // // 登录
//// composable(Screen.Login.route) {
Scaffold( //// LoginScreen(modifier = Modifier, navController)
modifier = Modifier //// }
.fillMaxSize() // // 采购单入库
//.paint(painter = painterResource(R.mipmap.bg)),
,containerColor = Color.Transparent,
content = { padding ->
Box {
// Image(
// painter = painterResource(R.mipmap.bg),
// contentDescription = null,
// modifier = Modifier.fillMaxSize(),
// contentScale = ContentScale.Crop
// )
Image(
painter = painterResource(id = R.mipmap.bg),
contentDescription = "背景图片",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
NavHost(padding, navController, onBackRequest)
}
}
)
ToastUtils.ToastComposable()
//GlobalLoading() // 全局Loading
}
/**
* 导航
*/
@Composable
private fun NavHost(
padding: PaddingValues,
navController: NavHostController,
onBackRequest: () -> Unit = {}
) {
val spUtil = SPUtil.getInstance()
val token = spUtil.get(GlobalKey.KEY_TOKEN, "")!!
NavHost(
modifier = Modifier
.fillMaxSize()
.padding(padding),
navController = navController,
//startDestination = if (token.isEmpty()) Screen.Login.route else Screen.Home.route
startDestination = Screen.Home.route
) {
// composable(Screen.Test.route) {
// TestScreen(modifier = Modifier, navController)
// }
// 首页
composable(Screen.Home.route) {
HomeScreen(modifier = Modifier, navController, onBackRequest = onBackRequest)
}
// 登录
// composable(Screen.Login.route) {
// LoginScreen(modifier = Modifier, navController)
// }
// 采购单入库
composable(
Screen.PurchaseOrder.route,
enterTransition = { fadeIn(animationSpec = tween(0)) }, // 无进入动画
exitTransition = { fadeOut(animationSpec = tween(0)) } // 无退出动画
) {
PurchaseOrderScreen(modifier = Modifier.fillMaxSize(), navController)
}
// // 自采单
// composable( // composable(
// Screen.SelfProcurement.route, // Screen.PurchaseOrder.route,
// enterTransition = { fadeIn(animationSpec = tween(0)) }, // 无进入动画 // enterTransition = { fadeIn(animationSpec = tween(0)) }, // 无进入动画
// exitTransition = { fadeOut(animationSpec = tween(0)) } // 无退出动画 // exitTransition = { fadeOut(animationSpec = tween(0)) } // 无退出动画
// ) { // ) {
// SelfProcurementScreen(modifier = Modifier, navController) // PurchaseOrderScreen(modifier = Modifier.fillMaxSize(), navController)
// } // }
// // 收货 //// // 自采单
// composable( //// composable(
// Screen.ReceiptProduct.route, //// Screen.SelfProcurement.route,
// enterTransition = { fadeIn(animationSpec = tween(0)) }, // 无进入动画 //// enterTransition = { fadeIn(animationSpec = tween(0)) }, // 无进入动画
// exitTransition = { fadeOut(animationSpec = tween(0)) }, // 无退出动画 //// exitTransition = { fadeOut(animationSpec = tween(0)) } // 无退出动画
// arguments = listOf( //// ) {
// navArgument(name = "id", builder = { type = NavType.IntType }), //// SelfProcurementScreen(modifier = Modifier, navController)
// navArgument(name = "supplierId", builder = { type = NavType.IntType }) //// }
// ) //// // 收货
// ) { backStackEntry -> //// composable(
// val id = backStackEntry.arguments?.getString("id") ?: "" //// Screen.ReceiptProduct.route,
// val supplierId = backStackEntry.arguments?.getString("supplierId") ?: "" //// enterTransition = { fadeIn(animationSpec = tween(0)) }, // 无进入动画
// ReceiptProductScreen(modifier = Modifier, navController, id, supplierId) //// exitTransition = { fadeOut(animationSpec = tween(0)) }, // 无退出动画
// } //// arguments = listOf(
} //// navArgument(name = "id", builder = { type = NavType.IntType }),
} //// navArgument(name = "supplierId", builder = { type = NavType.IntType })
//// )
sealed class Screen(val route: String) { //// ) { backStackEntry ->
data object Home : Screen("home") //// val id = backStackEntry.arguments?.getString("id") ?: ""
// data object Login : Screen("login") //// val supplierId = backStackEntry.arguments?.getString("supplierId") ?: ""
//// ReceiptProductScreen(modifier = Modifier, navController, id, supplierId)
// 采购单入库 //// }
data object PurchaseOrder : Screen("purchase_order")
// 自采单入库
// data object SelfProcurement : Screen("self_procurement")
// 收货
// data object ReceiptProduct : Screen("receipt_product?id={id}&supplierId={supplierId}") {
// fun createRoute(id: Int, supplierId: Int) =
// "receipt_product?id=${id}&supplierId=${supplierId}"
// } // }
//}
// 添加物品 //
// data object AddProduct : Screen("addProduct") //sealed class Screen(val route: String) {
// data object Test : Screen("Test") // data object Home : Screen("home")
} //// data object Login : Screen("login")
//
// // 采购单入库
// data object PurchaseOrder : Screen("purchase_order")
//
// // 自采单入库
//// data object SelfProcurement : Screen("self_procurement")
//
// // 收货
//// data object ReceiptProduct : Screen("receipt_product?id={id}&supplierId={supplierId}") {
//// fun createRoute(id: Int, supplierId: Int) =
//// "receipt_product?id=${id}&supplierId=${supplierId}"
//// }
//
// // 添加物品
//// data object AddProduct : Screen("addProduct")
//// data object Test : Screen("Test")
//}
@@ -1,120 +1,120 @@
package com.sw.inbound.ui.page //package com.sw.inbound.ui.page
//
import androidx.activity.compose.BackHandler //import androidx.activity.compose.BackHandler
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable //import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource //import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement //import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column //import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row //import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer //import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize //import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth //import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height //import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width //import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect //import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState //import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue //import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember //import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel //import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController //import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController //import androidx.navigation.compose.rememberNavController
import com.sw.inbound.R //import com.sw.inbound.R
import com.sw.inbound.activity.GoodsListActivity //import com.sw.inbound.activity.GoodsListActivity
import com.sw.inbound.activity.PurchaseOrderActivity //import com.sw.inbound.activity.PurchaseOrderActivity
import com.sw.inbound.activity.SelfProcurementActivity //import com.sw.inbound.activity.SelfProcurementActivity
import com.sw.inbound.ui.Screen //import com.sw.inbound.ui.Screen
import com.sw.inbound.ui.weight.TopTitleBar //import com.sw.inbound.ui.weight.TopTitleBar
import com.sw.inbound.utils.ext.startActivity //import com.sw.inbound.utils.ext.startActivity
import com.sw.inbound.viewmodel.UserViewModel //import com.sw.inbound.viewmodel.UserViewModel
import timber.log.Timber //import timber.log.Timber
//
/** ///**
* 首页 // * 首页
*/ // */
@Composable //@Composable
fun HomeScreen( //fun HomeScreen(
modifier: Modifier = Modifier, // modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(), // navController: NavHostController = rememberNavController(),
viewModel: UserViewModel = hiltViewModel<UserViewModel>(), // viewModel: UserViewModel = hiltViewModel<UserViewModel>(),
onBackRequest: () -> Unit = {} // onBackRequest: () -> Unit = {}
) { //) {
val user by viewModel.user.collectAsState() // val user by viewModel.user.collectAsState()
//
// 避免每次进入都获取字典类型 // // 避免每次进入都获取字典类型
LaunchedEffect(Unit) { // LaunchedEffect(Unit) {
Timber.d("LaunchedEffect(Unit)") // Timber.d("LaunchedEffect(Unit)")
// viewModel.getInitInfo() //// viewModel.getInitInfo()
} // }
//
BackHandler { // BackHandler {
onBackRequest() // onBackRequest()
} // }
//
Column(modifier = Modifier.fillMaxSize()) { // Column(modifier = Modifier.fillMaxSize()) {
TopTitleBar(user = user, onLogoutClick = { // TopTitleBar(user = user, onLogoutClick = {
// viewModel.logout() //// viewModel.logout()
// navController.navigate(Screen.Login.route) { //// navController.navigate(Screen.Login.route) {
// popUpTo(Screen.Home.route) { //// popUpTo(Screen.Home.route) {
// inclusive = true //// inclusive = true
// } //// }
// } //// }
}) // })
Row( // Row(
verticalAlignment = Alignment.CenterVertically, // verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center, // horizontalArrangement = Arrangement.Center,
modifier = Modifier // modifier = Modifier
.weight(1f) // .weight(1f)
.fillMaxWidth() // .fillMaxWidth()
) { // ) {
Image( // Image(
modifier = Modifier // modifier = Modifier
.width(595.dp) // .width(595.dp)
.height(477.dp) // .height(477.dp)
.clickable( // .clickable(
interactionSource = remember { MutableInteractionSource() }, // interactionSource = remember { MutableInteractionSource() },
indication = null // indication = null
) { // ) {
// navController.navigate(Screen.PurchaseOrder.route) //// navController.navigate(Screen.PurchaseOrder.route)
//navController.context.startActivity<ReceiptActivity> { // //navController.context.startActivity<ReceiptActivity> {
// putExtra(GoodsListActivity.ID, "123123") // // putExtra(GoodsListActivity.ID, "123123")
// putExtra(GoodsListActivity.SUPPLIER_ID, "123123123123") // // putExtra(GoodsListActivity.SUPPLIER_ID, "123123123123")
// putExtra(GoodsListActivity.IS_RECEIPT_PAGE, true) // // putExtra(GoodsListActivity.IS_RECEIPT_PAGE, true)
//} // //}
navController.context.startActivity<PurchaseOrderActivity>() // navController.context.startActivity<PurchaseOrderActivity>()
}, // },
painter = painterResource(R.mipmap.ic_order_purchase), // painter = painterResource(R.mipmap.ic_order_purchase),
contentDescription = "采购单入库" // contentDescription = "采购单入库"
) // )
Spacer(modifier = Modifier.width(15.dp)) // Spacer(modifier = Modifier.width(15.dp))
Image( // Image(
modifier = Modifier // modifier = Modifier
.width(595.dp) // .width(595.dp)
.height(477.dp) // .height(477.dp)
.clickable( // .clickable(
interactionSource = remember { MutableInteractionSource() }, // interactionSource = remember { MutableInteractionSource() },
indication = null // indication = null
) { // ) {
// navController.navigate( //// navController.navigate(
// Screen.SelfProcurement.route, navOptions = NavOptions.Builder() //// Screen.SelfProcurement.route, navOptions = NavOptions.Builder()
// .setEnterAnim(0) //// .setEnterAnim(0)
// .setExitAnim(0) //// .setExitAnim(0)
// .setPopEnterAnim(0) //// .setPopEnterAnim(0)
// .setPopExitAnim(0) //// .setPopExitAnim(0)
// .build() //// .build()
// ) //// )
navController.context.startActivity<SelfProcurementActivity> { // navController.context.startActivity<SelfProcurementActivity> {
putExtra(GoodsListActivity.IS_RECEIPT_PAGE, false) // putExtra(GoodsListActivity.IS_RECEIPT_PAGE, false)
} // }
}, // },
painter = painterResource(R.mipmap.ic_order_self_procurement), // painter = painterResource(R.mipmap.ic_order_self_procurement),
contentDescription = "自采入库" // contentDescription = "自采入库"
) // )
} // }
} // }
} //}
@@ -1,351 +1,351 @@
package com.sw.inbound.ui.page //package com.sw.inbound.ui.page
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import com.sw.inbound.R
import com.sw.inbound.activity.GoodsListActivity
import com.sw.inbound.activity.ReceiptActivity
import com.sw.inbound.activity.SelfProcurementActivity
import com.sw.inbound.ext.dashedBorder
import com.sw.inbound.ext.toFormattedString
import com.sw.inbound.model.response.SupplierInfo
import com.sw.inbound.ui.theme.AppTypography.blackTextStyle
import com.sw.inbound.ui.theme.AppTypography.grayTextStyle
import com.sw.inbound.ui.weight.BottomActionBar
import com.sw.inbound.ui.weight.TopTitleBar
import com.sw.inbound.utils.ext.startActivity
import com.sw.inbound.viewmodel.PurchaseOrderViewModel
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import timber.log.Timber
@Preview(
widthDp = 1920, heightDp = 1080, showBackground = true
)
/**
* 采购订单-供应商列表
*/
@Composable
fun PurchaseOrderScreen(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
viewModel: PurchaseOrderViewModel = hiltViewModel<PurchaseOrderViewModel>()
) {
val products by viewModel.supplierList.collectAsState()
val lazyListState = rememberLazyListState()
val canLoadMore by viewModel.canLoadMore.collectAsState()
val isMoreLoading by viewModel.isMoreLoading.collectAsState()
var pageNum by remember { mutableIntStateOf(1) }
val lifecycleOwner = LocalLifecycleOwner.current
val first = viewModel.firstOperate.collectAsState()
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) {
Timber.d("ON_RESUME 触发")
pageNum = 0
viewModel.getOrderList()
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
}
// 检测是否滚动到底部
LaunchedEffect(lazyListState) {
snapshotFlow { lazyListState.layoutInfo }.map { layoutInfo ->
val lastVisibleItem = layoutInfo.visibleItemsInfo.lastOrNull()
lastVisibleItem?.index == layoutInfo.totalItemsCount - 1
}.distinctUntilChanged().collect { reachedEnd ->
Timber.d("加载更多 reachedEnd = $reachedEnd, isMoreLoading = $isMoreLoading, canLoadMore = $canLoadMore")
if (reachedEnd && !isMoreLoading && canLoadMore) {
pageNum++
viewModel.getOrderList(pageNum = pageNum)
}
}
}
Column {
TopTitleBar()
Box(
modifier = Modifier
.weight(1f)
.padding(horizontal = 10.dp)
) {
Image(
painter = painterResource(id = R.mipmap.bg_listview),
contentDescription = "背景",
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.FillBounds
)
Box(
modifier = Modifier.padding(
start = 30.dp, end = 30.dp, top = 30.dp, bottom = 90.dp
)
) {
if (first.value) {
return@Box
}
if (products.isNullOrEmpty()) {
PurchaseEmptyItem()
} else {
LazyRow(
modifier = modifier.padding(10.dp),
state = lazyListState,
contentPadding = PaddingValues(16.dp),
horizontalArrangement = Arrangement.spacedBy(30.dp)
) {
items(items = products!!, key = { it!!.id ?: "" }) { product ->
PurchaseOrderItem(product!!) {
// navController.navigate(
// Screen.ReceiptProduct.createRoute(
// it.id,
// it.supplierId
// )
// )
navController.context.startActivity<ReceiptActivity> {
putExtra(GoodsListActivity.ID, product!!.id)
putExtra(GoodsListActivity.SUPPLIER_ID, product.supplierId)
putExtra(GoodsListActivity.IS_RECEIPT_PAGE, true)
//putExtra(GoodsListActivity.IS_NEW_RECEIPT, false)
}
}
}
if (isMoreLoading) {
item {
Box(
modifier = Modifier
.fillParentMaxHeight()
.padding(16.dp),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator()
}
}
}
}
}
}
}
BottomActionBar(modifier = Modifier, onLeftButtonClick = {
navController.popBackStack()
}, onRight2ButtonClick = {
//navController.navigate(Screen.SelfProcurement.route)
navController.context.startActivity<SelfProcurementActivity> {
putExtra(GoodsListActivity.IS_RECEIPT_PAGE, false)
}
//navController.context.startActivity<ReceiptActivity> {
// //xtra(GoodsListActivity.ID,it!!.id)
// //xtra(GoodsListActivity.SUPPLIER_ID,it.supplierId)
// putExtra(GoodsListActivity.IS_RECEIPT_PAGE,true)
// putExtra(GoodsListActivity.IS_NEW_RECEIPT,true)
//}
})
}
}
/**
* 采购单缺省
*/
@Composable
fun PurchaseEmptyItem() {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Image(painter = painterResource(R.mipmap.ic_empty), contentDescription = "暂无数据")
Spacer(modifier = Modifier.height(30.dp))
Text(
text = "暂无数据", style = TextStyle(
fontSize = 30.sp, fontWeight = FontWeight.Bold, color = colorResource(R.color.title)
)
)
}
}
/**
* 列表item
*/
@Composable
fun PurchaseOrderItem(product: SupplierInfo, onItemClick: (SupplierInfo) -> Unit) {
val (receiptStatusStyle, statusLabel) = when (product.receiveStatus) {
// 1 -> blackTextStyle to "已关闭"
// 2 -> blackTextStyle to "已完成"
// 3 -> blackTextStyle.copy(
// color = colorResource(R.color.red)
// ) to "未收货"
// //
// 4 -> blackTextStyle.copy( //import androidx.compose.foundation.Image
//import androidx.compose.foundation.background
//import androidx.compose.foundation.clickable
//import androidx.compose.foundation.layout.Arrangement
//import androidx.compose.foundation.layout.Box
//import androidx.compose.foundation.layout.Column
//import androidx.compose.foundation.layout.PaddingValues
//import androidx.compose.foundation.layout.Row
//import androidx.compose.foundation.layout.Spacer
//import androidx.compose.foundation.layout.fillMaxSize
//import androidx.compose.foundation.layout.fillMaxWidth
//import androidx.compose.foundation.layout.height
//import androidx.compose.foundation.layout.padding
//import androidx.compose.foundation.layout.width
//import androidx.compose.foundation.lazy.LazyRow
//import androidx.compose.foundation.lazy.items
//import androidx.compose.foundation.lazy.rememberLazyListState
//import androidx.compose.foundation.shape.RoundedCornerShape
//import androidx.compose.material3.Button
//import androidx.compose.material3.ButtonDefaults
//import androidx.compose.material3.CircularProgressIndicator
//import androidx.compose.material3.HorizontalDivider
//import androidx.compose.material3.Text
//import androidx.compose.runtime.Composable
//import androidx.compose.runtime.DisposableEffect
//import androidx.compose.runtime.LaunchedEffect
//import androidx.compose.runtime.collectAsState
//import androidx.compose.runtime.getValue
//import androidx.compose.runtime.mutableIntStateOf
//import androidx.compose.runtime.remember
//import androidx.compose.runtime.setValue
//import androidx.compose.runtime.snapshotFlow
//import androidx.compose.ui.Alignment
//import androidx.compose.ui.Modifier
//import androidx.compose.ui.graphics.Color
//import androidx.compose.ui.layout.ContentScale
//import androidx.compose.ui.res.colorResource
//import androidx.compose.ui.res.painterResource
//import androidx.compose.ui.text.TextStyle
//import androidx.compose.ui.text.font.FontWeight
//import androidx.compose.ui.text.style.TextOverflow
//import androidx.compose.ui.tooling.preview.Preview
//import androidx.compose.ui.unit.dp
//import androidx.compose.ui.unit.sp
//import androidx.hilt.navigation.compose.hiltViewModel
//import androidx.lifecycle.Lifecycle
//import androidx.lifecycle.LifecycleEventObserver
//import androidx.lifecycle.compose.LocalLifecycleOwner
//import androidx.navigation.NavHostController
//import androidx.navigation.compose.rememberNavController
//import com.sw.inbound.R
//import com.sw.inbound.activity.GoodsListActivity
//import com.sw.inbound.activity.ReceiptActivity
//import com.sw.inbound.activity.SelfProcurementActivity
//import com.sw.inbound.ext.dashedBorder
//import com.sw.inbound.ext.toFormattedString
//import com.sw.inbound.model.response.SupplierInfo
//import com.sw.inbound.ui.theme.AppTypography.blackTextStyle
//import com.sw.inbound.ui.theme.AppTypography.grayTextStyle
//import com.sw.inbound.ui.weight.BottomActionBar
//import com.sw.inbound.ui.weight.TopTitleBar
//import com.sw.inbound.utils.ext.startActivity
//import com.sw.inbound.viewmodel.PurchaseOrderViewModel
//import kotlinx.coroutines.flow.distinctUntilChanged
//import kotlinx.coroutines.flow.map
//import timber.log.Timber
//
//@Preview(
// widthDp = 1920, heightDp = 1080, showBackground = true
//)
///**
// * 采购订单-供应商列表
// */
//@Composable
//fun PurchaseOrderScreen(
// modifier: Modifier = Modifier,
// navController: NavHostController = rememberNavController(),
// viewModel: PurchaseOrderViewModel = hiltViewModel<PurchaseOrderViewModel>()
//) {
// val products by viewModel.supplierList.collectAsState()
// val lazyListState = rememberLazyListState()
// val canLoadMore by viewModel.canLoadMore.collectAsState()
// val isMoreLoading by viewModel.isMoreLoading.collectAsState()
// var pageNum by remember { mutableIntStateOf(1) }
// val lifecycleOwner = LocalLifecycleOwner.current
// val first = viewModel.firstOperate.collectAsState()
//
// DisposableEffect(lifecycleOwner) {
// val observer = LifecycleEventObserver { _, event ->
// if (event == Lifecycle.Event.ON_RESUME) {
// Timber.d("ON_RESUME 触发")
// pageNum = 0
// viewModel.getOrderList()
// }
// }
// lifecycleOwner.lifecycle.addObserver(observer)
// onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
// }
//
// // 检测是否滚动到底部
// LaunchedEffect(lazyListState) {
// snapshotFlow { lazyListState.layoutInfo }.map { layoutInfo ->
// val lastVisibleItem = layoutInfo.visibleItemsInfo.lastOrNull()
// lastVisibleItem?.index == layoutInfo.totalItemsCount - 1
// }.distinctUntilChanged().collect { reachedEnd ->
// Timber.d("加载更多 reachedEnd = $reachedEnd, isMoreLoading = $isMoreLoading, canLoadMore = $canLoadMore")
// if (reachedEnd && !isMoreLoading && canLoadMore) {
// pageNum++
// viewModel.getOrderList(pageNum = pageNum)
// }
// }
// }
//
// Column {
// TopTitleBar()
// Box(
// modifier = Modifier
// .weight(1f)
// .padding(horizontal = 10.dp)
// ) {
// Image(
// painter = painterResource(id = R.mipmap.bg_listview),
// contentDescription = "背景",
// modifier = Modifier.fillMaxSize(),
// contentScale = ContentScale.FillBounds
// )
//
// Box(
// modifier = Modifier.padding(
// start = 30.dp, end = 30.dp, top = 30.dp, bottom = 90.dp
// )
// ) {
// if (first.value) {
// return@Box
// }
// if (products.isNullOrEmpty()) {
// PurchaseEmptyItem()
// } else {
// LazyRow(
// modifier = modifier.padding(10.dp),
// state = lazyListState,
// contentPadding = PaddingValues(16.dp),
// horizontalArrangement = Arrangement.spacedBy(30.dp)
// ) {
// items(items = products!!, key = { it!!.id ?: "" }) { product ->
// PurchaseOrderItem(product!!) {
//// navController.navigate(
//// Screen.ReceiptProduct.createRoute(
//// it.id,
//// it.supplierId
//// )
//// )
// navController.context.startActivity<ReceiptActivity> {
// putExtra(GoodsListActivity.ID, product!!.id)
// putExtra(GoodsListActivity.SUPPLIER_ID, product.supplierId)
// putExtra(GoodsListActivity.IS_RECEIPT_PAGE, true)
// //putExtra(GoodsListActivity.IS_NEW_RECEIPT, false)
// }
// }
// }
//
// if (isMoreLoading) {
// item {
// Box(
// modifier = Modifier
// .fillParentMaxHeight()
// .padding(16.dp),
// contentAlignment = Alignment.Center
// ) {
// CircularProgressIndicator()
// }
// }
// }
// }
// }
// }
// }
//
// BottomActionBar(modifier = Modifier, onLeftButtonClick = {
// navController.popBackStack()
// }, onRight2ButtonClick = {
// //navController.navigate(Screen.SelfProcurement.route)
// navController.context.startActivity<SelfProcurementActivity> {
// putExtra(GoodsListActivity.IS_RECEIPT_PAGE, false)
// }
// //navController.context.startActivity<ReceiptActivity> {
// // //xtra(GoodsListActivity.ID,it!!.id)
// // //xtra(GoodsListActivity.SUPPLIER_ID,it.supplierId)
// // putExtra(GoodsListActivity.IS_RECEIPT_PAGE,true)
// // putExtra(GoodsListActivity.IS_NEW_RECEIPT,true)
// //}
// })
// }
//}
//
///**
// * 采购单缺省
// */
//@Composable
//fun PurchaseEmptyItem() {
// Column(
// modifier = Modifier.fillMaxSize(),
// horizontalAlignment = Alignment.CenterHorizontally,
// verticalArrangement = Arrangement.Center
// ) {
// Image(painter = painterResource(R.mipmap.ic_empty), contentDescription = "暂无数据")
// Spacer(modifier = Modifier.height(30.dp))
// Text(
// text = "暂无数据", style = TextStyle(
// fontSize = 30.sp, fontWeight = FontWeight.Bold, color = colorResource(R.color.title)
// )
// )
// }
//}
//
///**
// * 列表item
// */
//@Composable
//fun PurchaseOrderItem(product: SupplierInfo, onItemClick: (SupplierInfo) -> Unit) {
//
// val (receiptStatusStyle, statusLabel) = when (product.receiveStatus) {
//// 1 -> blackTextStyle to "已关闭"
//// 2 -> blackTextStyle to "已完成"
//// 3 -> blackTextStyle.copy(
//// color = colorResource(R.color.red)
//// ) to "未收货"
////
//// 4 -> blackTextStyle.copy(
//// color = colorResource(R.color.origin)
//// ) to "部分收货"
// 1 -> blackTextStyle.copy(
// color = colorResource(R.color.red)
// ) to "待收货"
//
// 2 -> blackTextStyle.copy(
// color = colorResource(R.color.origin) // color = colorResource(R.color.origin)
// ) to "部分收货" // ) to "收货"
1 -> blackTextStyle.copy( //
color = colorResource(R.color.red) // 3 -> blackTextStyle to "已关闭"
) to "待收货" // else -> blackTextStyle to "未知状态"
// }
2 -> blackTextStyle.copy( //
color = colorResource(R.color.origin) // val itemSpace = 29.dp
) to "已收货" // Box(
// modifier = Modifier
3 -> blackTextStyle to "已关闭" // .background(
else -> blackTextStyle to "未知状态" // color = Color.White.copy(alpha = 0.37f), shape = RoundedCornerShape(10.dp) // 圆角背景
} // )
// .clickable {
val itemSpace = 29.dp // onItemClick(product)
Box( // }) {
modifier = Modifier // Column(
.background( // modifier = Modifier
color = Color.White.copy(alpha = 0.37f), shape = RoundedCornerShape(10.dp) // 圆角背景 // .width(580.dp)
) // .padding(horizontal = 30.dp, vertical = 30.dp),
.clickable { // horizontalAlignment = Alignment.CenterHorizontally,
onItemClick(product) // verticalArrangement = Arrangement.spacedBy(0.dp)
}) { // ) {
Column( // Text(
modifier = Modifier // text = product.supplierName ?: "-",
.width(580.dp) // modifier = Modifier.padding(top = 25.dp),
.padding(horizontal = 30.dp, vertical = 30.dp), // maxLines = 1,
horizontalAlignment = Alignment.CenterHorizontally, // overflow = TextOverflow.Ellipsis,
verticalArrangement = Arrangement.spacedBy(0.dp) // style = TextStyle(
) { // fontWeight = FontWeight.Bold,
Text( // fontSize = 30.sp,
text = product.supplierName ?: "-", // color = colorResource(R.color.black)
modifier = Modifier.padding(top = 25.dp), // )
maxLines = 1, // )
overflow = TextOverflow.Ellipsis, // Spacer(modifier = Modifier.height(itemSpace))
style = TextStyle( // Text(
fontWeight = FontWeight.Bold, // text = "单号 ${product.purCode ?: "-"}", maxLines = 1, style = grayTextStyle
fontSize = 30.sp, // )
color = colorResource(R.color.black) // Spacer(modifier = Modifier.height(itemSpace))
) // HorizontalDivider(
) // thickness = 1.dp, color = colorResource(R.color.divider)
Spacer(modifier = Modifier.height(itemSpace)) // )
Text( // Spacer(modifier = Modifier.height(40.dp))
text = "单号 ${product.purCode ?: "-"}", maxLines = 1, style = grayTextStyle // Text(
) // text = "物品(项)", style = grayTextStyle
Spacer(modifier = Modifier.height(itemSpace)) // )
HorizontalDivider( // Spacer(modifier = Modifier.height(22.dp))
thickness = 1.dp, color = colorResource(R.color.divider) // Text(
) // text = product.goodCount.toFormattedString(), style = TextStyle(
Spacer(modifier = Modifier.height(40.dp)) // color = colorResource(R.color.black),
Text( // fontSize = 90.sp,
text = "物品(项)", style = grayTextStyle // fontWeight = FontWeight.Bold
) // )
Spacer(modifier = Modifier.height(22.dp)) // )
Text( // Spacer(modifier = Modifier.height(22.dp))
text = product.goodCount.toFormattedString(), style = TextStyle( // Row(
color = colorResource(R.color.black), // modifier = Modifier
fontSize = 90.sp, // .fillMaxWidth()
fontWeight = FontWeight.Bold // .dashedBorder(
) // strokeWidth = 2.dp, color = Color(0xFFBDC5CE), cornerRadiusDp = 10.dp
) // )
Spacer(modifier = Modifier.height(22.dp)) // .padding(horizontal = 72.dp, vertical = 27.dp),
Row( // horizontalArrangement = Arrangement.SpaceBetween
modifier = Modifier // ) {
.fillMaxWidth() // Column(horizontalAlignment = Alignment.CenterHorizontally) {
.dashedBorder( // Text(text = "采购日期", style = grayTextStyle)
strokeWidth = 2.dp, color = Color(0xFFBDC5CE), cornerRadiusDp = 10.dp // Spacer(modifier = Modifier.height(8.dp))
) // Text(text = product.purchaseDate ?: "-", style = blackTextStyle)
.padding(horizontal = 72.dp, vertical = 27.dp), // }
horizontalArrangement = Arrangement.SpaceBetween // Column(horizontalAlignment = Alignment.CenterHorizontally) {
) { // Text(text = "到货日期", style = grayTextStyle)
Column(horizontalAlignment = Alignment.CenterHorizontally) { // Spacer(modifier = Modifier.height(8.dp))
Text(text = "采购日期", style = grayTextStyle) // Text(text = product.receiveDate ?: "-", style = blackTextStyle)
Spacer(modifier = Modifier.height(8.dp)) // }
Text(text = product.purchaseDate ?: "-", style = blackTextStyle) // }
} // Spacer(modifier = Modifier.height(28.dp))
Column(horizontalAlignment = Alignment.CenterHorizontally) { // Row(
Text(text = "到货日期", style = grayTextStyle) // modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween
Spacer(modifier = Modifier.height(8.dp)) // ) {
Text(text = product.receiveDate ?: "-", style = blackTextStyle) // Row {
} // Text("收货状态:", style = grayTextStyle)
} // Spacer(Modifier.width(8.dp))
Spacer(modifier = Modifier.height(28.dp)) // Text(statusLabel, style = receiptStatusStyle)
Row( // }
modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween //
) { // Row {
Row { // Text("采购人:", style = grayTextStyle)
Text("收货状态:", style = grayTextStyle) // Spacer(Modifier.width(8.dp))
Spacer(Modifier.width(8.dp)) //
Text(statusLabel, style = receiptStatusStyle) // Text(product.receiveUser, style = blackTextStyle)
} // }
// }
Row { // Spacer(modifier = Modifier.height(itemSpace))
Text("采购人:", style = grayTextStyle) // Button(
Spacer(Modifier.width(8.dp)) // modifier = Modifier
// .fillMaxWidth()
Text(product.receiveUser, style = blackTextStyle) // .height(80.dp),
} // shape = RoundedCornerShape(10.dp),
} // colors = ButtonDefaults.buttonColors(
Spacer(modifier = Modifier.height(itemSpace)) // containerColor = Color(0xFF009632).copy(alpha = 1f),
Button( // contentColor = colorResource(R.color.white)
modifier = Modifier // ),
.fillMaxWidth() // onClick = {
.height(80.dp), // onItemClick(product)
shape = RoundedCornerShape(10.dp), // }) {
colors = ButtonDefaults.buttonColors( // Text(
containerColor = Color(0xFF009632).copy(alpha = 1f), // if (product.receiveStatus == 4) "部分收货" else "收货",
contentColor = colorResource(R.color.white) // style = TextStyle(fontWeight = FontWeight.Bold, fontSize = 26.sp)
), // )
onClick = { // }
onItemClick(product) // }
}) { // }
Text( //}
if (product.receiveStatus == 4) "部分收货" else "收货",
style = TextStyle(fontWeight = FontWeight.Bold, fontSize = 26.sp)
)
}
}
}
}
@@ -1,64 +1,64 @@
package com.sw.inbound.ui.theme //package com.sw.inbound.ui.theme
//
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource //import androidx.compose.ui.res.colorResource
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight //import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
import com.sw.inbound.R //import com.sw.inbound.R
//
object AppTypography { //object AppTypography {
val gray96a0aaTextStyle: TextStyle // val gray96a0aaTextStyle: TextStyle
@Composable get() = TextStyle( // @Composable get() = TextStyle(
fontSize = 24.sp, // fontSize = 24.sp,
fontWeight = FontWeight.Medium, // fontWeight = FontWeight.Medium,
color = Color(0xFF96A0AA) // color = Color(0xFF96A0AA)
) // )
//
val gray999999TextStyle: TextStyle // val gray999999TextStyle: TextStyle
@Composable get() = TextStyle( // @Composable get() = TextStyle(
fontSize = 24.sp, // fontSize = 24.sp,
fontWeight = FontWeight.Medium, // fontWeight = FontWeight.Medium,
color = Color(0xFF999999) // color = Color(0xFF999999)
) // )
//
val black141428TextStyle: TextStyle // val black141428TextStyle: TextStyle
@Composable get() = TextStyle( // @Composable get() = TextStyle(
fontSize = 24.sp, // fontSize = 24.sp,
fontWeight = FontWeight.Medium, // fontWeight = FontWeight.Medium,
color = Black_141428 // color = Black_141428
) // )
//
val grayTextStyle: TextStyle // val grayTextStyle: TextStyle
@Composable // @Composable
get() = TextStyle( // get() = TextStyle(
color = colorResource(R.color.gray), // color = colorResource(R.color.gray),
fontSize = 24.sp, // fontSize = 24.sp,
fontWeight = FontWeight.Medium // fontWeight = FontWeight.Medium
) // )
val blackTextStyle: TextStyle // val blackTextStyle: TextStyle
@Composable // @Composable
get() = TextStyle( // get() = TextStyle(
color = colorResource(R.color.black), // color = colorResource(R.color.black),
fontSize = 24.sp, // fontSize = 24.sp,
fontWeight = FontWeight.Bold // fontWeight = FontWeight.Bold
) // )
//
val blackMediumTextStyle: TextStyle // val blackMediumTextStyle: TextStyle
@Composable // @Composable
get() = TextStyle( // get() = TextStyle(
color = colorResource(R.color.black), // color = colorResource(R.color.black),
fontSize = 24.sp, // fontSize = 24.sp,
fontWeight = FontWeight.Medium // fontWeight = FontWeight.Medium
) // )
//
val BlueTextStyle: TextStyle // val BlueTextStyle: TextStyle
@Composable // @Composable
get() = TextStyle( // get() = TextStyle(
color = colorResource(R.color.blue), // color = colorResource(R.color.blue),
fontSize = 24.sp, // fontSize = 24.sp,
fontWeight = FontWeight.Bold // fontWeight = FontWeight.Bold
) // )
//
} //}
@@ -1,22 +1,22 @@
package com.sw.inbound.ui.theme //package com.sw.inbound.ui.theme
//
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
//
val Purple80 = Color(0xFFD0BCFF) //val Purple80 = Color(0xFFD0BCFF)
val PurpleGrey80 = Color(0xFFCCC2DC) //val PurpleGrey80 = Color(0xFFCCC2DC)
val Pink80 = Color(0xFFEFB8C8) //val Pink80 = Color(0xFFEFB8C8)
//
val Purple40 = Color(0xFF6650a4) //val Purple40 = Color(0xFF6650a4)
val PurpleGrey40 = Color(0xFF625b71) //val PurpleGrey40 = Color(0xFF625b71)
val Pink40 = Color(0xFF7D5260) //val Pink40 = Color(0xFF7D5260)
//
val Black_141428 = Color(0xFF141428) //val Black_141428 = Color(0xFF141428)
val Gray_A0A0B4 = Color(0XffA0A0B4) //val Gray_A0A0B4 = Color(0XffA0A0B4)
val Gray_DCDCF0 = Color(0xFFDCDCF0) //val Gray_DCDCF0 = Color(0xFFDCDCF0)
val Gray_96A0AA = Color(0xFF96A0AA) //val Gray_96A0AA = Color(0xFF96A0AA)
val GrayDivider = Color(0XFFDCDCF0) //val GrayDivider = Color(0XFFDCDCF0)
//
val Green_009632 = Color(0xFF009632) //val Green_009632 = Color(0xFF009632)
val Blue_0032C8 = Color(0xFF0032C8) //val Blue_0032C8 = Color(0xFF0032C8)
val Red_FF3232 = Color(0xFFFF3232) //val Red_FF3232 = Color(0xFFFF3232)
//
@@ -1,57 +1,57 @@
package com.sw.inbound.ui.theme //package com.sw.inbound.ui.theme
//
import android.os.Build //import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme //import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme //import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme //import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme //import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme //import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme //import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext //import androidx.compose.ui.platform.LocalContext
//
private val DarkColorScheme = darkColorScheme( //private val DarkColorScheme = darkColorScheme(
primary = Purple80, // primary = Purple80,
secondary = PurpleGrey80, // secondary = PurpleGrey80,
tertiary = Pink80 // tertiary = Pink80
) //)
//
private val LightColorScheme = lightColorScheme( //private val LightColorScheme = lightColorScheme(
primary = Purple40, // primary = Purple40,
secondary = PurpleGrey40, // secondary = PurpleGrey40,
tertiary = Pink40 // tertiary = Pink40
//
/* Other default colors to override // /* Other default colors to override
background = Color(0xFFFFFBFE), // background = Color(0xFFFFFBFE),
surface = Color(0xFFFFFBFE), // surface = Color(0xFFFFFBFE),
onPrimary = Color.White, // onPrimary = Color.White,
onSecondary = Color.White, // onSecondary = Color.White,
onTertiary = Color.White, // onTertiary = Color.White,
onBackground = Color(0xFF1C1B1F), // onBackground = Color(0xFF1C1B1F),
onSurface = Color(0xFF1C1B1F), // onSurface = Color(0xFF1C1B1F),
*/ // */
) //)
//
@Composable //@Composable
fun InboundTheme( //fun InboundTheme(
darkTheme: Boolean = isSystemInDarkTheme(), // darkTheme: Boolean = isSystemInDarkTheme(),
// Dynamic color is available on Android 12+ // // Dynamic color is available on Android 12+
dynamicColor: Boolean = true, // dynamicColor: Boolean = true,
content: @Composable () -> Unit // content: @Composable () -> Unit
) { //) {
val colorScheme = when { // val colorScheme = when {
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { // dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
val context = LocalContext.current // val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) // if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
} // }
//
darkTheme -> DarkColorScheme // darkTheme -> DarkColorScheme
else -> LightColorScheme // else -> LightColorScheme
} // }
//
MaterialTheme( // MaterialTheme(
colorScheme = colorScheme, // colorScheme = colorScheme,
typography = Typography, // typography = Typography,
content = content, // content = content,
) // )
} //}
@@ -1,34 +1,34 @@
package com.sw.inbound.ui.theme //package com.sw.inbound.ui.theme
//
import androidx.compose.material3.Typography //import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily //import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight //import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
//
// Set of Material typography styles to start with //// Set of Material typography styles to start with
val Typography = Typography( //val Typography = Typography(
bodyLarge = TextStyle( // bodyLarge = TextStyle(
fontFamily = FontFamily.Default, // fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal, // fontWeight = FontWeight.Normal,
fontSize = 16.sp, // fontSize = 16.sp,
lineHeight = 24.sp, // lineHeight = 24.sp,
letterSpacing = 0.5.sp // letterSpacing = 0.5.sp
) // )
/* Other default text styles to override // /* Other default text styles to override
titleLarge = TextStyle( // titleLarge = TextStyle(
fontFamily = FontFamily.Default, // fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal, // fontWeight = FontWeight.Normal,
fontSize = 22.sp, // fontSize = 22.sp,
lineHeight = 28.sp, // lineHeight = 28.sp,
letterSpacing = 0.sp // letterSpacing = 0.sp
), // ),
labelSmall = TextStyle( // labelSmall = TextStyle(
fontFamily = FontFamily.Default, // fontFamily = FontFamily.Default,
fontWeight = FontWeight.Medium, // fontWeight = FontWeight.Medium,
fontSize = 11.sp, // fontSize = 11.sp,
lineHeight = 16.sp, // lineHeight = 16.sp,
letterSpacing = 0.5.sp // letterSpacing = 0.5.sp
) // )
*/ // */
) //)
@@ -1,105 +1,105 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.background //import androidx.compose.foundation.background
import androidx.compose.foundation.clickable //import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement //import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row //import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer //import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth //import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height //import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size //import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width //import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape //import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource //import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight //import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
import com.sw.inbound.R //import com.sw.inbound.R
//
/** ///**
* 底部按钮 // * 底部按钮
*/ // */
@Composable //@Composable
fun BottomActionBar( //fun BottomActionBar(
leftText: String = "返回", // leftText: String = "返回",
right1ButtonText: String = "清空物品", // right1ButtonText: String = "清空物品",
right2ButtonText: String = "新增收货", // right2ButtonText: String = "新增收货",
showRight1Button: Boolean = false, // showRight1Button: Boolean = false,
onLeftButtonClick: () -> Unit, // onLeftButtonClick: () -> Unit,
onRight1ButtonClick: () -> Unit = {}, // onRight1ButtonClick: () -> Unit = {},
onRight2ButtonClick: () -> Unit, // onRight2ButtonClick: () -> Unit,
modifier: Modifier = Modifier, // modifier: Modifier = Modifier,
) { //) {
Row( // Row(
modifier = Modifier // modifier = Modifier
.fillMaxWidth() // .fillMaxWidth()
.padding(start = 30.dp, end = 30.dp, bottom = 20.dp) // .padding(start = 30.dp, end = 30.dp, bottom = 20.dp)
.height(100.dp), // .height(100.dp),
verticalAlignment = Alignment.CenterVertically, // verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween // horizontalArrangement = Arrangement.SpaceBetween
) { // ) {
// 左侧图标+文字 // // 左侧图标+文字
Row( // Row(
verticalAlignment = Alignment.CenterVertically, // verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center, // horizontalArrangement = Arrangement.Center,
modifier = Modifier // modifier = Modifier
.width(220.dp) // .width(220.dp)
.height(100.dp) // .height(100.dp)
.background( // .background(
color = colorResource(R.color.blue), // color = colorResource(R.color.blue),
shape = RoundedCornerShape(10.dp) // shape = RoundedCornerShape(10.dp)
) // )
.clickable { // .clickable {
onLeftButtonClick() // onLeftButtonClick()
} // }
) { // ) {
Image( // Image(
painter = painterResource(R.mipmap.ic_back_white), // painter = painterResource(R.mipmap.ic_back_white),
contentDescription = "返回", // contentDescription = "返回",
modifier = Modifier.size(40.dp) // modifier = Modifier.size(40.dp)
) // )
Spacer(modifier = Modifier.width(21.dp)) // Spacer(modifier = Modifier.width(21.dp))
Text( // Text(
text = leftText, // text = leftText,
style = TextStyle( // style = TextStyle(
color = colorResource(R.color.white), // color = colorResource(R.color.white),
fontWeight = FontWeight.Bold, // fontWeight = FontWeight.Bold,
fontSize = 36.sp // fontSize = 36.sp
) // )
) // )
} // }
//
Row { // Row {
if (showRight1Button) { // if (showRight1Button) {
CustomOutlinedButton( // CustomOutlinedButton(
modifier = modifier // modifier = modifier
.width(300.dp) // .width(300.dp)
.height(100.dp), // .height(100.dp),
text = right1ButtonText, // text = right1ButtonText,
fontSize = 36.sp, // fontSize = 36.sp,
onClick = onRight1ButtonClick // onClick = onRight1ButtonClick
) // )
Spacer(modifier = Modifier.width(20.dp)) // Spacer(modifier = Modifier.width(20.dp))
} // }
CustomButton( // CustomButton(
modifier = modifier // modifier = modifier
.width(300.dp) // .width(300.dp)
.height(100.dp), // .height(100.dp),
text = right2ButtonText, // text = right2ButtonText,
onClick = onRight2ButtonClick, // onClick = onRight2ButtonClick,
borderColor = colorResource(R.color.blue), // borderColor = colorResource(R.color.blue),
textColor = colorResource(R.color.white), // textColor = colorResource(R.color.white),
fontSize = 36.sp // fontSize = 36.sp
) // )
} // }
} // }
//
} //}
@@ -1,193 +1,193 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import android.net.Uri //import android.net.Uri
import android.widget.Toast //import android.widget.Toast
import androidx.camera.view.CameraController //import androidx.camera.view.CameraController
import androidx.camera.view.LifecycleCameraController //import androidx.camera.view.LifecycleCameraController
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable //import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement //import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column //import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row //import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer //import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize //import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth //import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height //import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width //import androidx.compose.foundation.layout.width
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect //import androidx.compose.runtime.DisposableEffect
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.setValue //import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext //import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.colorResource //import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.LocalLifecycleOwner //import androidx.lifecycle.compose.LocalLifecycleOwner
import coil.compose.AsyncImage //import coil.compose.AsyncImage
import com.sw.inbound.GlobalData //import com.sw.inbound.GlobalData
import com.sw.inbound.R //import com.sw.inbound.R
import com.sw.inbound.ext.dashedBorder //import com.sw.inbound.ext.dashedBorder
import com.sw.inbound.ui.theme.AppTypography //import com.sw.inbound.ui.theme.AppTypography
import com.sw.inbound.utils.FileUtils //import com.sw.inbound.utils.FileUtils
import com.sw.inbound.utils.ToastUtils //import com.sw.inbound.utils.ToastUtils
import com.sw.inbound.utils.rememberPhotoCapture //import com.sw.inbound.utils.rememberPhotoCapture
import timber.log.Timber //import timber.log.Timber
//
/** ///**
* 相机预览 -默认不预览,支持拍照 // * 相机预览 -默认不预览,支持拍照
*/ // */
@Composable //@Composable
fun CameraCaptureLayout( //fun CameraCaptureLayout(
modifier: Modifier = Modifier // modifier: Modifier = Modifier
) { //) {
val context = LocalContext.current // val context = LocalContext.current
var showCamera by remember { mutableStateOf(false) } // var showCamera by remember { mutableStateOf(false) }
val lifecycleOwner = LocalLifecycleOwner.current // val lifecycleOwner = LocalLifecycleOwner.current
var photoUri by remember { mutableStateOf<Uri?>(null) } // var photoUri by remember { mutableStateOf<Uri?>(null) }
//
// CameraX 控制器 // // CameraX 控制器
val cameraController = remember { // val cameraController = remember {
LifecycleCameraController(context).apply { // LifecycleCameraController(context).apply {
setEnabledUseCases( // setEnabledUseCases(
CameraController.IMAGE_CAPTURE or // CameraController.IMAGE_CAPTURE or
CameraController.VIDEO_CAPTURE // CameraController.VIDEO_CAPTURE
) // )
} // }
} // }
//
// 创建拍照工具实例 // // 创建拍照工具实例
val (photoCaptureHelper, takePhoto) = rememberPhotoCapture( // val (photoCaptureHelper, takePhoto) = rememberPhotoCapture(
cameraController = cameraController, // cameraController = cameraController,
onSuccess = { savedUri -> // onSuccess = { savedUri ->
// 处理拍照成功的逻辑 // // 处理拍照成功的逻辑
photoUri = savedUri // photoUri = savedUri
Timber.d("photoUri = $photoUri") // Timber.d("photoUri = $photoUri")
Toast.makeText(context, "图片已保存", Toast.LENGTH_SHORT).show() // Toast.makeText(context, "图片已保存", Toast.LENGTH_SHORT).show()
showCamera = false // showCamera = false
GlobalData.imageUri = photoUri // GlobalData.imageUri = photoUri
}, // },
onError = { error -> // onError = { error ->
// 处理拍照失败的逻辑 // // 处理拍照失败的逻辑
Toast.makeText(context, error, Toast.LENGTH_SHORT).show() // Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
GlobalData.imageUri = null // GlobalData.imageUri = null
} // }
) // )
//
Column( // Column(
modifier = modifier // modifier = modifier
.width(428.dp) // .width(428.dp)
.padding(16.dp), // .padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally, // horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(24.dp) // verticalArrangement = Arrangement.spacedBy(24.dp)
) { // ) {
if (showCamera) { // if (showCamera) {
// 摄像头预览 // // 摄像头预览
CameraPreview( // CameraPreview(
modifier = Modifier // modifier = Modifier
.width(428.dp) // .width(428.dp)
.height(321.dp), controller = cameraController // .height(321.dp), controller = cameraController
) // )
} else { // } else {
if (photoUri == null) { // if (photoUri == null) {
// 图片预览区域 // // 图片预览区域
Column( // Column(
modifier = Modifier // modifier = Modifier
.fillMaxWidth() // .fillMaxWidth()
.height(321.dp) // .height(321.dp)
.dashedBorder(strokeWidth = 2.dp, cornerRadiusDp = 15.dp) // .dashedBorder(strokeWidth = 2.dp, cornerRadiusDp = 15.dp)
.clickable { // .clickable {
showCamera = true // showCamera = true
}, // },
horizontalAlignment = Alignment.CenterHorizontally, // horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center // verticalArrangement = Arrangement.Center
) { // ) {
Image( // Image(
painter = painterResource(R.mipmap.ic_camera), // painter = painterResource(R.mipmap.ic_camera),
contentDescription = "默认图片", // contentDescription = "默认图片",
modifier = Modifier // modifier = Modifier
.width(96.dp) // .width(96.dp)
.height(76.dp) // .height(76.dp)
) // )
Spacer(modifier = Modifier.height(24.dp)) // Spacer(modifier = Modifier.height(24.dp))
Text( // Text(
"图片采集", // "图片采集",
style = AppTypography.grayTextStyle.copy(color = Color(0xFFB4B4C8)) // style = AppTypography.grayTextStyle.copy(color = Color(0xFFB4B4C8))
) // )
} // }
} else { // } else {
Column( // Column(
modifier = Modifier // modifier = Modifier
.fillMaxWidth() // .fillMaxWidth()
.height(321.dp) // .height(321.dp)
.dashedBorder(strokeWidth = 2.dp, cornerRadiusDp = 15.dp), // .dashedBorder(strokeWidth = 2.dp, cornerRadiusDp = 15.dp),
horizontalAlignment = Alignment.CenterHorizontally, // horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center // verticalArrangement = Arrangement.Center
) { // ) {
AsyncImage( // AsyncImage(
model = photoUri, // model = photoUri,
contentDescription = "照片", // contentDescription = "照片",
modifier = Modifier.fillMaxSize() // modifier = Modifier.fillMaxSize()
) // )
} // }
} // }
} // }
//
Row( // Row(
verticalAlignment = Alignment.CenterVertically, // verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.End // horizontalArrangement = Arrangement.End
) { // ) {
CustomOutlinedButton( // CustomOutlinedButton(
modifier = Modifier // modifier = Modifier
.weight(1f) // .weight(1f)
.height(80.dp), // .height(80.dp),
text = "取消", // text = "取消",
fontSize = 30.sp, // fontSize = 30.sp,
borderColor = colorResource(R.color.green), // borderColor = colorResource(R.color.green),
textColor = colorResource(R.color.green), // textColor = colorResource(R.color.green),
onClick = { // onClick = {
Timber.d("点击取消") // Timber.d("点击取消")
showCamera = true // showCamera = true
photoUri?.let { // photoUri?.let {
FileUtils.deleteFileWithUri(context, photoUri!!) // FileUtils.deleteFileWithUri(context, photoUri!!)
} // }
photoUri = null // photoUri = null
} // }
) // )
Spacer(modifier = Modifier.width(20.dp)) // Spacer(modifier = Modifier.width(20.dp))
//
CustomButton( // CustomButton(
modifier = Modifier // modifier = Modifier
.weight(1f) // .weight(1f)
.height(80.dp), // .height(80.dp),
text = "采集", // text = "采集",
onClick = { // onClick = {
Timber.d("点击采集") // Timber.d("点击采集")
if (!showCamera) { // if (!showCamera) {
ToastUtils.showToast("请先开启图片预览") // ToastUtils.showToast("请先开启图片预览")
return@CustomButton // return@CustomButton
} // }
takePhoto() // takePhoto()
}, // },
borderColor = colorResource(R.color.green), // borderColor = colorResource(R.color.green),
textColor = colorResource(R.color.white), // textColor = colorResource(R.color.white),
fontSize = 30.sp, // fontSize = 30.sp,
showButtonIcon = true // showButtonIcon = true
) // )
} // }
} // }
//
// 生命周期管理 // // 生命周期管理
DisposableEffect(lifecycleOwner) { // DisposableEffect(lifecycleOwner) {
Timber.d("cameraController") // Timber.d("cameraController")
cameraController.bindToLifecycle(lifecycleOwner) // cameraController.bindToLifecycle(lifecycleOwner)
onDispose { } // onDispose { }
} // }
} //}
@@ -1,52 +1,52 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import android.net.Uri //import android.net.Uri
import androidx.camera.view.LifecycleCameraController //import androidx.camera.view.LifecycleCameraController
import androidx.camera.view.PreviewView //import androidx.camera.view.PreviewView
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box //import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize //import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView //import androidx.compose.ui.viewinterop.AndroidView
import coil.compose.AsyncImage //import coil.compose.AsyncImage
import com.sw.inbound.R //import com.sw.inbound.R
//
/** ///**
* 相机预览 // * 相机预览
*/ // */
@Composable //@Composable
fun CameraPreview( //fun CameraPreview(
controller: LifecycleCameraController, // controller: LifecycleCameraController,
modifier: Modifier = Modifier, // modifier: Modifier = Modifier,
photoUri: Uri? = null // photoUri: Uri? = null
) { //) {
Box(modifier = modifier) { // Box(modifier = modifier) {
AndroidView( // AndroidView(
factory = { ctx -> // factory = { ctx ->
PreviewView(ctx).apply { // PreviewView(ctx).apply {
this.controller = controller // this.controller = controller
scaleType = PreviewView.ScaleType.FILL_CENTER // 控制预览缩放 // scaleType = PreviewView.ScaleType.FILL_CENTER // 控制预览缩放
} // }
}, // },
modifier = Modifier.fillMaxSize() // modifier = Modifier.fillMaxSize()
) // )
if (photoUri != null) { // if (photoUri != null) {
AsyncImage( // AsyncImage(
modifier = Modifier.fillMaxSize(), // modifier = Modifier.fillMaxSize(),
model = photoUri, // model = photoUri,
contentDescription = "照片", // contentDescription = "照片",
) // )
} // }
Image( // Image(
modifier = Modifier // modifier = Modifier
.fillMaxSize() // .fillMaxSize()
.padding(30.dp), // .padding(30.dp),
painter = painterResource(R.mipmap.ic_scan), // painter = painterResource(R.mipmap.ic_scan),
contentDescription = "扫描" // contentDescription = "扫描"
) // )
} // }
} //}
@@ -1,108 +1,108 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import androidx.compose.foundation.BorderStroke //import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Row //import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer //import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.width //import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape //import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button //import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults //import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.OutlinedButton //import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource //import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight //import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp //import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit //import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
import com.sw.inbound.R //import com.sw.inbound.R
//
/** ///**
* 空心按钮 // * 空心按钮
*/ // */
@Composable //@Composable
fun CustomOutlinedButton( //fun CustomOutlinedButton(
text: String, // text: String,
onClick: () -> Unit, // onClick: () -> Unit,
modifier: Modifier = Modifier, // modifier: Modifier = Modifier,
textColor: Color = colorResource(R.color.blue), // textColor: Color = colorResource(R.color.blue),
borderColor: Color = Color.Blue, // borderColor: Color = Color.Blue,
cornerRadius: Dp = 8.dp, // cornerRadius: Dp = 8.dp,
borderWidth: Dp = 1.dp, // borderWidth: Dp = 1.dp,
fontWeight: FontWeight = FontWeight.Bold, // fontWeight: FontWeight = FontWeight.Bold,
fontSize: TextUnit = 24.sp // fontSize: TextUnit = 24.sp
) { //) {
OutlinedButton( // OutlinedButton(
onClick = onClick, // onClick = onClick,
modifier = modifier, // modifier = modifier,
shape = RoundedCornerShape(cornerRadius), // shape = RoundedCornerShape(cornerRadius),
border = BorderStroke(borderWidth, color = borderColor), // border = BorderStroke(borderWidth, color = borderColor),
colors = ButtonDefaults.buttonColors( // colors = ButtonDefaults.buttonColors(
containerColor = Color.Transparent, // containerColor = Color.Transparent,
contentColor = textColor // contentColor = textColor
) // )
) { // ) {
Text( // Text(
text = text, // text = text,
style = TextStyle( // style = TextStyle(
fontWeight = fontWeight, // fontWeight = fontWeight,
fontSize = fontSize, // fontSize = fontSize,
color = textColor // color = textColor
) // )
) // )
} // }
} //}
//
/** ///**
* 实心按钮 // * 实心按钮
*/ // */
@Composable //@Composable
fun CustomButton( //fun CustomButton(
text: String, // text: String,
onClick: () -> Unit, // onClick: () -> Unit,
modifier: Modifier = Modifier, // modifier: Modifier = Modifier,
textColor: Color = colorResource(R.color.white), // textColor: Color = colorResource(R.color.white),
borderColor: Color = colorResource(R.color.green), // borderColor: Color = colorResource(R.color.green),
cornerRadius: Dp = 8.dp, // cornerRadius: Dp = 8.dp,
borderWidth: Dp = 1.dp, // borderWidth: Dp = 1.dp,
fontWeight: FontWeight = FontWeight.Bold, // fontWeight: FontWeight = FontWeight.Bold,
fontSize: TextUnit = 24.sp, // fontSize: TextUnit = 24.sp,
showButtonIcon: Boolean = false // showButtonIcon: Boolean = false
) { //) {
Button( // Button(
onClick = onClick, // onClick = onClick,
modifier = modifier, // modifier = modifier,
shape = RoundedCornerShape(cornerRadius), // shape = RoundedCornerShape(cornerRadius),
border = BorderStroke(borderWidth, color = borderColor), // border = BorderStroke(borderWidth, color = borderColor),
colors = ButtonDefaults.buttonColors( // colors = ButtonDefaults.buttonColors(
containerColor = borderColor, // containerColor = borderColor,
contentColor = textColor // contentColor = textColor
) // )
) { // ) {
Row(verticalAlignment = Alignment.CenterVertically) { // Row(verticalAlignment = Alignment.CenterVertically) {
if (showButtonIcon) { // if (showButtonIcon) {
Image( // Image(
painter = painterResource(R.mipmap.ic_camera_small), // painter = painterResource(R.mipmap.ic_camera_small),
contentDescription = "采集" // contentDescription = "采集"
) // )
Spacer(modifier = Modifier.width(13.dp)) // Spacer(modifier = Modifier.width(13.dp))
} // }
//
Text( // Text(
text = text, // text = text,
style = TextStyle( // style = TextStyle(
fontWeight = fontWeight, // fontWeight = fontWeight,
fontSize = fontSize, // fontSize = fontSize,
color = textColor // color = textColor
) // )
) // )
} // }
} // }
} //}
@@ -1,99 +1,99 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.background //import androidx.compose.foundation.background
import androidx.compose.foundation.border //import androidx.compose.foundation.border
import androidx.compose.foundation.clickable //import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box //import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth //import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height //import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width //import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape //import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions //import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions //import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.material3.TextField //import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults //import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
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.setValue //import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalFocusManager //import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.input.ImeAction //import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import com.sw.inbound.R //import com.sw.inbound.R
import com.sw.inbound.ui.theme.AppTypography //import com.sw.inbound.ui.theme.AppTypography
import timber.log.Timber //import timber.log.Timber
//
/** ///**
* 搜索框 // * 搜索框
*/ // */
@Composable //@Composable
fun CustomSearchView(onValueChange: (String) -> Unit = {}, onSearchClick: (String) -> Unit) { //fun CustomSearchView(onValueChange: (String) -> Unit = {}, onSearchClick: (String) -> Unit) {
var searchText by remember { mutableStateOf("") } // var searchText by remember { mutableStateOf("") }
val borderColor = Color(0xFFDCDCF0) // val borderColor = Color(0xFFDCDCF0)
val focusManager = LocalFocusManager.current // val focusManager = LocalFocusManager.current
// 搜索框 // // 搜索框
Box( // Box(
modifier = Modifier // modifier = Modifier
.fillMaxWidth() // .fillMaxWidth()
.height(60.dp) // .height(60.dp)
.border( // .border(
width = 2.dp, // width = 2.dp,
color = borderColor, // color = borderColor,
shape = RoundedCornerShape(10.dp) // 圆角边框 // shape = RoundedCornerShape(10.dp) // 圆角边框
) // )
.background(Color.Transparent) // 透明背景 // .background(Color.Transparent) // 透明背景
) { // ) {
TextField( // TextField(
value = searchText, // value = searchText,
onValueChange = { // onValueChange = {
searchText = it // searchText = it
onValueChange // onValueChange
}, // },
modifier = Modifier // modifier = Modifier
.fillMaxWidth() // .fillMaxWidth()
.padding(end = 25.dp), // 为图标留出空间 // .padding(end = 25.dp), // 为图标留出空间
colors = TextFieldDefaults.colors( // colors = TextFieldDefaults.colors(
focusedContainerColor = Color.Transparent, // focusedContainerColor = Color.Transparent,
unfocusedContainerColor = Color.Transparent, // unfocusedContainerColor = Color.Transparent,
disabledContainerColor = Color.Transparent, // disabledContainerColor = Color.Transparent,
focusedIndicatorColor = Color.Transparent, // focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent, // unfocusedIndicatorColor = Color.Transparent,
disabledIndicatorColor = Color.Transparent // disabledIndicatorColor = Color.Transparent
), // ),
placeholder = { // placeholder = {
Text("输入物品名称", style = AppTypography.gray96a0aaTextStyle) // Text("输入物品名称", style = AppTypography.gray96a0aaTextStyle)
}, // },
singleLine = true, // singleLine = true,
textStyle = AppTypography.black141428TextStyle, // textStyle = AppTypography.black141428TextStyle,
keyboardOptions = KeyboardOptions.Default.copy( // keyboardOptions = KeyboardOptions.Default.copy(
imeAction = ImeAction.Search // imeAction = ImeAction.Search
), // ),
keyboardActions = KeyboardActions(onSearch = { // keyboardActions = KeyboardActions(onSearch = {
focusManager.clearFocus() // focusManager.clearFocus()
onSearchClick(searchText) // onSearchClick(searchText)
}), // }),
trailingIcon = { // trailingIcon = {
Image( // Image(
painter = painterResource(R.mipmap.ic_search), // painter = painterResource(R.mipmap.ic_search),
contentDescription = "搜索", // contentDescription = "搜索",
modifier = Modifier // modifier = Modifier
.width(32.dp) // .width(32.dp)
.height(32.dp) // .height(32.dp)
.clickable { // .clickable {
Timber.d("搜索点击") // Timber.d("搜索点击")
focusManager.clearFocus() // focusManager.clearFocus()
onSearchClick(searchText) // onSearchClick(searchText)
} // }
) // )
}, // },
) // )
//
} // }
} //}
@@ -1,29 +1,29 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign //import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow //import androidx.compose.ui.text.style.TextOverflow
import com.sw.inbound.ui.theme.AppTypography //import com.sw.inbound.ui.theme.AppTypography
//
/** ///**
* 自定义单行文本 // * 自定义单行文本
*/ // */
@Composable //@Composable
fun CustomSingleRightText( //fun CustomSingleRightText(
modifier: Modifier, // modifier: Modifier,
text: String, // text: String,
style: TextStyle = AppTypography.blackTextStyle, // style: TextStyle = AppTypography.blackTextStyle,
textAlign: TextAlign = TextAlign.End // textAlign: TextAlign = TextAlign.End
) { //) {
Text( // Text(
modifier = modifier, // modifier = modifier,
text = text, // text = text,
textAlign = textAlign, // textAlign = textAlign,
style = style, // style = style,
maxLines = 1, // maxLines = 1,
overflow = TextOverflow.Ellipsis, // overflow = TextOverflow.Ellipsis,
) // )
} //}
@@ -1,226 +1,226 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import androidx.compose.foundation.background //import androidx.compose.foundation.background
import androidx.compose.foundation.border //import androidx.compose.foundation.border
import androidx.compose.foundation.clickable //import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box //import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxHeight //import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth //import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height //import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight //import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape //import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions //import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions //import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.LocalTextStyle //import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.material3.TextField //import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults //import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
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.setValue //import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusDirection //import androidx.compose.ui.focus.FocusDirection
import androidx.compose.ui.focus.onFocusChanged //import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalFocusManager //import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight //import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction //import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.style.TextAlign //import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
import com.sw.inbound.ext.isValidFloat //import com.sw.inbound.ext.isValidFloat
import com.sw.inbound.ext.isValidNumber //import com.sw.inbound.ext.isValidNumber
import com.sw.inbound.ui.theme.AppTypography //import com.sw.inbound.ui.theme.AppTypography
import com.sw.inbound.ui.theme.Black_141428 //import com.sw.inbound.ui.theme.Black_141428
import com.sw.inbound.ui.theme.Gray_DCDCF0 //import com.sw.inbound.ui.theme.Gray_DCDCF0
import timber.log.Timber //import timber.log.Timber
//
//@Preview(showBackground = true) ////@Preview(showBackground = true)
////@Composable
////fun testTextField() {
//// Column(verticalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier.padding(20.dp)) {
//// CustomTextField(value = "123", onValueChange = {}, textAlign = TextAlign.Start)
//// CustomTextField(value = "", onValueChange = {}, textAlign = TextAlign.Start)
//// CustomTextField(value = "", onValueChange = {}, textAlign = TextAlign.End)
//// CustomTextField(
//// value = "123",
//// onValueChange = {},
//// textAlign = TextAlign.End,
//// trailingLabel = "克"
//// )
//// CustomTextField(
//// enabled = false,
//// modifier = Modifier
//// .height(60.dp),
//// value = "123",
//// onValueChange = {},
//// textAlign = TextAlign.End,
//// leadingIcon =
//// {
//// Button(
//// onClick = {},
//// modifier = Modifier
//// .padding(0.dp)
//// .fillMaxHeight(),
//// shape = RoundedCornerShape(10.dp),
//// border = BorderStroke(2.dp, color = Color.White),
//// colors = ButtonDefaults.buttonColors(
//// containerColor = Color.White,
//// contentColor = Black_141428
//// ),
//// ) { Text(text = "累计", style = AppTypography.black141428TextStyle) }
//// }
//// )
//// }
////
////}
//
//enum class InputType {
// Text, // 字符串
// Number, // 数字
// Decimal, // 浮点
// Percent, // 百分比
//}
//
///**
// * 自定义输入框
// */
//@Composable //@Composable
//fun testTextField() { //fun CustomTextField(
// Column(verticalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier.padding(20.dp)) { // value: String,
// CustomTextField(value = "123", onValueChange = {}, textAlign = TextAlign.Start) // onValueChange: (String) -> Unit,
// CustomTextField(value = "", onValueChange = {}, textAlign = TextAlign.Start) // modifier: Modifier = Modifier.height(60.dp),
// CustomTextField(value = "", onValueChange = {}, textAlign = TextAlign.End) // placeholderValue: String = "请录入", // 占位文本
// CustomTextField( // trailingLabel: String? = null, // 右侧文字
// value = "123", // textAlign: TextAlign = TextAlign.Start,
// onValueChange = {}, // textStyle: TextStyle? = null,
// textAlign = TextAlign.End, // leadingIcon: @Composable (() -> Unit)? = null, // 左侧布局
// trailingLabel = "克" // enabled: Boolean = true,
// ) // inputType: InputType = InputType.Text, // 输入类型
// CustomTextField( // hasNext: Boolean = true, // 键盘显示下一个
// enabled = false, // isInitUpdate: Boolean = false, // 是否需要根据原始数据变动
// modifier = Modifier // keyboardOptions: KeyboardOptions? = null,
// .height(60.dp), // keyboardActions: KeyboardActions? = null,
// value = "123", // onClick: () -> Unit = {}, // 点击
// onValueChange = {}, //) {
// textAlign = TextAlign.End, // val containerColor = if (enabled) Color.Transparent else Gray_DCDCF0
// leadingIcon = // var inputValue by remember(if (isInitUpdate) value else null) {
// { // mutableStateOf(value)
// Button( // }
// onClick = {}, // val focusManager = LocalFocusManager.current
// modifier = Modifier //
// .padding(0.dp) // fun onEditingComplete(isFocus: Boolean) {
// .fillMaxHeight(), // Timber.d("onEditingComplete inputValue = $inputValue, isFocus = $isFocus")
// shape = RoundedCornerShape(10.dp), // onValueChange(inputValue)
// border = BorderStroke(2.dp, color = Color.White),
// colors = ButtonDefaults.buttonColors(
// containerColor = Color.White,
// contentColor = Black_141428
// ),
// ) { Text(text = "累计", style = AppTypography.black141428TextStyle) }
// }
// )
// } // }
// //
// var newTextStyle = textStyle
// ?: LocalTextStyle.current.copy(
// color = Black_141428,
// fontSize = 24.sp,
// fontWeight = FontWeight.Bold,
// textAlign = textAlign
// )
// Box(modifier = modifier) {
// TextField(
// enabled = enabled,
// value = inputValue,
// textStyle = newTextStyle,
// onValueChange = { newValue ->
// Timber.d("onValueChange newValue = $newValue")
// when (inputType) {
// InputType.Number -> {
// if (newValue.isEmpty() || newValue.isValidNumber()) {
// inputValue = newValue
// onEditingComplete(true)
// }
// }
//
// InputType.Decimal -> {
// if (newValue.isEmpty() || newValue.isValidFloat()) {
// inputValue = newValue
// onEditingComplete(true)
// }
// }
//
// InputType.Percent -> {
// val range: ClosedFloatingPointRange<Float> = 0f..100f
// if (newValue.isEmpty() || (newValue.isValidFloat(1) && newValue.toFloat() in range)) {
// inputValue = newValue
// onEditingComplete(true)
// }
// }
//
// else -> {
// inputValue = newValue
// onEditingComplete(true)
// }
// }
// },
//
// modifier = Modifier
// .fillMaxWidth()
// .background(Color.Transparent)
// .border(
// width = 2.dp,
// color = Gray_DCDCF0,
// shape = RoundedCornerShape(10.dp)
// )
// .clickable(onClick = onClick)
//// .focusable()
// .onFocusChanged(onFocusChanged = { focusState ->
// {
// onEditingComplete(focusState.isFocused)
// }
// }),
// colors = TextFieldDefaults.colors(
// focusedContainerColor = Color.Transparent,
// unfocusedContainerColor = Color.Transparent,
// disabledContainerColor = containerColor,
// focusedIndicatorColor = Color.Transparent,
// unfocusedIndicatorColor = Color.Transparent,
// disabledIndicatorColor = Color.Transparent
// ),
// shape = RoundedCornerShape(10.dp),
// placeholder = {
// Text(
// modifier = Modifier
// .fillMaxWidth()
// .fillMaxHeight()
// .wrapContentHeight(Alignment.CenterVertically),
// text = placeholderValue,
// textAlign = textAlign,
// style = AppTypography.gray96a0aaTextStyle
// )
// },
// leadingIcon = leadingIcon,
// trailingIcon = trailingLabel?.let { label ->
// {
// Box(modifier = Modifier.padding(start = 10.dp, end = 20.dp)) {
// Text(
// text = trailingLabel,
// modifier = Modifier
// .fillMaxHeight()
// .wrapContentHeight(Alignment.CenterVertically),
// style = AppTypography.gray96a0aaTextStyle
// )
// }
// }
// },
// keyboardOptions = keyboardOptions
// ?: KeyboardOptions.Default.copy(imeAction = if (hasNext) ImeAction.Next else ImeAction.Done),
// keyboardActions = keyboardActions ?: KeyboardActions(onNext = {
// focusManager.moveFocus(focusDirection = FocusDirection.Next)
// onEditingComplete(false)
// }, onDone = {
// focusManager.clearFocus()
// onEditingComplete(false)
// })
// )
// }
//} //}
enum class InputType {
Text, // 字符串
Number, // 数字
Decimal, // 浮点
Percent, // 百分比
}
/**
* 自定义输入框
*/
@Composable
fun CustomTextField(
value: String,
onValueChange: (String) -> Unit,
modifier: Modifier = Modifier.height(60.dp),
placeholderValue: String = "请录入", // 占位文本
trailingLabel: String? = null, // 右侧文字
textAlign: TextAlign = TextAlign.Start,
textStyle: TextStyle? = null,
leadingIcon: @Composable (() -> Unit)? = null, // 左侧布局
enabled: Boolean = true,
inputType: InputType = InputType.Text, // 输入类型
hasNext: Boolean = true, // 键盘显示下一个
isInitUpdate: Boolean = false, // 是否需要根据原始数据变动
keyboardOptions: KeyboardOptions? = null,
keyboardActions: KeyboardActions? = null,
onClick: () -> Unit = {}, // 点击
) {
val containerColor = if (enabled) Color.Transparent else Gray_DCDCF0
var inputValue by remember(if (isInitUpdate) value else null) {
mutableStateOf(value)
}
val focusManager = LocalFocusManager.current
fun onEditingComplete(isFocus: Boolean) {
Timber.d("onEditingComplete inputValue = $inputValue, isFocus = $isFocus")
onValueChange(inputValue)
}
var newTextStyle = textStyle
?: LocalTextStyle.current.copy(
color = Black_141428,
fontSize = 24.sp,
fontWeight = FontWeight.Bold,
textAlign = textAlign
)
Box(modifier = modifier) {
TextField(
enabled = enabled,
value = inputValue,
textStyle = newTextStyle,
onValueChange = { newValue ->
Timber.d("onValueChange newValue = $newValue")
when (inputType) {
InputType.Number -> {
if (newValue.isEmpty() || newValue.isValidNumber()) {
inputValue = newValue
onEditingComplete(true)
}
}
InputType.Decimal -> {
if (newValue.isEmpty() || newValue.isValidFloat()) {
inputValue = newValue
onEditingComplete(true)
}
}
InputType.Percent -> {
val range: ClosedFloatingPointRange<Float> = 0f..100f
if (newValue.isEmpty() || (newValue.isValidFloat(1) && newValue.toFloat() in range)) {
inputValue = newValue
onEditingComplete(true)
}
}
else -> {
inputValue = newValue
onEditingComplete(true)
}
}
},
modifier = Modifier
.fillMaxWidth()
.background(Color.Transparent)
.border(
width = 2.dp,
color = Gray_DCDCF0,
shape = RoundedCornerShape(10.dp)
)
.clickable(onClick = onClick)
// .focusable()
.onFocusChanged(onFocusChanged = { focusState ->
{
onEditingComplete(focusState.isFocused)
}
}),
colors = TextFieldDefaults.colors(
focusedContainerColor = Color.Transparent,
unfocusedContainerColor = Color.Transparent,
disabledContainerColor = containerColor,
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent,
disabledIndicatorColor = Color.Transparent
),
shape = RoundedCornerShape(10.dp),
placeholder = {
Text(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()
.wrapContentHeight(Alignment.CenterVertically),
text = placeholderValue,
textAlign = textAlign,
style = AppTypography.gray96a0aaTextStyle
)
},
leadingIcon = leadingIcon,
trailingIcon = trailingLabel?.let { label ->
{
Box(modifier = Modifier.padding(start = 10.dp, end = 20.dp)) {
Text(
text = trailingLabel,
modifier = Modifier
.fillMaxHeight()
.wrapContentHeight(Alignment.CenterVertically),
style = AppTypography.gray96a0aaTextStyle
)
}
}
},
keyboardOptions = keyboardOptions
?: KeyboardOptions.Default.copy(imeAction = if (hasNext) ImeAction.Next else ImeAction.Done),
keyboardActions = keyboardActions ?: KeyboardActions(onNext = {
focusManager.moveFocus(focusDirection = FocusDirection.Next)
onEditingComplete(false)
}, onDone = {
focusManager.clearFocus()
onEditingComplete(false)
})
)
}
}
@@ -1,126 +1,126 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.background //import androidx.compose.foundation.background
import androidx.compose.foundation.clickable //import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement //import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row //import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer //import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth //import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height //import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size //import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width //import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape //import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource //import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight //import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview //import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
import com.sw.inbound.R //import com.sw.inbound.R
//
@Preview //@Preview
@Composable //@Composable
fun BackButton() { //fun BackButton() {
Row( // Row(
modifier = Modifier // modifier = Modifier
.fillMaxWidth() // .fillMaxWidth()
.padding(start = 30.dp, end = 30.dp, bottom = 20.dp) // .padding(start = 30.dp, end = 30.dp, bottom = 20.dp)
.height(100.dp), // .height(100.dp),
verticalAlignment = Alignment.CenterVertically, // verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween // horizontalArrangement = Arrangement.SpaceBetween
) { // ) {
// 左侧图标+文字 // // 左侧图标+文字
Row( // Row(
verticalAlignment = Alignment.CenterVertically, // verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center, // horizontalArrangement = Arrangement.Center,
modifier = Modifier // modifier = Modifier
.width(220.dp) // .width(220.dp)
.height(100.dp) // .height(100.dp)
.background( // .background(
color = colorResource(R.color.blue), // color = colorResource(R.color.blue),
shape = RoundedCornerShape(10.dp) // shape = RoundedCornerShape(10.dp)
) // )
.clickable { // .clickable {
//
} // }
) { // ) {
Image( // Image(
painter = painterResource(R.mipmap.ic_back_white), // painter = painterResource(R.mipmap.ic_back_white),
contentDescription = "返回", // contentDescription = "返回",
modifier = Modifier.size(40.dp) // modifier = Modifier.size(40.dp)
) // )
Spacer(modifier = Modifier.width(21.dp)) // Spacer(modifier = Modifier.width(21.dp))
Text( // Text(
text = "返回", // text = "返回",
style = TextStyle( // style = TextStyle(
color = colorResource(R.color.white), // color = colorResource(R.color.white),
fontWeight = FontWeight.Bold, // fontWeight = FontWeight.Bold,
fontSize = 36.sp // fontSize = 36.sp
)
)
}
// Row {
// if (false) {
// CustomOutlinedButton(
// modifier = Modifier
// .width(300.dp)
// .height(100.dp),
// text = "ok",
// fontSize = 36.sp,
// onClick = {}
// ) // )
// Spacer(modifier = Modifier.width(20.dp))
// }
// CustomButton(
// modifier = Modifier
// .width(300.dp)
// .height(100.dp),
// text = "Button",
// onClick = {},
// borderColor = colorResource(R.color.blue),
// textColor = colorResource(R.color.white),
// fontSize = 36.sp
// ) // )
// } // }
} //
} //// Row {
@Composable //// if (false) {
fun BackButton2() { //// CustomOutlinedButton(
Row( //// modifier = Modifier
verticalAlignment = Alignment.CenterVertically, //// .width(300.dp)
horizontalArrangement = Arrangement.Center, //// .height(100.dp),
modifier = Modifier //// text = "ok",
.width(220.dp) //// fontSize = 36.sp,
.height(100.dp) //// onClick = {}
.background( //// )
color = colorResource(R.color.blue), //// Spacer(modifier = Modifier.width(20.dp))
shape = RoundedCornerShape(10.dp) //// }
) //// CustomButton(
.clickable { //// modifier = Modifier
//// .width(300.dp)
} //// .height(100.dp),
) { //// text = "Button",
Image( //// onClick = {},
painter = painterResource(R.mipmap.ic_home2), //// borderColor = colorResource(R.color.blue),
contentDescription = "返回", //// textColor = colorResource(R.color.white),
modifier = Modifier.size(40.dp) //// fontSize = 36.sp
) //// )
Spacer(modifier = Modifier.width(21.dp)) //// }
Text( // }
text = "返回", //}
style = TextStyle( //@Composable
color = colorResource(R.color.white), //fun BackButton2() {
fontWeight = FontWeight.Bold, // Row(
fontSize = 36.sp // verticalAlignment = Alignment.CenterVertically,
) // horizontalArrangement = Arrangement.Center,
) // modifier = Modifier
} // .width(220.dp)
} // .height(100.dp)
// .background(
// color = colorResource(R.color.blue),
// shape = RoundedCornerShape(10.dp)
// )
// .clickable {
//
// }
// ) {
// Image(
// painter = painterResource(R.mipmap.ic_home2),
// contentDescription = "返回",
// modifier = Modifier.size(40.dp)
// )
// Spacer(modifier = Modifier.width(21.dp))
// Text(
// text = "返回",
// style = TextStyle(
// color = colorResource(R.color.white),
// fontWeight = FontWeight.Bold,
// fontSize = 36.sp
// )
// )
// }
//}
@@ -1,145 +1,145 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.background //import androidx.compose.foundation.background
import androidx.compose.foundation.clickable //import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column //import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row //import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer //import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth //import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size //import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width //import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn //import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed //import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.HorizontalDivider //import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource //import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign //import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import com.sw.inbound.R //import com.sw.inbound.R
import com.sw.inbound.ext.bold //import com.sw.inbound.ext.bold
import com.sw.inbound.model.request.PurchaseWarehouseParam //import com.sw.inbound.model.request.PurchaseWarehouseParam
import com.sw.inbound.ui.theme.AppTypography //import com.sw.inbound.ui.theme.AppTypography
//
/** ///**
* 自采购 左侧列表 // * 自采购 左侧列表
*/ // */
@Composable //@Composable
fun SelfProcurementListItem( //fun SelfProcurementListItem(
modifier: Modifier = Modifier, // modifier: Modifier = Modifier,
productList: List<PurchaseWarehouseParam>, // productList: List<PurchaseWarehouseParam>,
checkedItem: PurchaseWarehouseParam? = null, // checkedItem: PurchaseWarehouseParam? = null,
onItemCheckedClick: (PurchaseWarehouseParam) -> Unit = {}, // onItemCheckedClick: (PurchaseWarehouseParam) -> Unit = {},
showClose: Boolean = false, // showClose: Boolean = false,
onCloseClick: (Int, PurchaseWarehouseParam) -> Unit, // onCloseClick: (Int, PurchaseWarehouseParam) -> Unit,
) { //) {
Column( // Column(
modifier = modifier // modifier = modifier
// .padding(horizontal = 30.dp) //// .padding(horizontal = 30.dp)
) { // ) {
// 左侧列表标题 // // 左侧列表标题
Row( // Row(
modifier = Modifier // modifier = Modifier
.fillMaxWidth() // .fillMaxWidth()
.padding(30.dp) // .padding(30.dp)
) { // ) {
CustomSingleRightText( // CustomSingleRightText(
modifier = Modifier.weight(1f), // modifier = Modifier.weight(1f),
text = "名称", // text = "名称",
style = AppTypography.gray96a0aaTextStyle.bold(), // style = AppTypography.gray96a0aaTextStyle.bold(),
textAlign = TextAlign.Start // textAlign = TextAlign.Start
)
Spacer(modifier = Modifier.width(10.dp))
CustomSingleRightText(
modifier = Modifier.width(100.dp),
text = "单价(元)",
style = AppTypography.gray96a0aaTextStyle.bold()
)
Spacer(modifier = Modifier.width(20.dp))
CustomSingleRightText(
modifier = Modifier.width(100.dp),
text = "数量",
style = AppTypography.gray96a0aaTextStyle.bold()
)
Spacer(modifier = Modifier.width(20.dp))
CustomSingleRightText(
modifier = Modifier.width(110.dp),
text = "金额(元)",
style = AppTypography.gray96a0aaTextStyle.bold()
)
if (showClose) {
Spacer(modifier = Modifier.width(78.dp))
}
}
// Spacer(modifier = Modifier.height(31.dp))
HorizontalDivider(thickness = 1.dp, color = colorResource(R.color.divider))
// Spacer(modifier = Modifier.height(31.dp))
// 左侧列表
LazyColumn() {
itemsIndexed(items = productList)
// items(
// items = productList,
// // 取消key,列表中可以插入同一物品
//// key = { it.goodsId }
// ) // )
{ index, it -> // Spacer(modifier = Modifier.width(10.dp))
Row( // CustomSingleRightText(
modifier = Modifier // modifier = Modifier.width(100.dp),
.background(color = Color.Transparent) // text = "单价(元)",
.padding(30.dp) // style = AppTypography.gray96a0aaTextStyle.bold()
.clickable { // )
onItemCheckedClick(it) // Spacer(modifier = Modifier.width(20.dp))
}, verticalAlignment = Alignment.CenterVertically // CustomSingleRightText(
) { // modifier = Modifier.width(100.dp),
CustomSingleRightText( // text = "数量",
modifier = Modifier.weight(1f), // style = AppTypography.gray96a0aaTextStyle.bold()
text = it.goodsNameStr, // )
textAlign = TextAlign.Start // Spacer(modifier = Modifier.width(20.dp))
) // CustomSingleRightText(
Spacer(modifier = Modifier.width(10.dp)) // modifier = Modifier.width(110.dp),
CustomSingleRightText( // text = "金额(元)",
modifier = Modifier.width(100.dp), // style = AppTypography.gray96a0aaTextStyle.bold()
text = it.goodsUnitPriceStr, // )
style = AppTypography.blackTextStyle // if (showClose) {
) // Spacer(modifier = Modifier.width(78.dp))
Spacer(modifier = Modifier.width(20.dp)) // }
CustomSingleRightText( // }
modifier = Modifier.width(100.dp), //// Spacer(modifier = Modifier.height(31.dp))
text = "${it.goodsCountStr}${it.unitNameStr}", // HorizontalDivider(thickness = 1.dp, color = colorResource(R.color.divider))
style = AppTypography.blackTextStyle //// Spacer(modifier = Modifier.height(31.dp))
) // // 左侧列表
Spacer(modifier = Modifier.width(20.dp)) // LazyColumn() {
CustomSingleRightText( // itemsIndexed(items = productList)
modifier = Modifier.width(110.dp), //// items(
text = it.goodsPriceStr, //// items = productList,
style = AppTypography.blackTextStyle //// // 取消key,列表中可以插入同一物品
) ////// key = { it.goodsId }
if (showClose) { //// )
Spacer(modifier = Modifier.width(30.dp)) // { index, it ->
Image( // Row(
modifier = Modifier // modifier = Modifier
.size(48.dp) // .background(color = Color.Transparent)
.clickable { // .padding(30.dp)
onCloseClick(index, it) // .clickable {
}, // onItemCheckedClick(it)
painter = painterResource(R.mipmap.ic_delete), // }, verticalAlignment = Alignment.CenterVertically
contentDescription = "删除" // ) {
) // CustomSingleRightText(
} // modifier = Modifier.weight(1f),
} // text = it.goodsNameStr,
// Spacer(modifier = Modifier.height(33.dp)) // textAlign = TextAlign.Start
// if (productList.indexOf(it) != productList.lastIndex) // )
HorizontalDivider( // Spacer(modifier = Modifier.width(10.dp))
thickness = 1.dp, // CustomSingleRightText(
color = colorResource(R.color.divider) // modifier = Modifier.width(100.dp),
) // text = it.goodsUnitPriceStr,
// Spacer(modifier = Modifier.height(33.dp)) // style = AppTypography.blackTextStyle
} // )
} // Spacer(modifier = Modifier.width(20.dp))
} // CustomSingleRightText(
} // modifier = Modifier.width(100.dp),
// text = "${it.goodsCountStr}${it.unitNameStr}",
// style = AppTypography.blackTextStyle
// )
// Spacer(modifier = Modifier.width(20.dp))
// CustomSingleRightText(
// modifier = Modifier.width(110.dp),
// text = it.goodsPriceStr,
// style = AppTypography.blackTextStyle
// )
// if (showClose) {
// Spacer(modifier = Modifier.width(30.dp))
// Image(
// modifier = Modifier
// .size(48.dp)
// .clickable {
// onCloseClick(index, it)
// },
// painter = painterResource(R.mipmap.ic_delete),
// contentDescription = "删除"
// )
// }
// }
//// Spacer(modifier = Modifier.height(33.dp))
//// if (productList.indexOf(it) != productList.lastIndex)
// HorizontalDivider(
// thickness = 1.dp,
// color = colorResource(R.color.divider)
// )
//// Spacer(modifier = Modifier.height(33.dp))
// }
// }
// }
//}
@@ -1,142 +1,142 @@
package com.sw.inbound.ui.weight //package com.sw.inbound.ui.weight
//
import android.content.Intent //import android.content.Intent
import androidx.compose.foundation.ExperimentalFoundationApi //import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image //import androidx.compose.foundation.Image
import androidx.compose.foundation.background //import androidx.compose.foundation.background
import androidx.compose.foundation.clickable //import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable //import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement //import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box //import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row //import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer //import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth //import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height //import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size //import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width //import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentSize //import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.layout.wrapContentWidth //import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect //import androidx.compose.runtime.LaunchedEffect
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.setValue //import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource //import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource //import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle //import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight //import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview //import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
import com.sw.inbound.MyApp //import com.sw.inbound.MyApp
import com.sw.inbound.R //import com.sw.inbound.R
import com.sw.inbound.activity.FoodCollectionActivity //import com.sw.inbound.activity.FoodCollectionActivity
import com.sw.inbound.ext.medium //import com.sw.inbound.ext.medium
import com.sw.inbound.model.response.User //import com.sw.inbound.model.response.User
import com.sw.inbound.ui.theme.AppTypography //import com.sw.inbound.ui.theme.AppTypography
import com.sw.inbound.utils.DateTimeUtils //import com.sw.inbound.utils.DateTimeUtils
import com.sw.inbound.utils.ext.startActivity //import com.sw.inbound.utils.ext.startActivity
import kotlinx.coroutines.delay //import kotlinx.coroutines.delay
//
//
@OptIn(ExperimentalFoundationApi::class) //@OptIn(ExperimentalFoundationApi::class)
@Preview( //@Preview(
widthDp = 1920, // widthDp = 1920,
heightDp = 1080, // heightDp = 1080,
showBackground = true // showBackground = true
) //)
/** ///**
* 标题 // * 标题
*/ // */
@Composable //@Composable
fun TopTitleBar( //fun TopTitleBar(
modifier: Modifier = Modifier, // modifier: Modifier = Modifier,
// title: String = "采购单入库", //// title: String = "采购单入库",
title: String = "出入库管理", // title: String = "出入库管理",
user: User? = null, // user: User? = null,
onLogoutClick: () -> Unit = {} // onLogoutClick: () -> Unit = {}
) { //) {
var currentTime by remember { mutableStateOf(DateTimeUtils.getChineseDateString()) } // var currentTime by remember { mutableStateOf(DateTimeUtils.getChineseDateString()) }
//
// 每秒更新一次时间 // // 每秒更新一次时间
LaunchedEffect(Unit) { // LaunchedEffect(Unit) {
while (true) { // while (true) {
delay(1000) // 1秒间隔 // delay(1000) // 1秒间隔
currentTime = DateTimeUtils.getChineseDateString() // currentTime = DateTimeUtils.getChineseDateString()
} // }
} // }
//
Row( // Row(
modifier = modifier // modifier = modifier
.fillMaxWidth() // .fillMaxWidth()
.padding(start = 60.dp, end = 60.dp, top = 22.dp), // .padding(start = 60.dp, end = 60.dp, top = 22.dp),
verticalAlignment = Alignment.CenterVertically, // verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween // horizontalArrangement = Arrangement.SpaceBetween
) { // ) {
//
Box(modifier = Modifier // Box(modifier = Modifier
.wrapContentSize() // .wrapContentSize()
.clickable(onClick = { // .clickable(onClick = {
MyApp.instance?.run { // MyApp.instance?.run {
startActivity( // startActivity(
Intent(this, FoodCollectionActivity::class.java).apply { // Intent(this, FoodCollectionActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
} // }
) // )
}
})) {
Text(
text = title,
style = TextStyle(
fontWeight = FontWeight.Bold,
color = colorResource(R.color.title),
fontSize = 36.sp
),
modifier = Modifier
.wrapContentSize()
.padding(10.dp)
)
}
Spacer(modifier = Modifier.weight(1f))
if (user != null) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.height(60.dp)
.clickable {
onLogoutClick()
}) {
Text(text = user.name ?: "用户", style = AppTypography.blackTextStyle.medium())
Spacer(modifier = Modifier.width(21.dp))
Image(
modifier = Modifier.size(60.dp),
painter = painterResource(R.mipmap.ic_logout),
contentDescription = "退出"
)
}
} else {
Text(
// modifier = Modifier.combinedClickable(
// onClick = {},
// onLongClick = {
// onLogoutClick()
// } // }
// })) {
// Text(
// text = title,
// style = TextStyle(
// fontWeight = FontWeight.Bold,
// color = colorResource(R.color.title),
// fontSize = 36.sp
// ), // ),
text = currentTime, // modifier = Modifier
style = TextStyle( // .wrapContentSize()
fontWeight = FontWeight.Medium, // .padding(10.dp)
color = colorResource(R.color.black), // )
fontSize = 24.sp // }
) //
) // Spacer(modifier = Modifier.weight(1f))
} //
} // if (user != null) {
} // Row(
// verticalAlignment = Alignment.CenterVertically,
// modifier = Modifier
// .height(60.dp)
// .clickable {
// onLogoutClick()
// }) {
// Text(text = user.name ?: "用户", style = AppTypography.blackTextStyle.medium())
// Spacer(modifier = Modifier.width(21.dp))
// Image(
// modifier = Modifier.size(60.dp),
// painter = painterResource(R.mipmap.ic_logout),
// contentDescription = "退出"
// )
// }
// } else {
// Text(
//// modifier = Modifier.combinedClickable(
//// onClick = {},
//// onLongClick = {
//// onLogoutClick()
//// }
//// ),
// text = currentTime,
// style = TextStyle(
// fontWeight = FontWeight.Medium,
// color = colorResource(R.color.black),
// fontSize = 24.sp
// )
// )
// }
// }
//}
@@ -2,9 +2,9 @@ package com.sw.inbound.utils
import android.content.Context import android.content.Context
import android.view.View import android.view.View
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext //import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView //import androidx.compose.ui.platform.LocalView
/** /**
* Context 工具类 * Context 工具类
@@ -17,18 +17,18 @@ object ContextUtils {
* 获取当前 Composable 的 Activity Context * 获取当前 Composable 的 Activity Context
* 只能在 @Composable 函数中调用 * 只能在 @Composable 函数中调用
*/ */
@Composable // @Composable
fun getActivityContext(): Context { // fun getActivityContext(): Context {
return LocalContext.current // return LocalContext.current
} // }
/** /**
* 获取当前 Composable 的 View * 获取当前 Composable 的 View
*/ */
@Composable // @Composable
fun getLocalView(): View { // fun getLocalView(): View {
return LocalView.current // return LocalView.current
} // }
// ========== 非 Composable 环境获取 ========== // ========== 非 Composable 环境获取 ==========
@@ -9,7 +9,7 @@ import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.os.Process import android.os.Process
import com.sw.inbound.MainActivity import com.sw.inbound.activity.HomeActivity
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
@@ -86,7 +86,7 @@ class CrashHandler private constructor(private val context: Context) :
private fun restartApp() { private fun restartApp() {
// 延迟1秒后重启应用 // 延迟1秒后重启应用
Handler(Looper.getMainLooper()).postDelayed({ Handler(Looper.getMainLooper()).postDelayed({
val intent = Intent(context, MainActivity::class.java).apply { val intent = Intent(context, HomeActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
} }
@@ -1,223 +1,223 @@
package com.sw.inbound.utils //package com.sw.inbound.utils
//
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue //import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf //import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableLongStateOf //import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.mutableStateOf //import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember //import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope //import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue //import androidx.compose.runtime.setValue
import kotlinx.coroutines.CoroutineScope //import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job //import kotlinx.coroutines.Job
import kotlinx.coroutines.delay //import kotlinx.coroutines.delay
import kotlinx.coroutines.launch //import kotlinx.coroutines.launch
//
/** ///**
* Jetpack Compose 交互工具集 // * Jetpack Compose 交互工具集
* 包含快速点击过滤、防抖、节流、双击检测、长按检测等功能 // * 包含快速点击过滤、防抖、节流、双击检测、长按检测等功能
*/ // */
object InteractionUtils { //object InteractionUtils {
//
// ======================== 点击过滤 ======================== // // ======================== 点击过滤 ========================
//
/** // /**
* 快速点击过滤器 // * 快速点击过滤器
* @param minInterval 最小点击间隔时间(毫秒),默认500ms // * @param minInterval 最小点击间隔时间(毫秒),默认500ms
*/ // */
class ClickFilter(private val minInterval: Long = 500L) { // class ClickFilter(private val minInterval: Long = 500L) {
private var lastClickTime: Long = 0 // private var lastClickTime: Long = 0
//
/** // /**
* 处理点击事件 // * 处理点击事件
* @return Boolean 是否允许此次点击(true=允许,false=拦截) // * @return Boolean 是否允许此次点击(true=允许,false=拦截)
*/ // */
fun processClick(): Boolean { // fun processClick(): Boolean {
val currentTime = System.currentTimeMillis() // val currentTime = System.currentTimeMillis()
return if (currentTime - lastClickTime > minInterval) { // return if (currentTime - lastClickTime > minInterval) {
lastClickTime = currentTime // lastClickTime = currentTime
true // true
} else { // } else {
false // false
} // }
} // }
//
/** // /**
* 处理点击事件(带回调) // * 处理点击事件(带回调)
*/ // */
fun processClick(block: () -> Unit) { // fun processClick(block: () -> Unit) {
if (processClick()) { // if (processClick()) {
block() // block()
} // }
} // }
} // }
//
/** // /**
* 记住点击过滤器 // * 记住点击过滤器
*/ // */
@Composable // @Composable
fun rememberClickFilter(minInterval: Long = 500L): ClickFilter { // fun rememberClickFilter(minInterval: Long = 500L): ClickFilter {
return remember { ClickFilter(minInterval) } // return remember { ClickFilter(minInterval) }
} // }
//
// ======================== 防抖处理 ======================== // // ======================== 防抖处理 ========================
//
/** // /**
* 防抖工具类 // * 防抖工具类
* @param delayMillis 防抖延迟时间(毫秒) // * @param delayMillis 防抖延迟时间(毫秒)
*/ // */
class Debouncer(private val delayMillis: Long) { // class Debouncer(private val delayMillis: Long) {
private var lastActionTime = 0L // private var lastActionTime = 0L
//
/** // /**
* 执行防抖操作 // * 执行防抖操作
* @param block 要执行的代码块 // * @param block 要执行的代码块
* @return Boolean 是否实际执行了操作 // * @return Boolean 是否实际执行了操作
*/ // */
fun debounce(block: () -> Unit): Boolean { // fun debounce(block: () -> Unit): Boolean {
val currentTime = System.currentTimeMillis() // val currentTime = System.currentTimeMillis()
if (currentTime - lastActionTime >= delayMillis) { // if (currentTime - lastActionTime >= delayMillis) {
lastActionTime = currentTime // lastActionTime = currentTime
block() // block()
return true // return true
} // }
return false // return false
} // }
} // }
// ======================== 双击检测 ======================== // // ======================== 双击检测 ========================
//
/** // /**
* 双击检测器 // * 双击检测器
*/ // */
class DoubleClickDetector( // class DoubleClickDetector(
private val timeout: Long = 500L, // private val timeout: Long = 500L,
private val onSingleClick: () -> Unit = {}, // private val onSingleClick: () -> Unit = {},
private val onDoubleClick: () -> Unit // private val onDoubleClick: () -> Unit
) { // ) {
private var clickCount by mutableIntStateOf(0) // private var clickCount by mutableIntStateOf(0)
private var lastClickTime by mutableLongStateOf(0L) // private var lastClickTime by mutableLongStateOf(0L)
//
/** // /**
* 处理点击事件 // * 处理点击事件
*/ // */
fun processClick(coroutineScope: CoroutineScope) { // fun processClick(coroutineScope: CoroutineScope) {
val currentTime = System.currentTimeMillis() // val currentTime = System.currentTimeMillis()
if (currentTime - lastClickTime < timeout) { // if (currentTime - lastClickTime < timeout) {
clickCount++ // clickCount++
if (clickCount == 2) { // if (clickCount == 2) {
onDoubleClick() // onDoubleClick()
clickCount = 0 // clickCount = 0
} // }
} else { // } else {
clickCount = 1 // clickCount = 1
coroutineScope.launch { // coroutineScope.launch {
delay(timeout) // delay(timeout)
if (clickCount == 1) { // if (clickCount == 1) {
onSingleClick() // onSingleClick()
} // }
clickCount = 0 // clickCount = 0
} // }
} // }
lastClickTime = currentTime // lastClickTime = currentTime
} // }
} // }
//
/** // /**
* 记住双击检测器 // * 记住双击检测器
*/ // */
@Composable // @Composable
fun rememberDoubleClickDetector( // fun rememberDoubleClickDetector(
timeout: Long = 300L, // timeout: Long = 300L,
onSingleClick: () -> Unit = {}, // onSingleClick: () -> Unit = {},
onDoubleClick: () -> Unit // onDoubleClick: () -> Unit
): () -> Unit { // ): () -> Unit {
val detector = remember { DoubleClickDetector(timeout, onSingleClick, onDoubleClick) } // val detector = remember { DoubleClickDetector(timeout, onSingleClick, onDoubleClick) }
val scope = rememberCoroutineScope() // val scope = rememberCoroutineScope()
//
return { // return {
detector.processClick(scope) // detector.processClick(scope)
} // }
} // }
//
// ======================== 长按检测 ======================== // // ======================== 长按检测 ========================
//
/** // /**
* 长按检测器 // * 长按检测器
*/ // */
class LongPressDetector( // class LongPressDetector(
private val delay: Long = 1000L, // private val delay: Long = 1000L,
private val onLongPress: () -> Unit, // private val onLongPress: () -> Unit,
private val onClick: () -> Unit = {} // private val onClick: () -> Unit = {}
) { // ) {
private var pressJob: Job? = null // private var pressJob: Job? = null
//
/** // /**
* 处理按压事件 // * 处理按压事件
*/ // */
fun handlePress(coroutineScope: CoroutineScope) { // fun handlePress(coroutineScope: CoroutineScope) {
pressJob = coroutineScope.launch { // pressJob = coroutineScope.launch {
delay(delay) // delay(delay)
onLongPress() // onLongPress()
} // }
} // }
//
/** // /**
* 处理释放事件 // * 处理释放事件
*/ // */
fun handleRelease() { // fun handleRelease() {
pressJob?.cancel() // pressJob?.cancel()
pressJob = null // pressJob = null
onClick() // onClick()
} // }
} // }
//
/** // /**
* 记住长按检测器 // * 记住长按检测器
*/ // */
@Composable // @Composable
fun rememberLongPressDetector( // fun rememberLongPressDetector(
delay: Long = 1000L, // delay: Long = 1000L,
onLongPress: () -> Unit, // onLongPress: () -> Unit,
onClick: () -> Unit = {} // onClick: () -> Unit = {}
): Pair<() -> Unit, () -> Unit> { // ): Pair<() -> Unit, () -> Unit> {
val detector = remember { LongPressDetector(delay, onLongPress, onClick) } // val detector = remember { LongPressDetector(delay, onLongPress, onClick) }
val scope = rememberCoroutineScope() // val scope = rememberCoroutineScope()
//
return Pair( // return Pair(
first = { detector.handlePress(scope) }, // first = { detector.handlePress(scope) },
second = { detector.handleRelease() } // second = { detector.handleRelease() }
) // )
} // }
//
// ======================== 组合工具 ======================== // // ======================== 组合工具 ========================
//
/** // /**
* 带状态的按钮控制器 // * 带状态的按钮控制器
*/ // */
class StatefulButtonController { // class StatefulButtonController {
var isLoading by mutableStateOf(false) // var isLoading by mutableStateOf(false)
private val clickFilter = ClickFilter() // private val clickFilter = ClickFilter()
//
/** // /**
* 处理按钮点击 // * 处理按钮点击
*/ // */
suspend fun handleClick(block: suspend () -> Unit) { // suspend fun handleClick(block: suspend () -> Unit) {
if (clickFilter.processClick()) { // if (clickFilter.processClick()) {
isLoading = true // isLoading = true
try { // try {
block() // block()
} finally { // } finally {
isLoading = false // isLoading = false
} // }
} // }
} // }
} // }
//
/** // /**
* 记住带状态的按钮控制器 // * 记住带状态的按钮控制器
*/ // */
@Composable // @Composable
fun rememberStatefulButtonController(): StatefulButtonController { // fun rememberStatefulButtonController(): StatefulButtonController {
return remember { StatefulButtonController() } // return remember { StatefulButtonController() }
} // }
} //}
@@ -5,9 +5,9 @@ import android.net.Uri
import androidx.camera.core.ImageCapture import androidx.camera.core.ImageCapture
import androidx.camera.core.ImageCaptureException import androidx.camera.core.ImageCaptureException
import androidx.camera.view.CameraController import androidx.camera.view.CameraController
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember //import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext //import androidx.compose.ui.platform.LocalContext
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import timber.log.Timber import timber.log.Timber
import java.io.File import java.io.File
@@ -101,21 +101,21 @@ class PhotoCaptureHelper(
* @param onError (String) -> Unit 拍照失败回调 * @param onError (String) -> Unit 拍照失败回调
* @return Pair<PhotoCaptureHelper, () -> Unit> 返回工具类实例和拍照函数 * @return Pair<PhotoCaptureHelper, () -> Unit> 返回工具类实例和拍照函数
*/ */
@Composable //@Composable
fun rememberPhotoCapture( //fun rememberPhotoCapture(
cameraController: CameraController, // cameraController: CameraController,
onSuccess: (Uri) -> Unit = {}, // onSuccess: (Uri) -> Unit = {},
onError: (String) -> Unit = {} // onError: (String) -> Unit = {}
): Pair<PhotoCaptureHelper, () -> Unit> { //): Pair<PhotoCaptureHelper, () -> Unit> {
val context = LocalContext.current // val context = LocalContext.current
val photoCaptureHelper = remember { // val photoCaptureHelper = remember {
PhotoCaptureHelper( // PhotoCaptureHelper(
context = context, // context = context,
cameraController = cameraController, // cameraController = cameraController,
onSuccess = onSuccess, // onSuccess = onSuccess,
onError = onError // onError = onError
) // )
} // }
//
return Pair(photoCaptureHelper) { photoCaptureHelper.takePhoto() } // return Pair(photoCaptureHelper) { photoCaptureHelper.takePhoto() }
} //}
@@ -1,56 +1,56 @@
package com.sw.inbound.utils //package com.sw.inbound.utils
//
import androidx.compose.foundation.background //import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box //import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize //import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding //import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape //import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Text //import androidx.compose.material3.Text
import androidx.compose.runtime.Composable //import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect //import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue //import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf //import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue //import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment //import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier //import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color //import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp //import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp //import androidx.compose.ui.unit.sp
import kotlinx.coroutines.delay //import kotlinx.coroutines.delay
//
object ToastUtils { //object ToastUtils {
private var show by mutableStateOf(false) // private var show by mutableStateOf(false)
private var message by mutableStateOf("") // private var message by mutableStateOf("")
//
fun showToast(msg: String) { // fun showToast(msg: String) {
message = msg // message = msg
show = true // show = true
// Toast.makeText(ContextUtils.getAppContext(), msg, Toast.LENGTH_LONG).show() //// Toast.makeText(ContextUtils.getAppContext(), msg, Toast.LENGTH_LONG).show()
} // }
//
@Composable // @Composable
fun ToastComposable() { // fun ToastComposable() {
if (show) { // if (show) {
LaunchedEffect(Unit) { // LaunchedEffect(Unit) {
delay(2000) // 自动2秒后消失 // delay(2000) // 自动2秒后消失
show = false // show = false
} // }
Box( // Box(
modifier = Modifier // modifier = Modifier
// .fillMaxWidth() //// .fillMaxWidth()
.fillMaxSize() // .fillMaxSize()
.padding(bottom = 156.dp), // .padding(bottom = 156.dp),
contentAlignment = Alignment.BottomCenter // contentAlignment = Alignment.BottomCenter
) { // ) {
Text( // Text(
text = message, // text = message,
modifier = Modifier // modifier = Modifier
.background(Color.Black.copy(alpha = 0.7f), RoundedCornerShape(8.dp)) // .background(Color.Black.copy(alpha = 0.7f), RoundedCornerShape(8.dp))
.padding(horizontal = 24.dp, vertical = 12.dp), // .padding(horizontal = 24.dp, vertical = 12.dp),
color = Color.White, // color = Color.White,
fontSize = 24.sp // fontSize = 24.sp
) // )
} // }
} // }
} // }
} //}
@@ -14,7 +14,7 @@ import com.sw.inbound.network.LoadingState
import com.sw.inbound.objbox.FoodModule import com.sw.inbound.objbox.FoodModule
import com.sw.inbound.repository.RemoteRepository import com.sw.inbound.repository.RemoteRepository
import com.sw.inbound.utils.SPUtil import com.sw.inbound.utils.SPUtil
import com.sw.inbound.utils.ToastUtils //import com.sw.inbound.utils.ToastUtils
import com.sw.inbound.utils.ext.toType import com.sw.inbound.utils.ext.toType
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@@ -113,7 +113,7 @@ abstract class BaseViewModel(
is HttpException -> "服务器错误: ${e.code()}" is HttpException -> "服务器错误: ${e.code()}"
else -> "操作失败: ${e.message}" else -> "操作失败: ${e.message}"
} }
ToastUtils.showToast(message) //ToastUtils.showToast(message)
} }
// fun startSensorScale() { // fun startSensorScale() {
@@ -6,7 +6,7 @@ import com.sw.inbound.model.response.EquipmentInfo
import com.sw.inbound.repository.RemoteRepository import com.sw.inbound.repository.RemoteRepository
import com.sw.inbound.utils.GsonUtils import com.sw.inbound.utils.GsonUtils
import com.sw.inbound.utils.SPUtil import com.sw.inbound.utils.SPUtil
import com.sw.inbound.utils.ToastUtils //import com.sw.inbound.utils.ToastUtils
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
@@ -45,7 +45,7 @@ class DeviceViewModel @Inject constructor(
Timber.e(e) Timber.e(e)
} }
} else { } else {
ToastUtils.showToast("获取设备信息失败") //ToastUtils.showToast("获取设备信息失败")
} }
} }
} }
@@ -1,8 +1,5 @@
package com.sw.inbound.viewmodel package com.sw.inbound.viewmodel
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import com.sw.inbound.GlobalData import com.sw.inbound.GlobalData
import com.sw.inbound.GlobalKey import com.sw.inbound.GlobalKey
import com.sw.inbound.model.request.LoginParam import com.sw.inbound.model.request.LoginParam