TypeScript MIT

sonner-native-toasts

An opinionated toast component for React Native. A port of @emilkowalski's sonner.

G

gunnartorfis

Dernière activité 7 sept. 2026
gunnartorfis/sonner-native-toasts

1,4 k

étoiles

63

forks

16

issues ouvertes

notificationsreact-nativereact-native-toastsonnertoasttoasts

Ce README est souvent en anglais.

React Native Toasts

An opinionated toast component for React Native. A port of @emilkowalski's sonner.

sonner-native

Features

  • API fully matches Sonner's
  • Multiple variants, including success, error, warning, custom, promise
  • Promise variant with built-in loading state
  • Custom JSX with the custom variant
  • Top, bottom, or center positions
  • Title and description
  • Action button with a callback
  • Custom icons
  • Optionally dismissable with swipe, configurable left or up
  • Dismissable with toast.dismiss(), one or all toasts
  • Highly performant using Reanimated 3, 60 FPS
  • Dark mode built-in
  • Works with Expo
  • NativeWind supported
  • Customizable via styles props
  • Works outside of React components

Showcase

Screenshot 2024-09-06 at 16 33 10 Screenshot 2024-09-06 at 16 32 27 Screenshot 2024-09-06 at 16 32 33 Screenshot 2024-09-06 at 16 32 39 Screenshot 2024-09-06 at 16 33 04

Expo Snack

https://snack.expo.dev/@gunnartorfis/sonner-native

Installation

npx expo install sonner-native

Requirements

To use this package, you also need to install its peer dependencies. Check out their documentation for more information:

Usage

In your App.tsx/entry point

import { Toaster } from 'sonner-native';

function App() {
  return (
    <View>
      <NavigationContainer>...</NavigationContainer>
      <Toaster />
    </View>
  );
}

With Expo Router

When using Expo Router, place the Toaster component in your root layout file (app/_layout.tsx):

import { Toaster } from 'sonner-native';
import { Stack } from 'expo-router';
import { GestureHandlerRootView } from "react-native-gesture-handler";

export default function RootLayout() {
  return (
    <GestureHandlerRootView>
      <Stack>
        <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
        <Stack.Screen name="+not-found" />
      </Stack>
      <Toaster />
    </GestureHandlerRootView>
  );
}

This ensures the toasts will be displayed across all screens in your app.

Show a toast

import { toast } from 'sonner-native';

function SomeComponent() {
  return (
    <Button
      title="Show Toast"
      onPress={() => toast('Hello, World!')}
    />
  );
}

Web support

Even though Sonner Native works on the web, it is not recommended to use it there. Instead, use the original Sonner.

The following setup is recommended. Add a sonner.ts and sonner.web.ts file to your project and import from there instead of from this library directly. That way, sonner will be used on the web and sonner-native on native.

// sonner.ts
export * from 'sonner-native';
// sonner.web.ts
export * from 'sonner';

Documentation

For more advanced usage, check out the documentation

Recording

demo.mov

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT


Made with create-react-native-library

Projets similaires

An opinionated toast component for React.

TypeScriptnotificationsreacttoast
Eemilkowalski
13 k étoiles463

Smoking Hot React Notifications 🔥

TypeScriptnotificationsreactsnackbar
Ttimolins
11 k étoiles370

React notification made easy 🚀 !

TypeScriptjavascriptnotificationreact
Ffkhadra
13,4 k étoiles743