首页 > 解决方案 > 从 Firebase 检索数据以创建带有按钮的滚动视图的问题

问题描述

我正在尝试使用从 Firebase 实时数据库中检索“titulo”字段的按钮创建一个滚动视图。我必须阅读 Firebase json,但在迭代时我无法在按钮中应用名称,并且滚动视图中没有出现任何按钮。

有人可以帮我吗?先感谢您。

这是我的代码:

FirebaseDatabase.DefaultInstance
    .GetReference("Flash")
    .GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Debug.Log("Error al leer la Base de Datos de Firebase");
        }

        else if (task.IsCompleted)
        {
            DataSnapshot snapshot = task.Result;
            Debug.Log("Base de datos: " + snapshot.GetRawJsonValue());

            foreach (DataSnapshot evento in snapshot.Children)
            {
                string titulo = (string)evento.Child("titulo").Value;
                lat = float.Parse(evento.Child("lat").Value.ToString());
                lon = float.Parse(evento.Child("lon").Value.ToString());
                string descripcion = (string)evento.Child("descripcion").Value;

                Debug.Log("Titulo: " + titulo);
                Debug.Log("Latitud: " + lat);
                Debug.Log("Longitud: " + lon);
                Debug.Log("Descripcion: " + descripcion);

                GameObject go = Instantiate(Button_Template) as GameObject;
                go.SetActive(true);
                BC_TButton_FLASH TB = go.GetComponent<BC_TButton_FLASH>();

                TB.SetTitulo(titulo);

                go.transform.SetParent(Button_Template.transform.parent);
                go.transform.localScale = new Vector3(1, 1, 1);
            }
        }
    });

和:

public class BC_TButton_FLASH : MonoBehaviour {

    private string Titulo;
    private float Lat;
    private float Lon;
    private string Descripcion;

    public Text ButtonText_Titulo;

    public BC_TData_WS_FLASH ScrollView;


    public void SetTitulo(string titulo)
    {
        Titulo = titulo;
        ButtonText_Titulo.text = titulo;
    }

}

json是这样的:

{
"Flash" : [ {
    "descripcion" : "aaaaa",
    "lat" : 12.32145,
    "lon" : 6.789,
    "titulo" : "a1"
  }, {
    "descripcion" : "bbbbb",
    "lat" : 21.41254,
    "lon" : -2.4396,
    "titulo" : "a2"
  }, {
    "descripcion" : "ccccc",
    "lat" : 42.3434,
    "lon" : 345345,
    "titulo" : "a3"
  } ]
}

标签: c#firebaseunity3dfirebase-realtime-database

解决方案


你的问题是多线程。

大多数 Unity API 只能在 Unity 主线程中使用。特别是任何立即需要或影响当前场景的东西(所以例外是纯数学结构,如使用Vector3,Plane等进行计算Quaternion

Task.ContinueWith继续在主线程中执行

创建一个在目标任务完成时异步执行的延续。

因此专门为 Unity Firebase 提供TaskExtentsionsContinueWithOnMainThread

返回一个在给定任务完成后完成的任务,并且从Unity的主线程调用给定的延续函数。

所以你应该使用

FirebaseDatabase.DefaultInstance
    .GetReference("Flash")
    .GetValueAsync().ContinueWithOnMainThread(task =>
    {
        ...

推荐阅读