У меня есть эта ViewModel.
Код: Выделить всё
@HiltViewModel
class PaymentFlowViewModel @Inject constructor() : ViewModel() {
private val _amount = MutableLiveData()
val amount: LiveData = _amount
fun setAmount(newAmount: String) {
_amount.value = newAmount
}
}
Код: Выделить всё
@AndroidEntryPoint
class PaymentActivity : ComponentActivity() {
private val viewModel: PaymentFlowViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val amount = intent.getStringExtra("amountKey")
viewModel.setAmount(amount ?: "0000")
setContent {
M3ComponentsTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
PaymentFlow()
}
}
}
}
}
Код: Выделить всё
@Composable
fun PaymentFlow() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "SelectPaymentType") {
composable("SelectPaymentType") { SelectPaymentTypeScreen(navController) }
composable("cardReader") { CardProcessScreen(navController) }
}
}
На этом экране у меня есть вот такая ViewModel.
Код: Выделить всё
@Composable
fun SelectPaymentTypeScreen(
navController: NavController,
paymentViewModel: PaymentFlowViewModel = hiltViewModel()
) {
val context = LocalContext.current
val activity = if (context is Activity) context else null
val amount = paymentViewModel.amount.value
Я кое-что тестировал, если я использую в действии SelectPaymentTypeScreen() можно компоновать БЕЗ перехода к PaymentFlow(), он работает отлично. Я не знаю, как заставить его работать с навигацией PaymentFlow().
Может быть, я смогу передать viewModel в аргументах PaymentFlow, но если я не ошибаюсь, это одно из преимуществ используя HILT, а не повторяя передачу аргументов.
Подробнее здесь: https://stackoverflow.com/questions/775 ... composable