kotlin 如何访问函数外部的变量

zazmityj  于 2023-08-06  发布在  Kotlin
关注(0)|答案(2)|浏览(145)

我想访问函数外的变量numOfPlayers,并将其值分配给同一个类中的变量numberOfTotalPlayers,但我无法在那里访问它,我如何才能做到这一点?请忽略我的代码格式和额外的代码,我只是试图使其可行。
这几乎是完整的代码…

package com.example.zccscores

import android.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.example.zccscores.databinding.ActivityMainBinding
import com.google.firebase.firestore.FirebaseFirestore
import android.content.SharedPreferences
import android.util.Log
import android.widget.EditText

class MainActivity : AppCompatActivity() {
    private lateinit var playerName: String
    private lateinit var binding: ActivityMainBinding
    private lateinit var db: FirebaseFirestore
    private lateinit var sharedPreferences: SharedPreferences
    private var TotalScores: Long = 0
**    private var numberofTotalPlayers: Int = noOfPlayers
**

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        db = FirebaseFirestore.getInstance()
        sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE)

        noOfPlayers()
        for (i in 0 until numberofTotalPlayers) {
            showCustomDialog()
        }

        binding.fourBTN.setOnClickListener {
            TotalScores += 4
        }

        binding.sixBTN.setOnClickListener {
            TotalScores += 6
        }
        binding.singleBTN.setOnClickListener {
            TotalScores += 1
        }

    }
    private fun noOfPlayers() {
        val dialogView = layoutInflater.inflate(R.layout.dialog_with_edittext, null)
**        val numOfPlayers = dialogView.findViewById<EditText>(R.id.dialogEditText)
**
        numOfPlayers.inputType = android.text.InputType.TYPE_CLASS_PHONE
        val builder = AlertDialog.Builder(this)
            .setView(dialogView)
            .setPositiveButton("OK") { dialog, _ ->
                // Handle OK button click and retrieve the text from the EditText
                numberofTotalPlayers = numOfPlayers.text.toString().toInt()

                dialog.dismiss() // Dismiss the dialog after handling button click
            }
            .setNegativeButton("Cancel") { dialog, _ ->
                // Handle Cancel button click if needed
                Toast.makeText(this, "Cancel clicked", Toast.LENGTH_SHORT).show()
                dialog.dismiss() // Dismiss the dialog after handling button click
            }

        val dialog = builder.create()
        dialog.show()
    }

    private fun showCustomDialog() {
        val dialogView = layoutInflater.inflate(R.layout.dialog_with_edittext, null)
        val dialogEditText = dialogView.findViewById<EditText>(R.id.dialogEditText)
        val builder = AlertDialog.Builder(this)
            .setView(dialogView)
            .setPositiveButton("OK") { dialog, _ ->
                // Handle OK button click and retrieve the text from the EditText
                val diologeFetchedPlayerName = dialogEditText.text.toString()
                if (diologeFetchedPlayerName.isNotBlank()) {

                    val playerData = Scores(232, diologeFetchedPlayerName, 89)

                    db.collection("ZCC Scores").document(diologeFetchedPlayerName).set(playerData)
                        .addOnSuccessListener {
                            binding.firstPlayerScores.text = playerData.toString()
                            Toast.makeText(
                                this,
                                "Player data saved from diologue",
                                Toast.LENGTH_SHORT
                            ).show()

                        }.addOnFailureListener {
                            Toast.makeText(this, "ERROR", Toast.LENGTH_SHORT).show()

                        }

                    binding.firstPlayerTV.text =diologeFetchedPlayerName
                       
                    Toast.makeText(this, "Player name saved", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(this, "Please enter a valid player name", Toast.LENGTH_SHORT)
                        .show()
                }
                dialog.dismiss() // Dismiss the dialog after handling button click
            }
            .setNegativeButton("Cancel") { dialog, _ ->
                // Handle Cancel button click if needed
                Toast.makeText(this, "Cancel clicked", Toast.LENGTH_SHORT).show()
                dialog.dismiss() // Dismiss the dialog after handling button click
            }

        val dialog = builder.create()
        dialog.show()
    }

}

字符串
中的函数外访问该变量

val numberOfTotalPlayers:Int = noOfPlayers //Getting error here
}```

wgmfuz8q

wgmfuz8q1#

你不能访问它--它的作用域是那个函数。它只在该函数执行时存在,并且每次执行该函数时都存在它的不同副本。因此,“进入”函数并提取变量值在逻辑上是没有意义的。每次调用该函数时,它都可能不同,或者该函数可能永远不会被调用。
此外,numberofTotalPlayers: Int属性在构造类时初始化,这是在调用onCreate()之前。此时,您的EditText甚至还不存在。
即使有,如果您在创建EditText之后立即初始化属性,则其中还没有文本。一个属性的初始化器只被调用一次,当类被构造的时候。
您需要重新考虑这个类的设计,并关注代码的执行顺序。现在,看起来您正在尝试立即提示用户输入多个玩家,然后尝试立即创建与玩家一样多的对话框。您不能这样做,因为用户输入的数字直到他们输入并关闭对话框之后才可用,这将在onCreate()完成之后很久才发生。另外,打开4个对话框立即在对方的顶部将是一个大混乱。我不知道你到底想做什么,但你可能需要使用 * 状态机设计模式 * 来实现这一点(你可以查一下)。

mwngjboj

mwngjboj2#

java/Kotlin中的变量根据它们声明的上下文进行评分。如果你在一个方法中声明了一个变量,你只能从这个方法中访问它。这样做的好处是,一个类中声明一个变量的两个方法可以使用相同的名称,但它仍然是两个不同的变量。

要从一个类内部的不同方法中获取一个变量,可以在类级别定义,然后使用this.noOfPlayers引用。它现在在该类的同一对象上操作的所有方法之间共享。
如果你想在不同的对象之间共享它,你通常会为该变量声明getter和setter。**EDIT:**或者对于Kotlin,可见性修饰符(默认为public)

相关问题