// 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 [ListTile].

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(colorSchemeSeed: const Color(0xff6750a4), useMaterial3: true),
      home: const ListTileExample(),
    );
  }
}

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

  @override
  State<ListTileExample> createState() => _ListTileExampleState();
}

class _ListTileExampleState extends State<ListTileExample> {
  bool _selected = false;
  bool _enabled = true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('ListTile Sample')),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          ListTile(
            enabled: _enabled,
            selected: _selected,
            onTap: () {
              setState(() {
                // This is called when the user toggles the switch.
                _selected = !_selected;
              });
            },
            // This sets text color and icon color to red when list tile is disabled and
            // green when list tile is selected, otherwise sets it to black.
            iconColor: MaterialStateColor.resolveWith((Set<MaterialState> states) {
              if (states.contains(MaterialState.disabled)) {
                return Colors.red;
              }
              if (states.contains(MaterialState.selected)) {
                return Colors.green;
              }
              return Colors.black;
            }),
            // This sets text color and icon color to red when list tile is disabled and
            // green when list tile is selected, otherwise sets it to black.
            textColor: MaterialStateColor.resolveWith((Set<MaterialState> states) {
              if (states.contains(MaterialState.disabled)) {
                return Colors.red;
              }
              if (states.contains(MaterialState.selected)) {
                return Colors.green;
              }
              return Colors.black;
            }),
            leading: const Icon(Icons.person),
            title: const Text('Headline'),
            subtitle: Text('Enabled: $_enabled, Selected: $_selected'),
            trailing: Switch(
              onChanged: (bool? value) {
                // This is called when the user toggles the switch.
                setState(() {
                  _enabled = value!;
                });
              },
              value: _enabled,
            ),
          ),
        ],
      ),
    );
  }
}
