Switch

<switch> is a native toggle - Switch on iOS, AndroidSwitch on Android.

Import
import { Switch } from '@ng-native/components';
Template
<switch> once Switch is in the component's imports
<switch [(checked)]="notificationsEnabled" />

Signal Forms

<switch> is wired as a checkbox-shaped control: its checked model is what FormField looks for on a checkbox-shaped control, so <switch [formField]="f.enabled" /> needs no adapter code. [(checked)] works the same way without a form.

Colours on both platforms at once

The two platforms spell the same props differently - iOS reads onTintColor, tintColor and thumbTintColor; Android reads trackColorForTrue, trackColorForFalse, trackTintColor and thumbTintColor (plus on for the value itself). <switch> sends both spellings at once, so thumbColor and trackColor (a { false?, true? } pair) work the same way regardless of which platform is running, with no app code needing to know which is which. ios_backgroundColor sets the colour behind the track on iOS when off, seen where the track itself is transparent.

Controlled, as in React Native

Bind checked and the switch shows what your state says, whatever the user did to it. Flipping it emits checkedChange; if your state takes the new value, nothing more happens. If it keeps the old one, the switch flips back:

<!-- Always ends up off: the handler refuses every flip. -->
<switch [(checked)]="enabled" (checkedChange)="enabled.set(false)" />

<!-- Takes a flip only while unlocked. -->
<switch [checked]="enabled()" (checkedChange)="unlocked() && enabled.set($event)" />

This is the case a prop diff cannot handle on its own. Native has already moved, but your binding writes back the same value it wrote last time, so there is no prop change to send. Once the change detection pass the flip started has finished, <switch> compares checked with what native reported and, if they differ, sends the command React Native's own Switch sends: setValue on iOS, setNativeValue on Android. When your state takes the flip, or you set checked from code, no command is sent; the prop carries it.

Any binding makes the switch controlled, one-way [checked] included, so a switch bound one way with nothing handling checkedChange cannot be flipped, as in React Native. Decide in the handler, and do it synchronously: the comparison runs once the pass the flip started has finished, so a value that arrives later is compared as a refusal and then applied when it arrives. Leave checked unbound and the switch keeps its own state, with checkedChange reporting each flip.

[formField] counts as a binding. A form takes every value the control gives it, so the switch reports each flip to the form and sends native nothing back.

disabled ignores touches, greys the control out, and changes the state a screen reader announces.

switchdirective@ng-native/components
import { Switch } from '@ng-native/components';and add Switch to the component's imports

A toggle, wired for signal forms as a FormCheckboxControl ( checked , not value ). Commits as Switch on iOS and AndroidSwitch on Android.

Inputs

disabled
unknown

Ignore touches and grey out.

thumbColor
string

The colour of the knob.

trackColor
{ readonly false?: string; readonly true?: string }

The track colour for each state.

ios_backgroundColor
string

iOS: the colour behind the track when off, seen where the track is transparent.

Two-way

checked
boolean = false

Angular components as native iOS and Android views, built and shipped with Expo.

An alpha. MIT licensed. Sponsor its development.

An independent project, not affiliated with or endorsed by Google, the Angular team or Expo. Angular is a trademark of Google LLC.