React Native 关闭应用程序后,Supabase用户返回Null +身份验证状态未保存

niknxzdl  于 2023-02-13  发布在  React
关注(0)|答案(1)|浏览(118)

我开始学习React Native,在React中使用Supabase与在Flutter中使用它有很大的不同。现在,我已经开始使用电子邮件登录/注册,并监听auth更改以切换导航堆栈。我相信我的两个问题是相关的,因为更新时用户/会话可能不会保存。
第一个问题是,每次打开应用程序,登录界面都会显示出来,即使我在关闭它之前登录过。我试着设置一些选项,包括localStorage,但没有帮助。下面是我的supabaseClient.tsx文件。

const options = {
  auth: {
    localStorage: AsyncStorage as any,
    autoRefreshToken: true,
    persistSession: true,
    detectSessionInUrl: true,
  },
};

const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, options);

export { supabase };

第二个问题是,我尝试了一些简单的方法,只是显示登录用户在HomeScreen上设置的displayName,但是getUser()getSession()的用户都返回null,所以我无法获取user.id。这导致displayName未定义,并且出现黑屏。下面是我用来获取displayName的代码。

export function HomeScreen() {
  const [displayName, setDisplayName] = useState();

  useEffect(() => {
    (async () => {
      const user = (await supabase.auth.getSession()).data.session?.user;
      console.log("User: " + user);
      const { data, error } = await supabase
        .from("profiles")
        .select()
        .eq("uid", user?.id);
      if (error === null) {
        data!.map((data) => {
          const name = data.displayName;
          console.log(name);
          setDisplayName(name);
        });
      } else {
        console.log(error.message);
      }
      console.log("Name: " + displayName);
    })();
  }, [setDisplayName]);

  return (
    <View>
      <Text>{displayName}</Text>
    </View>
  );
}
wqsoz72f

wqsoz72f1#

我将localStorage定义为any是因为我看到了一个教程。
我需要改变这一点:

const options = {
  auth: {
    localStorage: AsyncStorage as any,
    autoRefreshToken: true,
    persistSession: true,
    detectSessionInUrl: true,
  },
};

改为:

const options = {
  auth: {
    localStorage: AsyncStorage,
    autoRefreshToken: true,
    persistSession: true,
    detectSessionInUrl: true,
  },
};

相关问题