Home > other >  Method setCurrentState must be called on the main thread, Android, Kotlin
Method setCurrentState must be called on the main thread, Android, Kotlin

Time:03-03

Android studio shows errors in the lines

REPOSITORY.insert(note){ onSuccess() }

in the "AddNewNoteFragmentViewModel" and in the lines

viewModel.insert(AppNote(name = name, text = text)){ view?.findNavController()?.navigate(R.id.action_addNewNoteFragment_to_mainFragment)}

in the file "AddNewNoteFragment"

I realized that the error is related to streams, but I do not know how to solve it

If anyone knows, please help, I could not find anything worthwhile on the Internet

AddNewNoteFragment

  package com.example.notes.fragments.add_new_note

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.findNavController
import com.example.notes.R
import com.example.notes.databinding.FragmentAddNewNoteBinding
import com.example.notes.model.AppNote
import com.example.notes.utilits.showToast


class AddNewNoteFragment : Fragment() {

    private var _binding: FragmentAddNewNoteBinding? = null
    val binding get() = _binding!!
    private lateinit var viewModel: AddNewNoteFragmentViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentAddNewNoteBinding.inflate(inflater, container, false)
        val view = binding.root
        return view

    }


    override fun onStart() {
        super.onStart()
        initialization()
    }

    private fun initialization() {
        viewModel = ViewModelProvider(this).get(AddNewNoteFragmentViewModel::class.java)

        binding.buttonAddNote.setOnClickListener {

            val name = binding.inputNameNote.text.toString()
            val text = binding.inputTextNote.text.toString()

            if (name.isEmpty()){

                showToast("Введите имя заметки")

            } else{

                viewModel.insert(AppNote(name = name, text = text)){
                    view?.findNavController()?.navigate(R.id.action_addNewNoteFragment_to_mainFragment)
                }

            }

        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

AddNewNoteFragmentViewModel

package com.example.notes.fragments.add_new_note

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.example.notes.model.AppNote
import com.example.notes.utilits.REPOSITORY
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class AddNewNoteFragmentViewModel(application: Application): AndroidViewModel(application) {

    fun insert(note: AppNote,onSuccess:()-> Unit) =
        viewModelScope.launch (Dispatchers.IO){
            REPOSITORY.insert(note){
                onSuccess()
            }
        }

}

Error screen

enter image description here

CodePudding user response:

They asked me to show the code of my repository AppRoomRepository

package com.example.notes.room

import androidx.lifecycle.LiveData
import com.example.notes.database.DataBaseRepository
import com.example.notes.model.AppNote

class AppRoomRepository(private val appRoomDao: AppRoomDao):DataBaseRepository {
    override val allNotes: LiveData<List<AppNote>>
        get() = appRoomDao.getAllNotes()

    override suspend fun insert(note: AppNote, onSuccess: () -> Unit) {
       appRoomDao.insert(note)
        onSuccess()
    }

    override suspend fun dalete(note: AppNote, onSuccess: () -> Unit) {
        appRoomDao.delete(note)
        onSuccess()
    }
}

CodePudding user response:

Problem solved In AddNewNoteFragmentViewModel requires Dispatchers.IO to be changed to Dispatchers.Main

  • Related