Kotlin Лямбда имеет нулевое значение после запуска - PullRequest
0 голосов
/ 14 января 2020

У меня есть два вида деятельности: Activity1 и Activity2.

Activity1.kt

class Activity1: AppCompatActivity {
   private val activity2 = Activity2()

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

       activity2.testLambda = {
            println("Should be called" + it)
        }
  }
} 

Activity2.kt

class Activity2: AppCompatActivity {
   var testLambda: ((String) -> Unit)? = null

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        testLambda?.invoke("Hello")
   }

}

activity2 был вызван нажатием кнопки в Activity1:

binding.button.setOnClickListener {
        val intent = Intent(this, Activity2::class.java)
        startActivity(intent)
}

По некоторым причинам, в Activity2, onCreate, testLambda равен null. Есть подсказки?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 14 января 2020

В Android классе, который расширяет AppCompatActivity, Activity или FragmentActivity или что-либо подобное, эти классы имеют жизненный цикл, отличный от типичных обычных классов, и вы не можете просто создать их экземпляры как

private val activity2 = Activity2()

Вы должны использовать намерения для создания экземпляров таких действий. больше информации здесь

Более того, для простоты В одно время только одно действие может быть в возобновленном состоянии и с ним можно взаимодействовать. Таким образом, вы не можете одновременно выполнять два действия в живом состоянии и передавать данные.

Есть несколько способов добиться того, что вы пытаетесь сделать, но это зависит от того, что именно вы хотите. объясните ваш вариант использования, и я обновлю ответ более подробно c ответ, но вот более широкие подходы, которые вы можете использовать.

1) Передача данных через намерения

2) Использование singleton т.е. Kotlin object классов

3) Совместно используемые модели ViewModel с использованием внедрения зависимостей (это намного сложнее, поэтому я бы не советовал это, если ты новичок)

1 голос
/ 14 января 2020

но ... это ноль

var testLambda: ((String) -> Unit)? = null

открытие Activity на Intent создаст новый экземпляр с новым testLambda

val intent = Intent(this, Activity2::class.java)
startActivity(intent)

testLambda isn ' t stati c field, поэтому оно будет нулевым ...

также: никогда не создавайте Activity, просто вызывая new Activity / constructor или любым другим "обычным" языковым способом (например, вы делаете в Activity1). всегда используйте Intent, передавайте данные через Bundle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...