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

Expo应用Google认证后,Linking.createURL无法跳转至首页求助

解决Expo Go中Clerk Google认证后无法跳转至Home页面的问题

核心问题分析

你的代码中,当Google认证成功并获取到createdSessionId后,没有执行会话激活和页面跳转的逻辑,这是导致停留在登录页的直接原因。此外还需要确认路由配置和Scheme是否正确。

解决方案步骤

1. 完善认证成功后的逻辑

修改LoginScreen中的onPress函数,在createdSessionId存在时,先激活Clerk会话,再导航到Home页面:

import { View, Text, Pressable, Image } from 'react-native'
import React, { useCallback } from 'react'
import Colors from './../../constants/Colors'
import { useOAuth } from '@clerk/clerk-expo'
import * as Linking from 'expo-linking'
import * as WebBrowser from 'expo-web-browser'
import { useNavigation } from '@react-navigation/native' // 导入导航钩子

export const useWarmUpBrowser = () => {
  React.useEffect(() => {
    void WebBrowser.warmUpAsync()
    return () => {
      void WebBrowser.coolDownAsync()
    }
  }, [])
}

WebBrowser.maybeCompleteAuthSession()

export default function LoginScreen() {
  useWarmUpBrowser();
  const { startOAuthFlow } = useOAuth({ strategy: 'oauth_google' })
  const navigation = useNavigation(); // 获取导航实例

  const onPress = useCallback(async () => {
    try {
      const { createdSessionId, signIn, signUp, setActive } = await startOAuthFlow({
        redirectUrl: Linking.createURL('/home', { scheme:'myapp' })
      })

      if (createdSessionId) {
        // 激活Clerk会话
        await setActive({ session: createdSessionId });
        // 导航到Home页面
        navigation.navigate('Home');
      } else {
        // 处理MFA等后续步骤
        if (signIn) await signIn.create({ redirectUrl: Linking.createURL('/home', { scheme:'myapp' }) });
        if (signUp) await signUp.create({ redirectUrl: Linking.createURL('/home', { scheme:'myapp' }) });
      }
    } catch (err) {
      console.error('OAuth error', err)
    }
  }, [navigation, startOAuthFlow])

  return (
    <View style={{
      backgroundColor:Colors.WHITE,
      height:'100%'
    }}>
      <Pressable 
        onPress={onPress}
        style={{
          padding:14,
          marginTop:100,
          backgroundColor:Colors.PRIMARY,
          width:'100%',
          borderRadius:14
        }}>
          <Text style={{
            fontFamily:'outfit-medium',
            fontSize:20,
            textAlign:'center'
          }}>Sign In With Google</Text>
        </Pressable>
    </View>
  )
}

2. 确认路由配置正确

确保你的项目中已经配置了包含Login和Home页面的路由(以React Navigation为例):

// App.jsx或导航配置文件
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import LoginScreen from './path/to/LoginScreen';
import Home from './path/to/Home';

const Stack = createStackNavigator();

export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Login">
        <Stack.Screen name="Login" component={LoginScreen} />
        <Stack.Screen name="Home" component={Home} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

3. 验证App Scheme配置

检查app.json中的scheme是否与你在redirectUrl中使用的myapp一致:

{
  "expo": {
    "scheme": "myapp",
    // 其他配置...
  }
}

额外注意事项

  • 确保@react-navigation/native和对应导航依赖已安装:npm install @react-navigation/native @react-navigation/stack react-native-screens react-native-safe-area-context
  • 如果使用Expo Go,修改app.json后需要重新启动Expo服务,确保Scheme生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:45:02