---
id: adding_local_data_persistence
title: Offline Support
---

Adding Local Data Persistence for Offline Support

### Introduction

Most messaging apps need to work regardless of whether the app is currently connected to the internet.
Local data persistence stores the fetched data from the backend on a local SQLite database using the
moor package in Flutter. All packages in the SDK can use local data persistence to store messages
across multiple platforms.

### Implementation

To add data persistence you can extend the class ChatPersistenceClient and pass an instance to the StreamChatClient.

```dart
class CustomChatPersistentClient extends ChatPersistenceClient {
...
}

final client = StreamChatClient(
  apiKey ?? kDefaultStreamApiKey,
  logLevel: Level.INFO,
)..chatPersistenceClient = CustomChatPersistentClient();
```

We provide an official persistent client in the [stream_chat_persistence](https://pub.dev/packages/stream_chat_persistence)
package that works using the library [moor](https://moor.simonbinder.eu), an SQLite ORM.

Add this to your package's `pubspec.yaml` file, using the latest version.

```yaml
dependencies:
 stream_chat_persistence: ^latest_version
```

You should then run `flutter packages get`

The usage is pretty simple.

1. Create a new instance of `StreamChatPersistenceClient` providing `logLevel` and `connectionMode`

```dart
final chatPersistentClient = StreamChatPersistenceClient(
  logLevel: Level.INFO,
  connectionMode: ConnectionMode.background,
);
```

2. Pass the instance to the official `StreamChatClient`

```dart
  final client = StreamChatClient(
    apiKey ?? kDefaultStreamApiKey,
    logLevel: Level.INFO,
  )..chatPersistenceClient = chatPersistentClient;
```

And you are ready to go...

Note that passing `ConnectionMode.background` the database uses a background isolate to unblock the main thread.
The `StreamChatClient` uses the `chatPersistentClient` to synchronize the database with the newest
information every time it receives new data about channels/messages/users.

### Multi-user

The DB file is named after the `userId`, so if you instantiate a client using a different `userId` you will use a different database.
Calling `client.disconnectUser(flushChatPersistence: true)` flushes all current database data.

### Updating/deleting/sending a message while offline

The information about the action is saved in offline storage. When the client returns online, everything is retried.
