0

我正在一个使用 Unity 和 Firebase 的学校项目中工作,我需要在文本框中显示当前用户的用户名。

我已经从 Firebase 获取数据,但是当我尝试将 userNameText 的文本设置为它时,没有任何反应。

这是我的代码:

变量:

private DatabaseReference reference;
private string userName;
public Text userNameText; 

初始化:

void Start()
    {
        //database reference (I'm hiding the project id)
        FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://projectID.firebaseio.com/");

        // Get the root reference location of the database.
        reference = FirebaseDatabase.DefaultInstance.RootReference;

        GetUserData();
    }

获取用户数据():

public void GetUserData()
    {
        reference.Child("users").Child(PlayerPrefs.GetString("userUID")).GetValueAsync().ContinueWith(task =>
        {
            if (task.IsFaulted)
            {
                Debug.Log("something was wrong");
            }
            else if (task.IsCompleted)
            {
                Dictionary<string, object> results = (Dictionary<string, object>)task.Result.Value;
                userName= (string)results["userName"];
                Debug.Log(userName);
                userNameText.text = userName;
            }
        });
    }

当我运行项目时,它只是在控制台中显示用户名,但文本框尚未更新。

4

1 回答 1

0

您将希望将您的 void 方法移动到一个 IEnumerator 中并将您的引用设置为一个变量。

IEnumerator GetUserData(){
    var getTask = reference.Child("users").Child(PlayerPrefs.GetString("userUID")).GetValueAsync();
    yield return new WaitUntil(() => getTask.IsCompleted || getTask.IsFaulted);
    if (getTask.IsCompleted)
    {
        Dictionary<string, object> results = (Dictionary<string, object>)task.Result.Value;
        userName= (string)results["userName"];
        Debug.Log(userName);
        userNameText.text = userName;
    }
}

然后在你的 start 方法中,你可以启动协程。我的文本框消失也有同样的问题。如果您放置一些日志语句,您可以看到在调用 firebase 之前第一次通过函数读取,并将文本设置为空字符串。

void Start()
{
    //database reference (I'm hiding the project id)
    FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("https://projectID.firebaseio.com/");

    // Get the root reference location of the database.
    reference = FirebaseDatabase.DefaultInstance.RootReference;

    StartCoroutine(GetUserData());
}
于 2019-06-12T17:37:17.747 回答