You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Navigation参数无法识别问题求助

React Native + TypeScript 导航跳转时参数传递为undefined的问题

我有一个基于TypeScript的React Native应用,之前使用Navigation功能正常,但这次跳转至FileViewScreen时,传递的id、filename、file参数全是undefined。


相关代码

FileViewScreen 代码

export type Props = {
  navigation: PropTypes.func.isRequired;
  id: PropTypes.int.isRequired;
  filename: PropTypes.string.isRequired;
  file: { 
    name: PropTypes.string.isRequired;
    uri: PropTypes.path.isRequired;
    type: PropTypes.mime.isRequired
  };
};

const FileViewScreen: React.FC<Props> = ({navigation, id, filename, file}) => {
  console.log("File View Screen?")
  console.log("currentFile");
  console.log(id)
  console.log(currentFile) // 未定义变量提前打印
  console.log(filename)
  console.log(file)
  const [currentFile, setCurrentFile] = useState(file);
  // ... 其他代码

HomeScreen 跳转触发代码

const HomeScreen: React.FC<Props> = ({navigation}) => {
  const [loading, setLoading] = useState(false);
  const [file, setFile] = useState({});
  const [files, setFiles] = useState([]);

  const downloadFile = async () => {
    try {
      // ... 省略其他代码
      const newEntry = {
        name: 'ImageFileName' + Math.random().toString(),
        uri: result.path,
        type: result.mime,
      };
      const res = await addFile(result.path);
      console.log(res)
      navigation.navigate('FileView', { id:1, filename:res, file:newEntry });
    } catch (error) {
      console.log('downloadFile error', error);
    }
  };

  return (
    <View style={styles}>
      <Text>Welcome Home</Text>
      {loading && <ActivityIndicator size={'large'} color="#000" />}
      {!loading && (
        <>
          <Button
            title="Start Recording"
            onPress={downloadFile}
          />
        </>
      )}
    </View>
  );
};

addFile 函数代码

export const addFile = file_path => {
  db.transaction(txn => {
    console.log("db transaction")
    console.log(file_path)
    const response = txn.executeSql(
      'INSERT INTO files(file_path,uploaded) VALUES (' +
        file_path +
        ',' +
        false +
        ')',
      (sqlTxn, res) => {
        console.log("adding")
        console.log(`${file_path} video added successfully`);
        return file_path;
      },
      error => {
        console.log('error on adding file ' + error.message);
        return 0;
      },
    );
  });
  console.log(resopnse) // 拼写错误:response
};

App.js 导航配置

<NavigationContainer>
  <Stack.Navigator initialRouteName={initalRoute}>
    <Stack.Screen name="Login">
      {props => (
        <LoginScreen {...props} setToken={setUserToken} setUser={setUser} />
      )}
    </Stack.Screen>
    <Stack.Screen name="Home">
        {props => (
          <HomeScreen {...props}/>
        )}
    </Stack.Screen>
    <Stack.Screen name="Register" component={RegisterScreen} />
    <Stack.Screen name="FileView">
      {props =>(
         <FileViewScreen {...props} />
         )}
    </Stack.Screen>
</NavigationContainer>

已尝试的解决方法

  • 修改App.js中FileViewScreen的传参方式
  • 单独传递id、filename或file单个参数
  • 使用useState接收参数以应对延迟传递情况

尚未尝试的操作

  • 将跳转逻辑移出按钮点击事件,不确定navigation.navigate是否仅支持点击触发场景

解决方案

1. 导航参数获取方式错误

React Navigation中,navigate传递的参数不会直接作为组件props传入,而是存储在route.params中。你直接解构props中的参数自然会拿到undefined。

修改FileViewScreen代码:

// 更新Props类型,加入route参数
export type FileType = {
  name: string;
  uri: string;
  type: string;
};

export type Props = {
  navigation: any; // 推荐导入React Navigation的NavigationProp类型做严格校验
  route: {
    params: {
      id: number;
      filename: string;
      file: FileType;
    };
  };
};

const FileViewScreen: React.FC<Props> = ({navigation, route}) => {
  // 从route.params中正确取出参数
  const { id, filename, file } = route.params;
  
  console.log("File View Screen?")
  console.log(id)
  console.log(filename)
  console.log(file)
  const [currentFile, setCurrentFile] = useState(file);
  // ... 其他代码

2. addFile函数异步逻辑错误

addFile没有返回Promise,导致await addFile(...)得到的res是undefined,直接造成filename参数异常。同时SQL语句存在注入风险,还有拼写错误。

修复addFile函数:

export const addFile = (file_path) => {
  // 返回Promise处理异步DB操作
  return new Promise((resolve, reject) => {
    db.transaction(txn => {
      txn.executeSql(
        // 使用参数化查询避免SQL注入
        'INSERT INTO files(file_path, uploaded) VALUES (?, ?)',
        [file_path, false],
        (sqlTxn, res) => {
          console.log(`${file_path} video added successfully`);
          resolve(file_path);
        },
        (sqlTxn, error) => {
          console.log('error on adding file ' + error.message);
          reject(error);
        },
      );
    });
  });
};

3. PropTypes使用错误

TypeScript中不需要用PropTypes定义类型,且PropTypes.int、PropTypes.path、PropTypes.mime都是不存在的类型,会导致类型校验失效。直接用TypeScript原生类型系统即可。

4. 其他小问题修复

  • 删除FileViewScreen中useState定义前打印currentFile的代码,避免未定义变量报错
  • 修正addFile中的resopnse拼写错误为response(修复异步逻辑后该变量可删除)

内容的提问来源于stack exchange,提问作者user2723240

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:24:26