【问题标题】:React Native - Update in Firebase Realtime Database then navigate is not waitingReact Native - 在 Firebase 实时数据库中更新然后导航不等待
【发布时间】:2021-11-27 12:22:23
【问题描述】:

我正在使用 Firebase 实时数据库作为后端开发一个带有 React Native 的应用程序。

在“编辑”屏幕上,我有一个表单,它会在按下提交按钮时更新数据(在特定 ID 处)。保存后,它会立即导航到该项目的“详细信息”屏幕(react-navigation)。

详细信息屏幕从 Firebase 中提取数据并显示刚刚编辑的项目的详细信息。

问题在于它会保存,但过早进入详细信息屏幕(尽管导航位于 then 语句中)。因此,当它进入详细信息时,它具有旧信息,除非我完全退出并再次查看详细信息屏幕。下面是调用 onSubmit 的函数:

const saveExisting = (data) => {
    Firebase.database()
        .ref("users/" + user.uid + "/items/" + itemId)
        .set(data, function (error) {
            if (error) console.log("Error saving existing item");
            else console.log("Item Updated");
        })
        .then(navigation.navigate("Details", { id: itemId }));
};

详细信息屏幕随后会从 Firebase 中提取数据,如下所示。注意:我不仅仅是标题,而是为这篇文章简化了。仅使用标题进行测试时,我遇到了同样的问题(在更新之前显示标题)。

const [title, setTitle] = useState("");
useEffect(() => {
    Firebase.database()
        .ref("users/" + user.uid + "/items/" + id)
        .get()
        .then((snapshot) => {
            if (snapshot.exists()) {
                
                snapshot.val().name && setTitle(snapshot.val().name);
                
            } else {
                console.log("No data found");
            }
        })
        .catch((error) => {
            console.log("error: " + error);
        });
}, []);

【问题讨论】:

  • “当涉及到细节时,它有旧信息”这听起来很不寻常。您能否编辑您的问题以显示您如何阅读详细信息屏幕中的信息?
  • 感谢弗兰克,更新以显示详细信息屏幕相关代码。

标签: javascript react-native firebase-realtime-database react-navigation-stack


【解决方案1】:

我不确定为什么服务器上的更新还没有完成,但总的来说,我建议使用 onSnapshot 而不是 get。

当您使用 get() 时,您明确告诉 SDK 检查服务器上的值,在这种情况下,由于(诚然不清楚)竞争条件,这似乎是问题所在。

通过使用onSnapshot,您将:

  1. 获取该值的本地估计值,这将在 set 调用返回后立即正确(甚至在 promise 解析并调用 then 之前)。
  2. 即使您暂时在某处获取过时的值,它也会在服务器通知 SDK 更新后立即更新。

【讨论】:

  • 谢谢!这使我找到了解决方案。我最终使用了 .on("value", callback) 因为我使用的是实时数据库并且据我了解 onSnapshot 特定于 Firestore 数据库
  • 糟糕,很抱歉错过了这一点。在 RTDB 上,您有 onceget,但我以某种方式将 get 映射到 Firestore,它首先存在的地方。很高兴您也能够将解决方案映射到 RTDB。 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2021-11-13
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多