# Call Controls

By default, `StreamCallContent` renders controls for the user to interact with, such as leaving a call, controlling their microphone and camera, etc.

However, in cases where developers want to override these controls, they can use the `StreamCallControls` class.

If left unmodified, Stream Call Content uses the `.withDefaultOptions` constructor.

```dart
List<Widget> defaultCallControlOptions({
  required Call call,
  required CallParticipantState localParticipant,
  VoidCallback? onLeaveCallTap,
}) {
  return [
    ToggleSpeakerphoneOption(call: call),
    ToggleCameraOption(call: call, localParticipant: localParticipant),
    ToggleMicrophoneOption(call: call, localParticipant: localParticipant),
    FlipCameraOption(call: call, localParticipant: localParticipant),
    LeaveCallOption(call: call, onLeaveCallTap: onLeaveCallTap),
  ];
}
```

Developers can supply a list of custom options for their call using the default constructor. It's common to use a combination of both Stream default options and custom options. For example, you can use Stream's default buttons for leaving the call, controlling the microphone, and camera, while including a custom option to perform an activity specific to your application, such as sending a custom event or reaction.

```dart
StreamCallContent(
  call: call,
  callControlsWidgetBuilder: (
    BuildContext context,
    Call call,
  ) {
    return StreamCallControls(
      options: [
        // Custom call option toggles the chat while on a call.
        CallControlOption(
          icon: const Icon(Icons.chat_outlined),
          onPressed: () => showChatDialog(context),
        ),
        ToggleMicrophoneOption(
          call: call,
        ),
        ToggleCameraOption(
          call: call,
        ),
        LeaveCallOption(
          call: call,
          onLeaveCallTap: () => call.leave(),
        ),
      ],
    );
  },
);
```

As an example, the above snippet demonstrates how a custom `CallControlOption` can be used to display a chat dialog while a user is on a call.

### Custom widgets

The `StreamCallControls` options allow you to provide any custom widget. If our default toggle options don’t offer the level of customization you're looking for, or if you prefer to use a completely different button, you can easily substitute them with your own widget. Typically, these toggles are simply wrappers around a single `Call` method call. You can review the logic within our toggle options to replicate it as needed.

```dart
class ToggleCameraButton extends StatelessWidget {
  const ToggleCameraButton({required this.call, super.key});

  final Call call;

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () async {
        final localParticipant = call.state.value.localParticipant!;
        await call.setCameraEnabled(enabled: !localParticipant.isVideoEnabled);
      },
      child: Container(
        padding: const EdgeInsets.all(8),
        decoration: BoxDecoration(
          color: Colors.blue,
          borderRadius: BorderRadius.circular(8),
        ),
        child: const Icon(
          Icons.videocam_rounded,
          color: Colors.white,
        ),
      ),
    );
  }
}
```


---

This page was last updated at 2026-08-10T16:01:05.419Z.

For the most recent version of this documentation, visit [https://getstream.io/video/docs/flutter/ui-cookbook/replacing-call-controls/](https://getstream.io/video/docs/flutter/ui-cookbook/replacing-call-controls/).