Как инициализировать объект и получить доступ к его значениям из разных методов - Kotlin

Я новичок в Android. Я не могу понять этого. Я хочу создать объект, доступный из двух разных функций. Вот объект:

class Person(var firstName: String = "", var lastName: String = "", var order: List<Orders> )
class Order(var orderId: String = "", var orderTitle: String = "")

Затем в действии:

class MainActivity : AppCompatActivity(){
     override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)

     
     var order: Order()
     var person: Person(order) //I am sure I am not doing this right
}

fun Function1(){
    person.order[1].orderTitle = "New Order" //to update order title
}

fun Function2(){
   // to read new order title  
    var newOrderTitle = person.order[1].orderTitle
}
}

В чем проблема? С чем у вас проблемы?

David Wasser 07.04.2021 21:13
1
1
29
2

Ответы 2

Вы создали свой экземпляр Person как локальную переменную внутри функции onCreate(), поэтому он доступен только внутри функции onCreate(). Чтобы сделать его доступным для других ваших функций, он должен быть членом свойства класса (определенным вне любых функций). Вам также необходимо использовать символ = для установки начального значения. Символ : предназначен для объявления типа свойства или переменной и в большинстве случаев является необязательным.

Кстати, в Kotlin принято всегда начинать имена функций со строчной буквы, чтобы их было легко отличить от конструкторов. (Это отличается от таких языков, как C#, где ключевое слово new делает вызов конструктора очевидным.)

class MainActivity : AppCompatActivity(){

    var order = Order()
    var person = Person(order)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun function1(){
        person.order[1].orderTitle = "New Order" //to update order title
    }

    fun function2(){
       // to read new order title  
        var newOrderTitle = person.order[1].orderTitle
    }
}

Помимо того, что @ TenFour04 говорит о том, что переменные становятся видимыми для функций, есть пара проблем с тем, как вы создаете свой объект Person.

Во-первых, вы используете значения по умолчанию для всего, поэтому вам не нужно передавать значение для каждого параметра, верно? Вот так можно вызвать в Order(), не предоставляя никаких других данных. Но если вы находятся передаете данные, как в случае с вашим вызовом Person(order), вам нужно указать ему, какой параметр вы передаете, используя именованный аргумент:

Person(order = order)

использование того же имени для переменной, которую вы передаете, и имени аргумента, возможно, делает ее более запутанной, но вы конкретно говорите «аргумент с именем order, вот его значение».

Вы можете передавать аргументы без имен, но вы должны предоставлять их в том порядке, в котором они объявлены - так, 1-й аргумент (String), 1-й аргумент а также 2-й, или 1-й, 2-й а также 3-й. Поскольку вы хотите сразу перейти к третьему аргументу, вам нужно явно назвать его.


Вторая проблема заключается в том, что тип вашего третьего аргумента не Order, это List заказов. Вы не можете просто передать один - поэтому вам нужно обернуть его списком:

Person(order = listOf(order))

это все, что вам нужно сделать!


Третья проблема заключается в том, что вы на самом деле написали тип как List<Orders> (извините за форматирование). Тип - Order, поэтому мы говорим List<Order>, потому что это список, содержащий объекты типа Order. Вы можете использовать множественное число в именах переменных (например, val listOfOrders: List<Order>)

Другие вопросы по теме