Неразрешенная ошибка ссылки при использовании viewLifecycleOwner

#android-studio #kotlin #android-databinding #android-lifecycle

#android-studio #kotlin #android-привязка данных #android-жизненный цикл

Вопрос:

У меня возникла ошибка при использовании Observer и viewLifecycleOwner в моем проекте Android. Он выдает ошибку «Неразрешенная ссылка: viewLifecycleOwner», и я понятия не имею, почему. Я подтвердил, что у меня есть импорт

 import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
 

И зависимость:

 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
 

Я попытался аннулировать кеши / перезапустить … решение найдено в GitHub. Но ошибка сохраняется. Спасибо всем, кто может мне помочь.

 class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: DrinkViewModel

    // Contains all the views
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        // Use Data Binding to get reference to the views
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        binding.drinkButton.setOnClickListener {
            onDrinkClicked()
        }

        viewModel.revenue.observe(viewLifecycleOwner, Observer { newRevenue ->
            binding.revenueText.text = newRevenue.toString()
        })

        viewModel.drinksSold.observe(viewLifecycleOwner, Observer { newAmount ->
            binding.amountSoldText.text = newAmount.toString()
        })
        binding.drinkButton.setImageResource(viewModel.currentDrink.value!!.imageId)
    }
}
 

Ответ №1:

getViewLifecycleOwner() — это метод для представления жизненного цикла фрагмента. Вы не можете вызвать его из области действия. Вы можете просто использовать this или, если вы знакомы с сопрограммами, вы можете использовать lifeCycleScope .

Комментарии:

1. Спасибо, мне пришло в голову, что это связано с тем, что реализация не выполняется во фрагменте. Я попробую использовать «Это», поскольку я еще не знаком с сопрограммами.