【问题标题】:How do I return an array instead of a task?如何返回数组而不是任务?
【发布时间】:2021-08-17 20:01:03
【问题描述】:

在我的 ActivitySignup 中,我想调用 createUser 函数(来自我的 Firestore 类)。我希望createUserresultmessage 返回到ActivitySignup。这将使我的 ActivitySignup 非常干净。我该怎么做?

ActivitySignup:

class ActivitySignup : AppCompatActivity() {

    private lateinit var user: String
    private lateinit var userEditTxt: EditText
    private lateinit var email: String
    private lateinit var emailEditTxt: EditText
    private lateinit var password: String
    private lateinit var passwordEditTxt: EditText
    private lateinit var backbutton: Button
    private lateinit var terms: CheckBox
    private lateinit var submitbutton: Button
    private lateinit var auth: FirebaseAuth
    private lateinit var currentDateTime: DateTime
    private val tag: String = "ActivitySignup"
    private lateinit var functions: FirebaseFunctions
    private lateinit var fs: FS

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

        fs = FS()

        submitbutton = findViewById(R.id.btn_submit)

        submitbutton.setOnClickListener() {
            Log.e(tag,"Clicked submit")

            userEditTxt = findViewById(R.id.et_user)
            user = userEditTxt.text.toString().trim()
            emailEditTxt = findViewById(R.id.et_email)
            email = emailEditTxt.text.toString().trim()
            passwordEditTxt = findViewById(R.id.et_password)
            password = passwordEditTxt.text.toString().trim()

            if (user.isNotEmpty() && email.isNotEmpty() && password.isNotEmpty()) {
//                fs.createUser(user, email, password)
//                    .continueWith { task ->
//                        if (task.isSuccessful) {
//                            Log.e(tag, "createUser task succeeded")
////                            Log.e(tag, "Result1: ${task.result?.get("result")}") //case sensitive
////                            Log.e(tag, "Result2: ${task.result. ("message")}") //case sensitive
//
//                            val taskResult = task.result //.get("result")
//                            val result = taskResult.getData
//                            val message = task.result?.get("message")
//
//                            val intent = Intent(this, ActivityGroups::class.java)
//                            startActivity(intent)
//                            finish()
//                        } else {
//                            Log.e(tag, "createUser task failed")
//                        }
//                    }
                var returnResult = fs.createUser(user, email, password)
                Log.e(tag, "returnResult[0]: ${returnResult[0]}")
                Log.e(tag, "returnResult[1]: ${returnResult[1]}")
                //Code continues only if result = 1...


            }

        }

    }

}

FS.createUser():

fun createUser(user: String, email: String, password: String): Array<String> {
        Log.e(tag, "createUser()")
        val functions = Firebase.functions
        val auth = Firebase.auth
        var result: String
        var message: String

        auth.createUserWithEmailAndPassword(email, password)
            .continueWith() { task ->
                if (task.isSuccessful) {
                    Log.e(tag, "auth.createUserWithEmailAndPassword() successful")

                    var data = hashMapOf<String, String>()
                    data["user"] = user
                    data["email"] = email

                    functions.getHttpsCallable("createUser").call(data)
                        .continueWith() { task ->
                            if (task.isSuccessful) {
                                Log.e(tag, "CF_createUser task was successful")
                                Log.e(tag, "CF_createUser: ${task.result?.data.toString()}")
                                var returnData = task.result?.data.toString()
                                result = returnData[0].toString()
                                message = returnData[1].toString()
                                
                            } else {
                                Log.e(tag, "CF_createUser task failed")
                                Log.e(tag, "CF_createUser exception message: ${task.exception?.message}")
                                Log.e(tag, "CF_createUser exception localizedMessage: ${task.exception?.localizedMessage}")
                            }
                        }
                } else {
                    Log.e(tag, "auth.createUserWithEmailAndPassword() failed")
                    Log.e(tag, "authTask exception: ${task.exception.toString()}")
                }

            }
        return arrayOf(result, message)
    }

【问题讨论】:

  • 你得到的错误是不言自明的,因为你没有给结果参数任何初始值。您可以采取的不同操作是将回调方法传递给您的 createUser 函数并使其接受两个参数,结果和消息。
  • @tomerpacific 我应该提到我是初学者。不确定我是否理解您的建议。

标签: java android kotlin google-cloud-functions task


【解决方案1】:

如果你看这里:

val functions = Firebase.functions
val auth = Firebase.auth
var result: String
var message: String

与 function 和 auth 不同,result 和 message 不是用值初始化的(即它们没有值)。您可以使用如下初始值初始化它们:

var result: String = ""
var message: String = ""

late-initialize他们像这样:

lateinit var result: String
lateinit var message: String

这意味着这些 var 将在您的代码处理过程中获得一个值。

更新问题的更新:

auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                //Call your cloud function here
                //If Cloud functions returns desired response, proceed
                return arrayOf(result, message)
            }
        }

【讨论】:

  • 如果我执行您的第一种方法,FS.createUser() 会将空字符串传回给 ActivitySignup,但这是不对的,因为它应该传回 result = "1"。我的问题基本上是关于范围的。如何使用任务填充变量,然后将该变量传递回 ActivitySignup?
  • 你所要做的就是在返回中添加1,你应该能够适应他的建议,不是吗?澄清一下,1 不是此过程的标准返回类型。
  • @DIGIByte 我想返回来自后端云功能的resultmessage。我不想硬编码 1,我想运行 auth.createUserWithEmailAndPassword,如果成功则运行返回 resultmessage 的 createUser 云函数。我希望将这些值(无论它们是什么)提供给 ActivitySignup,以便 ActivitySignup 上的代码非常干净。
  • 成功创建没有结果或消息,它只是让您登录。它只返回失败消息
  • @DIGIByte resultmessage 来自自定义后端云功能。如果 auth.createUserWithEmailAndPassword 成功 -> 运行返回 resultmessage 的自定义后端云函数 -> 如果 result = 1...其余代码。
猜你喜欢
  • 2017-04-08
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多