Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 编译后在Expo应用程序中的屏幕间导航_Javascript_Typescript_React Native_Expo - Fatal编程技术网

Javascript 编译后在Expo应用程序中的屏幕间导航

Javascript 编译后在Expo应用程序中的屏幕间导航,javascript,typescript,react-native,expo,Javascript,Typescript,React Native,Expo,我刚刚完成了与TypeScript一起构建世博会应用程序的工作。在现场测试模式下,一切似乎都正常,但在将应用编译成独立应用程序(至少对于Android而言,还没有尝试过ios)后,屏幕之间的导航似乎中断了。我甚至无法通过第一个屏幕(当我按下下一步按钮时,应用程序会立即崩溃),尽管我知道所有屏幕都在单独运行。我正在使用Expo版本4.4.1,在托管工作流下 这是我的NavigationStack.tsx: import { createStackNavigator } from 'react-na

我刚刚完成了与TypeScript一起构建世博会应用程序的工作。在现场测试模式下,一切似乎都正常,但在将应用编译成独立应用程序(至少对于Android而言,还没有尝试过ios)后,屏幕之间的导航似乎中断了。我甚至无法通过第一个屏幕(当我按下下一步按钮时,应用程序会立即崩溃),尽管我知道所有屏幕都在单独运行。我正在使用Expo版本4.4.1,在托管工作流下

这是我的NavigationStack.tsx:

import { createStackNavigator } from 'react-navigation-stack';
import { createAppContainer } from 'react-navigation';
import EntireMapScreen from '../app/screens/EntireMapScreen';
import CardFormScreen from '../app/screens/CardFormScreen';
import ChooseOfferScreen from '../app/screens/ChooseOfferScreen';
import DecisionScreen from '../app/screens/DecisionScreen';
const screens = {
Decision: {
screen: DecisionScreen
    },
ChooseOffer: {
screen: ChooseOfferScreen
    },
Payment: {
screen: CardFormScreen
    },
EntireMap: {
screen: EntireMapScreen
    }
}
const navigationStack = createStackNavigator(screens, {
defaultNavigationOptions: {
headerShown: false
    }
});
export default createAppContainer(navigationStack);
一个文件通常是这样的(DecisionScreen.tsx):

从“React”导入React;
从“反应导航堆栈”导入{NavigationStackProp,NavigationStackScreenProps};
从“@react native async storage/async storage”导入异步存储;
从“反应导航”导入{NavigationInjectedProps,withNavigation};
/**
*一个非常简单的非GUI屏幕,决定用户是否应该再次为应用付费
*或者该应用程序是否可以简单地使用。
*/
类决策屏幕扩展了React.Component{
键盘迪迪迪尔斯滕纳:任何;
构造器(道具:任何){
超级(道具);
此.state={
表格:{
地位:{
cvc:“不完整”,
到期日:“未完成”,
名称:“不完整”,
编号:“不完整”
},
有效:假,
价值观:{
cvc:“”,
有效期:“,
姓名:“,
编号:“,
类型:“”
}
},
fontsLoaded:错,
waitingServerResponse:false,
罗:错
};
}
makeDecision=async(试用编号)=>{
...
}
渲染=()=>;
componentDidMount=()=>{
这是决策(1);
}
}
使用导航导出默认值(决策屏幕);

在过去的6个小时里,我在网上发现了类似的情况。我能找到的最好的一篇文章是:,它没有解决这个问题。有人知道我是如何解决这个问题的吗?

问题的最终原因是,异步函数中有一个承诺,直到后来被作为未定义函数调用时才得到解决。因此,解决办法是在该承诺旁边添加一个等待声明

import React from "react";
import { NavigationStackProp, NavigationStackScreenProps } from "react-navigation-stack";
import AsyncStorage from '@react-native-async-storage/async-storage';
import { NavigationInjectedProps, withNavigation } from "react-navigation";
/**
 * An extremly simple non-GUI screen, which decides if the user should pay again for the app
 * or if the app can simply be used.
 */
class DecisionScreen extends React.Component<NavigationInjectedProps, {
form: {
status: {
cvc: string,
expiry: string,
name: string,
number: string
        },
valid: boolean,
values: {
cvc: string,
expiry: string,
name: string,
number: string,
type: string
        }
    },
fontsLoaded: boolean,
waitingServerResponse: boolean,
showError: boolean // if true, we know something went wrong billing the user with 
// the currently inserted details
}> {
keyboardDidHideListener: any;
constructor(props: any) {
super(props);
this.state = {
form: {
status: {
cvc: "incomplete",
expiry: "incomplete",
name: "incomplete",
number: "incomplete"
                },
valid: false,
values: {
cvc: "",
expiry: "",
name: "",
number: "",
type: ""
                }
            },
fontsLoaded: false,
waitingServerResponse: false,
showError: false
        };
    }
makeDecision = async (trial: number) => {

...
    }
render = () => <></>;
componentDidMount = () => {
this.makeDecision(1);
    }
}
export default withNavigation(DecisionScreen);