ViewModel, LiveData с Firestore, вызывающим StackOverflowError: размер стека 8 МБ - PullRequest
0 голосов
/ 25 мая 2020

Я получаю коллекцию из firestore и отображаю ее в recyclerview. Коллекция небольшая, всего 2 документа с текстом менее 10 символов. Когда я показываю его в recylcerview без использования шаблонов проектирования архитектуры, он работает нормально, но если я реализую его с помощью viewmodel и livdedata, я получаю ошибку размера стека 8 МБ и app cra sh. Я искал в течение дня и не нашел ничего подходящего.

fetchNotes () вызывается неоднократно, и журналы в addOnSuccessListener () не попадают.

Я добавлю репозиторий, как только это сработает.

class HomeActivity : AppCompatActivity() {
private val fab by lazy { findViewById<FloatingActionButton>(R.id.floatingActionButton) }
private val homeAdapter by lazy { HomeAdapter(ArrayList<Note>(),this) }
private val homeRecylerView by lazy {  findViewById<RecyclerView>(R.id.homerecyclerview)}
private val homeViewModel: HomeViewModel by viewModels()

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_home)
    initUI()
    initRecyclerView()
    initViewModel()


}

 private fun initViewModel() {
    homeViewModel.getNotes().observe(this, Observer<List<Note>> { notes ->
        homeAdapter.notes = notes
        homeAdapter.notifyDataSetChanged()
    })

}

class HomeViewModel : ViewModel() {
var tempList:MutableList<Note> =   mutableListOf()
fun getNotes(): LiveData<List<Note>> {
    return notes
}

private val notes: MutableLiveData<List<Note>> by lazy {
    MutableLiveData<List<Note>>().also {
        fetchNotes()
    }
}

fun fetchNotes(): MutableLiveData<List<Note>> {

     FirebaseUtils.db().collection("notes").document(
          FirebaseUtils.auth().currentUser!!.uid
      )
          .collection("usernotes")
          .get()
          .addOnSuccessListener { documents ->
              for (document in documents) {
                  tempList.add(document.toObject(Note::class.java))

              }
              notes.setValue(tempList)
          }
          .addOnFailureListener { exception ->


          }

    return notes
}

1 Ответ

0 голосов
/ 29 августа 2020

Я понял это из-за рекурсии, так как я не знаком с живыми данными. Я исправил это как

 val notes: MutableLiveData<List<Note>> by lazy {
        MutableLiveData<List<Note>>()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...