| // 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. |
| |
| import 'package:flutter/material.dart'; |
| |
| /// Flutter code sample for [Switch.adaptive]. |
| |
| void main() => runApp(const SwitchApp()); |
| |
| class SwitchApp extends StatefulWidget { |
| const SwitchApp({super.key}); |
| |
| @override |
| State<SwitchApp> createState() => _SwitchAppState(); |
| } |
| |
| class _SwitchAppState extends State<SwitchApp> { |
| bool isMaterial = true; |
| bool isCustomized = false; |
| |
| @override |
| Widget build(BuildContext context) { |
| final ThemeData theme = ThemeData( |
| platform: isMaterial ? TargetPlatform.android : TargetPlatform.iOS, |
| adaptations: <Adaptation<Object>>[ |
| if (isCustomized) const _SwitchThemeAdaptation() |
| ] |
| ); |
| final ButtonStyle style = OutlinedButton.styleFrom( |
| fixedSize: const Size(220, 40), |
| ); |
| |
| return MaterialApp( |
| theme: theme, |
| home: Scaffold( |
| appBar: AppBar(title: const Text('Adaptive Switches')), |
| body: Column( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| OutlinedButton( |
| style: style, |
| onPressed: () { |
| setState(() { |
| isMaterial = !isMaterial; |
| }); |
| }, |
| child: isMaterial ? const Text('Show cupertino style') : const Text('Show material style'), |
| ), |
| OutlinedButton( |
| style: style, |
| onPressed: () { |
| setState(() { |
| isCustomized = !isCustomized; |
| }); |
| }, |
| child: isCustomized ? const Text('Remove customization') : const Text('Add customization'), |
| ), |
| const SizedBox(height: 20), |
| const SwitchWithLabel(label: 'enabled', enabled: true), |
| const SwitchWithLabel(label: 'disabled', enabled: false), |
| ], |
| ), |
| ), |
| ); |
| } |
| } |
| |
| class SwitchWithLabel extends StatefulWidget { |
| const SwitchWithLabel({ |
| super.key, |
| required this.enabled, |
| required this.label, |
| }); |
| |
| final bool enabled; |
| final String label; |
| |
| @override |
| State<SwitchWithLabel> createState() => _SwitchWithLabelState(); |
| } |
| |
| class _SwitchWithLabelState extends State<SwitchWithLabel> { |
| bool active = true; |
| |
| @override |
| Widget build(BuildContext context) { |
| return Row( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| Container( |
| width: 150, |
| padding: const EdgeInsets.only(right: 20), |
| child: Text(widget.label) |
| ), |
| Switch.adaptive( |
| value: active, |
| onChanged: !widget.enabled ? null : (bool value) { |
| setState(() { |
| active = value; |
| }); |
| }, |
| ), |
| ], |
| ); |
| } |
| } |
| |
| |
| class _SwitchThemeAdaptation extends Adaptation<SwitchThemeData> { |
| const _SwitchThemeAdaptation(); |
| |
| @override |
| SwitchThemeData adapt(ThemeData theme, SwitchThemeData defaultValue) { |
| switch (theme.platform) { |
| case TargetPlatform.android: |
| case TargetPlatform.fuchsia: |
| case TargetPlatform.linux: |
| case TargetPlatform.windows: |
| return defaultValue; |
| case TargetPlatform.iOS: |
| case TargetPlatform.macOS: |
| return SwitchThemeData( |
| thumbColor: MaterialStateProperty.resolveWith<Color?>((Set<MaterialState> states) { |
| if (states.contains(MaterialState.selected)) { |
| return Colors.yellow; |
| } |
| return null; // Use the default. |
| }), |
| trackColor: const MaterialStatePropertyAll<Color>(Colors.brown), |
| ); |
| } |
| } |
| } |