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

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: SnackBarExample(),
    );
  }
}

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

  @override
  State<SnackBarExample> createState() => _SnackBarExampleState();
}

class _SnackBarExampleState extends State<SnackBarExample> {
  bool _largeLogo = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('SnackBar Sample')),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                const SnackBar snackBar = SnackBar(
                  content: Text('A SnackBar has been shown.'),
                  behavior: SnackBarBehavior.floating,
                );
                ScaffoldMessenger.of(context).showSnackBar(snackBar);
              },
              child: const Text('Show SnackBar'),
            ),
            const SizedBox(height: 8.0),
            ElevatedButton(
              onPressed: () {
                setState(() => _largeLogo = !_largeLogo);
              },
              child: Text(_largeLogo ? 'Shrink Logo' : 'Grow Logo'),
            ),
          ],
        ),
      ),
      // A floating [SnackBar] is positioned above [Scaffold.floatingActionButton].
      // If the Widget provided to the floatingActionButton slot takes up too much space
      // for the SnackBar to be visible, an error will be thrown.
      floatingActionButton: Container(
        constraints: BoxConstraints.tightFor(
          width: 150,
          height: _largeLogo ? double.infinity : 150,
        ),
        decoration: const BoxDecoration(
          color: Colors.blueGrey,
          borderRadius: BorderRadius.all(Radius.circular(20)),
        ),
        child: const FlutterLogo(),
      ),
    );
  }
}
