Back to Supabase

Use Supabase with Expo React Native

apps/docs/content/guides/getting-started/quickstarts/expo-react-native.mdx

1.26.045.2 KB
Original Source
<StepHikeCompact>

<StepHikeCompact.Step step={1}>

<$Partial path="quickstart_db_setup.mdx" />

</StepHikeCompact.Step>

<StepHikeCompact.Step step={2}>

<StepHikeCompact.Details title="Create an Expo app">

Create a minimal Expo app using the `create-expo-app` command with the blank TypeScript template.

<$Partial path="uiLibCta.mdx" />

</StepHikeCompact.Details>

<StepHikeCompact.Code>

  ```bash name=Terminal
  npx create-expo-app my-app --template blank-typescript
  ```

</StepHikeCompact.Code>

</StepHikeCompact.Step>

<StepHikeCompact.Step step={3}> <StepHikeCompact.Details title="Install the Supabase client library">

The fastest way to get started is to use the `@supabase/supabase-js` client library which provides a convenient interface for working with Supabase from a React Native app.

Navigate to the Expo app and install `supabase-js` along with the required dependencies for secure storage and URL handling.

</StepHikeCompact.Details>

<StepHikeCompact.Code>

  ```bash name=Terminal
  cd my-app && npx expo install @supabase/supabase-js react-native-url-polyfill expo-sqlite
  ```

</StepHikeCompact.Code>

</StepHikeCompact.Step>

<StepHikeCompact.Step step={4}> <StepHikeCompact.Details title="Declare Supabase Environment Variables">

Create a `.env` file in the root of your project and populate it with your Supabase connection variables.

Expo requires environment variables to be prefixed with `EXPO_PUBLIC_` to be accessible in your app code.

<ProjectConfigVariables variable="url" />
<ProjectConfigVariables variable="publishable" />


</StepHikeCompact.Details>

<StepHikeCompact.Code>

  ```text name=.env
  EXPO_PUBLIC_SUPABASE_URL=<SUBSTITUTE_SUPABASE_URL>
  EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY=<SUBSTITUTE_SUPABASE_PUBLISHABLE_KEY>
  ```
  <$Partial path="api_settings_steps.mdx" variables={{ "framework": "", "tab": "" }} />

</StepHikeCompact.Code>

</StepHikeCompact.Step>

<StepHikeCompact.Step step={5}> <StepHikeCompact.Details title="Initialize the Supabase client">

Create a helper file at `lib/supabase.ts` to initialize the Supabase client using the environment variables.

The code below uses Expo's localStorage polyfill to persist authentication sessions.

</StepHikeCompact.Details>

<StepHikeCompact.Code>

  ```ts name=lib/supabase.ts
  import 'react-native-url-polyfill/auto'
  import { createClient } from '@supabase/supabase-js'
  import 'expo-sqlite/localStorage/install';

  const supabaseUrl = process.env.EXPO_PUBLIC_SUPABASE_URL
  const supabasePublishableKey = process.env.EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY

  export const supabase = createClient(supabaseUrl, supabasePublishableKey, {
    auth: {
      storage: localStorage,
      autoRefreshToken: true,
      persistSession: true,
      detectSessionInUrl: false,
    },
  })
  ```

</StepHikeCompact.Code>

</StepHikeCompact.Step>

<StepHikeCompact.Step step={6}> <StepHikeCompact.Details title="Query data from the app">

Replace the contents of `App.tsx` with the following code to fetch and display the instruments from your database.

Use `useEffect` to fetch the data when the component mounts and display the query result using React Native components.

</StepHikeCompact.Details>
<StepHikeCompact.Code>

  ```tsx name=App.tsx
  import { useEffect, useState } from 'react'
  import { StyleSheet, View, FlatList, Text } from 'react-native'
  import { supabase } from './lib/supabase'

  export default function App() {
    const [instruments, setInstruments] = useState([])

    useEffect(() => {
      getInstruments()
    }, [])

    async function getInstruments() {
      const { data } = await supabase.from('instruments').select()
      setInstruments(data)
    }

    return (
      <View style={styles.container}>
        <FlatList
          data={instruments}
          keyExtractor={(item) => item.id.toString()}
          renderItem={({ item }) => (
            <Text style={styles.item}>{item.name}</Text>
          )}
        />
      </View>
    )
  }

  const styles = StyleSheet.create({
    container: {
      flex: 1,
      backgroundColor: '#fff',
      paddingTop: 50,
      paddingHorizontal: 16,
    },
    item: {
      padding: 16,
      borderBottomWidth: 1,
      borderBottomColor: '#ccc',
    },
  })
  ```

</StepHikeCompact.Code>

</StepHikeCompact.Step>

<StepHikeCompact.Step step={7}> <StepHikeCompact.Details title="Start the app">

Run the development server and scan the QR code with the Expo Go app on your phone, or press `i` for iOS simulator or `a` for Android emulator.

</StepHikeCompact.Details>

<StepHikeCompact.Code>

  ```bash name=Terminal
  npx expo start
  ```

</StepHikeCompact.Code>

</StepHikeCompact.Step>

</StepHikeCompact>

Next steps