Expo Router中useRouter导航因类型不匹配报错导致应用崩溃
Expo Router中useRouter导航因类型不匹配报错导致应用崩溃
看起来你遇到了Expo Router里useRouter导航时的类型不匹配问题,这种TypeError: expected dynamic type int/double/bool/string', but had type 'object'报错,通常是导航时传递的参数不符合底层要求导致的,我来帮你梳理下常见原因和解决办法:
1. 导航传参时直接传递了对象类型参数
Expo Router的导航参数(不管是通过router.push的第二个参数,还是路由配置里的参数)底层只支持基础数据类型:数字、布尔值、字符串。如果你直接传了对象,就会触发这个报错。
比如你可能写了类似这样的错误代码:
const router = useRouter(); // 错误示例:直接传递对象作为导航参数 router.push('/detail', { userInfo: { id: 123, name: 'Hamado' } });
解决方法:把对象序列化为JSON字符串再传递,目标页面接收后再解析回来:
// 跳转时序列化对象参数 router.push('/detail', { userInfo: JSON.stringify({ id: 123, name: 'Hamado' }) }); // 目标页面接收时解析参数 import { useLocalSearchParams } from 'expo-router'; const params = useLocalSearchParams(); const userInfo = params.userInfo ? JSON.parse(params.userInfo) : null;
2. 动态路由参数误用了非基础类型
如果你的路由是动态路由(比如/user/[userId]),导航时如果不小心把对象当成参数传入,也会触发这个错误。比如:
const router = useRouter(); const user = { id: 456, name: 'Test' }; // 错误示例:直接传递对象给动态路由参数 router.push(`/user/${user}`);
解决方法:确保动态路由参数是基础类型,比如提取对象的ID字段传入:
router.push(`/user/${user.id}`);
3. 快速验证定位问题
你可以先做个简单测试:暂时去掉导航时的所有参数,直接调用router.push('/你的目标路由')。如果这样应用不再崩溃,那100%是参数类型的问题,再回到参数部分针对性处理即可。
备注:内容来源于stack exchange,提问作者Hamado SIMEAN
相关产品推荐
相关产品推荐

