为什么 header 按钮 onPress 的行为与常规按钮 onPress 不同?

Why does header button onPress act differently than regular button onPress?

我有一个名为 sendResults() 的方法,它进行 API 调用并进行一些数组操作。当我使用“普通”TouchableOpacity 按钮调用该方法时,一切正常。但是,当我使用放置在 App Stack header 中的按钮调用它时,该方法无法正确 运行。感觉像是一个异步问题(?)但不确定...

这是两个按钮的代码。

    <TouchableOpacity
      onPress={() => {
        sendResults(); // works fine
      }}
      style={styles.buttonStyle}
    >
      <Text>Save</Text>
    </TouchableOpacity>
  useEffect(() => {
    navigation.setOptions({
      headerRight: () => (
        <TouchableOpacity
          onPress={() => {
            sendResults(); // doesn't work
          }}
          style={styles.buttonStyle}
        >
          <Text>Save</Text>
        </TouchableOpacity>
      ),
    });
  }, []);

编辑:sendResults() 代码

  // Shows alert confirming user wants to send results to API
  const sendResults = () => {
    Alert.alert("Save Results", "Alert", [
      {
        text: "Save & Quit",
        onPress: () => postNumsAndNavigate(),
        style: "destructive",
      },
      { text: "Cancel", onPress: () => console.log("") },
    ]);
  };

  // Save Results button
  const postNumsAndNavigate = async () => {
    if (bibNums.length == 0) {
      alert("You have not recorded any results. Please try again.");
    } else if (bibNums.filter((entry) => entry == "").length > 0) {
      alert("Blank");
    } else {
      console.log("\n" + bibNums);
      await postNums();
      AsyncStorage.setItem(`done`, "true");
      navigation.navigate("Home Screen");
    }
  };

postNums() 调用 API。

编辑 2:bibNums 声明

const [bibNums, setBibNums] = useState([]);

您只设置了一次导航按钮的处理程序,因为您的 useEffect 没有任何依赖;它仅在安装组件时运行,它捕获 sendResults 的旧引用。 sendResults 每次 postNumsAndNavigatebibNums 变化时都会变化。将 sendResults 添加到依赖项数组以在每次 sendResults 更改时更新导航按钮处理程序。

useEffect(() => {
...
}, [sendResults])

它对 TouchableOpacity 正常工作,因为您在每个渲染器上都分配了处理程序。

onPress={() => {sendResults()}}