---
url: https://talkjs.com/docs/Data_APIs/Flutter/Participants
title: 'Participants'
minidoc-source: dart
---

A participant represents a user in a conversation.
To add a user to a conversation you can [create a participant](/Data_APIs/Flutter/Participants/#ParticipantRef__createIfNotExists), and you can [delete a participant](/Data_APIs/Flutter/Participants/#ParticipantRef__delete) to kick them.
You can track the participants of a conversation in real-time using [ConversationRef.subscribeParticipants](/Data_APIs/Flutter/Conversations/#ConversationRef__subscribeParticipants).

## ParticipantRef
/** References a given user's participation in a conversation.
Used in all Data API operations affecting that participant, such as joining/leaving a conversation, or setting their access. Created via [ConversationRef.participant]. */
class ParticipantRef {
/** The ID of the user who is participating.
Immutable: if you want to reference a different participant, get a new ParticipantRef instead. */
final String userId;

/** The ID of the conversation the user is participating in.
Immutable: if you want to reference the user in a different conversation, get a new ParticipantRef instead. */
final String conversationId;

/** Fetches a snapshot of the participant.
This contains all of the participant's public information.
@return A snapshot of the participant's attributes, or null if the user is not a participant. The promise will reject if you are not a participant and try to read information about someone else. */
Future<ParticipantSnapshot?>get()

/** Sets properties of this participant. If the user is not already a participant in the conversation, they will be added.
Properties that are `null` will not be changed. To clear / reset a property to the default, call [ParticipantRef.deleteFields] instead.
When client-side conversation syncing is disabled, you must already be a participant and you cannot set anything except the `notify` property. Everything else requires client-side conversation syncing to be enabled, and will cause the function to throw.
@param access The level of access the participant should have in the conversation. Default = `READ_WRITE` access.
@param notify When the participant should be notified about new messages in this conversation. Default = `TRUE`.
`FALSE` means no notifications, `TRUE` means notifications for all messages, and `MENTIONS_ONLY` means that the user will only be notified when they are mentioned with an `@`. */
Future<void>set({ConversationAccess? access, NotificationSettings? notify})

/** Edits properties of a pre-existing participant. If the user is not already a participant in the conversation, the function will throw.
Properties that are `null` will not be changed. To clear / reset a property to the default, call [ParticipantRef.deleteFields] instead.
When client-side conversation syncing is disabled, you must already be a participant and you cannot set anything except the `notify` property. Everything else requires client-side conversation syncing to be enabled, and will cause the function to throw.
@param access The level of access the participant should have in the conversation. Default = `READ_WRITE` access.
@param notify When the participant should be notified about new messages in this conversation. Default = `TRUE`.
`FALSE` means no notifications, `TRUE` means notifications for all messages, and `MENTIONS_ONLY` means that the user will only be notified when they are mentioned with an `@`. */
Future<void>edit({ConversationAccess? access, NotificationSettings? notify})

/** Adds the user as a participant, or does nothing if they are already a participant.
If the participant already exists, this operation is still considered successful.
The promise will reject if client-side conversation syncing is disabled and the user is not already a participant.
@param access The level of access the participant should have in the conversation. Default = `READ_WRITE` access.
@param notify When the participant should be notified about new messages in this conversation. Default = `TRUE`.
`FALSE` means no notifications, `TRUE` means notifications for all messages, and `MENTIONS_ONLY` means that the user will only be notified when they are mentioned with an `@`. */
Future<void>createIfNotExists({ConversationAccess? access, NotificationSettings? notify})

/** Deletes properties of this participant.
@param fields The names of the properties to delete */
Future<void>deleteFields(List<String>fields)

/** Removes the user as a participant, or does nothing if they are already not a participant.
Deleting a nonexistent participant is treated as success.
This function will throw if client-side conversation syncing is disabled. */
Future<void>delete()
}

## ParticipantSnapshot
/** A snapshot of a participant's attributes at a given moment in time. */
class ParticipantSnapshot {
/** The user who this Participant Snapshot is referring to */
final UserSnapshot user;

/** The level of access this participant has in the conversation. */
final ConversationAccess access;

/** When the participant will be notified about new messages in this conversation.
`FALSE` means no notifications, `TRUE` means notifications for all messages, and `MENTIONS_ONLY` means that the user will only be notified when they are mentioned with an `@`. */
final NotificationSettings notify;

/** The date that this user joined the conversation, as a unix timestamp in milliseconds. */
final int joinedAt;

ParticipantSnapshot(Map<String, dynamic>json)

Map<String, dynamic>toJson()
}

## ParticipantSubscription
/** A subscription to the participants in a specific conversation.
Get a ParticipantSubscription by calling [ConversationRef.subscribeParticipants]
The subscription is 'windowed'. It includes everyone who joined since a certain point in time. By default, you subscribe to the 10 most recent participants, and any participants who joined after you subscribe.
You can expand this window by calling [ParticipantSubscription.loadMore], which extends the window further into the past. Do not call `.loadMore` in a loop until you have loaded all participants, unless you know that the maximum number of participants is small (under 100).
Remember to `.unsubscribe` the subscription once you are done with it. */
class ParticipantSubscription {
/** Resolves when the subscription starts receiving updates from the server.
Wait for this promise if you want to perform some action as soon as the subscription is active.
The promise rejects if the subscription is terminated before it connects. */
final Future<void>connected;

/** Resolves when the subscription permanently stops receiving updates from the server.
This is either because you unsubscribed or because the subscription encountered an unrecoverable error. */
final Future<void>terminated;

/** Expand the window to include older participants
Calling `loadMore` multiple times in parallel will still only load one page of participants.
Avoid calling `.loadMore` in a loop until you have loaded all participants. If you do need to call loadMore in a loop, make sure you set a small upper bound (e.g. 100) on the number of participants, where the loop will exit.
@param count The number of additional participants to load. Must be between 1 and 50. Default 10. */
Future<void>loadMore(int? count)

/** Unsubscribe from this resource and stop receiving updates.
If the subscription is already in the [UnsubscribedState] or [ErrorState], this is a no-op. */
Future<void>unsubscribe()
}