// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/// Flutter code sample for [CupertinoSwitch].

import 'package:flutter/cupertino.dart';

void main() => runApp(const CupertinoSwitchApp());

class CupertinoSwitchApp extends StatelessWidget {
  const CupertinoSwitchApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const CupertinoApp(
      theme: CupertinoThemeData(brightness: Brightness.light),
      home: CupertinoSwitchExample(),
    );
  }
}

class CupertinoSwitchExample extends StatefulWidget {
  const CupertinoSwitchExample({super.key});

  @override
  State<CupertinoSwitchExample> createState() => _CupertinoSwitchExampleState();
}

class _CupertinoSwitchExampleState extends State<CupertinoSwitchExample> {
  bool wifi = true;

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: const CupertinoNavigationBar(
        middle: Text('CupertinoSwitch Sample'),
      ),
      child: Center(
        // CupertinoFormRow's main axis is set to max by default.
        // Set the intrinsic height widget to center the CupertinoFormRow.
        child: IntrinsicHeight(
          child: Container(
            color: CupertinoTheme.of(context).barBackgroundColor,
            child: CupertinoFormRow(
              prefix: Row(
                children: <Widget>[
                  Icon(
                    // Wifi icon is updated based on switch value.
                    wifi ? CupertinoIcons.wifi : CupertinoIcons.wifi_slash,
                    color: wifi ? CupertinoColors.systemBlue : CupertinoColors.systemRed,
                  ),
                  const SizedBox(width: 10),
                  const Text('Wi-Fi')
                ],
              ),
              child: CupertinoSwitch(
                // This bool value toggles the switch.
                value: wifi,
                thumbColor: CupertinoColors.systemBlue,
                trackColor: CupertinoColors.systemRed.withOpacity(0.14),
                activeColor: CupertinoColors.systemRed.withOpacity(0.64),
                onChanged: (bool? value) {
                  // This is called when the user toggles the switch.
                  setState(() {
                    wifi = value!;
                  });
                },
              ),
            ),
          ),
        ),
      ),
    );
  }
}
