0

Делал тест в приложении, и возникла такая ситуация, что при добавлении факта того, что тест был пройден без ошибок в базу данных, у меня моментально переключается фрагмент на главный. Помогите, пожалуйста, как сделать, чтобы данной смены не происходило.

Код фрагмента, который появляется после прохождения теста:

package com.example.firstapp.Fragments

class TestResultFrag : Fragment() { lateinit var binding: FragmentTestResultBinding val lifeData:LifeData by activityViewModels() private val dynamicObjects:DynamicObjects by activityViewModels() val transition: Transition by activityViewModels() private lateinit var mAccountViewModel: AccountViewModel lateinit var mAccountTestViewModel: AccountTestViewModel lateinit var testId: String

override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { val score = lifeData.testScore.value val qAmountStr = dynamicObjects.dynamicTest.value!!.qAmount val qAmountInt = qAmountStr.substring(0,qAmountStr.indexOf(" ")).toInt()

binding = FragmentTestResultBinding.inflate(inflater)
mAccountViewModel = ViewModelProvider(this).get(AccountViewModel::class.java)
mAccountTestViewModel = ViewModelProvider(this).get(AccountTestViewModel::class.java)
testId = dynamicObjects.dynamicTest.value!!.Num.toString()

val accId: Int = lifeData.account.value!!.id
val data = mAccountTestViewModel.checkTestState(accId,testId)

if (score == qAmountInt) {
    data.asLiveData().observe(activity as LifecycleOwner){
        if (it == null) {
            insertTestToDatabase(accId, testId)
            updateProgress()
        }
    }

}
binding.txtResultScore.text = getString(
    R.string.result_score,
    score,
    qAmountInt
)


return binding.root

}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

binding.btTryAgain.setOnClickListener {
    transition.goAgain.value = true
}

binding.btQuit.setOnClickListener{
    transition.goToTests.value = true
}

}

private fun insertTestToDatabase(accountId:Int, testId:String){ val accTest = AccountTestIsPass(accountId, testId,true) mAccountTestViewModel.addAccountTest(accTest) Toast.makeText(requireContext(),"Тест пройден", Toast.LENGTH_LONG).show() }

private fun updateProgress(){ val accId = lifeData.account.value!!.id val firstName = lifeData.account.value!!.firstName val lastName = lifeData.account.value!!.lastName val phone = lifeData.account.value!!.phone val email = lifeData.account.value!!.email val password = lifeData.account.value!!.password val progress = lifeData.account.value!!.progress + 10f

val account = Account(accId,firstName,lastName,email, password, phone, progress)

mAccountViewModel.updateAccount(account)

}

companion object {

fun newInstance() =
    TestResultFrag()

} }

Но когда тест пройден не полностью верно, то все хорошо, получается проблема кроется в данных строчках?

if (it == null) {
   insertTestToDatabase(accId, testId)
   updateProgress()
}

Но как решить данную трудность я не могу додуматься.

Как выглядит Дао класс:

  @Insert(onConflict = OnConflictStrategy.IGNORE)
  suspend fun addPassedTest(TestIsPassed: AccountTestIsPass)
}

Репозиторий:

 suspend fun addPassedTest(TestIsPass:AccountTestIsPass){
        accountTestDao.addPassedTest(TestIsPass)
    }
}

Viewmodel:

fun addAccountTest(accountTest: AccountTestIsPass) {
    viewModelScope.launch(Dispatchers.IO) {
        repository.addPassedTest(accountTest)
        }
    }
}
MipZ
  • 3
  • А где в приведенном коде происходит переключение между фрагментами? Похоже, что этого кода нет в вопросе. Если вы считаете, что проблема заключается в неправильном переходе между фрагментами, то стоит показать этот код, где такой переход реализован. – Vadik Sirekanyan May 27 '23 at 22:05
  • Суть в том, что когда insertTestToDatabase заканчивает свое выполнение меня почему то перекидывает на главный фрагмент, чего по сути не должно происходить. И как сделать, чтобы при выполнении данного метода программа не "своевольничала" я не понимаю. – MipZ May 29 '23 at 21:30
  • У вас там много небезопасных операторов !!. Возможно, приложение падает и перезапускается? Посмотрите, есть ли у вас в logcat логи упавшего процесса и его стектрейс? – Vadik Sirekanyan May 29 '23 at 21:54
  • Нет, насколько могу судить приложение не падает. И пока смотрел понял одну вещь, что возвращает меня не на главный фрагмент, а на обычный (просто весь ход разработки он был главным, а под конец появилось ещё один, который отобрал у него главенство) – MipZ May 30 '23 at 00:41
  • Щас заметил, что insertTestToDatabase не добавляет новые данные в таблицу. – MipZ May 30 '23 at 01:06

0 Answers0