// 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.

// This is a template file for illustrating best practices when creating a
// Flutter API example that uses the Widgets library. To use it, copy the file
// to your destination filename, search/replace 'Placeholder' with the name of
// the class this is an example for, delete this block, and implement your
// example.
//
// The name and location of this file should be:
//
//   examples/api/lib/<library>/<filename_without_dart>/<lower_snake_symbol>.<index>.dart
//
// So, if your example is the third example of the Foo.bar function in the
// "baz.dart" file in the widgets library, then the filename for your example
// should be:
//
//   examples/api/lib/widgets/baz/foo_bar.2.dart
//
// and its (required) associated test should be in:
//
//   examples/api/test/widgets/baz/foo_bar.2_test.dart
//
// The following doc comment should remain, and be a doc comment so that the
// symbol will be linked in the IDE. Don't use the whole description of the
// example, since that should already be in the API docs where this example is
// referenced, and we don't want the two descriptions to diverge. If this sample
// is referenced more than once, link back to the instance the example file is
// named for.

/// Flutter code sample for [Placeholder].

import 'package:flutter/widgets.dart';

void main() {
  runApp(const SampleApp());
}

class SampleApp extends StatelessWidget {
  const SampleApp({super.key});
  @override
  Widget build(BuildContext context) {
    return WidgetsApp(
      color: const Color(0xffffffff),
      builder: (BuildContext context, Widget? child) {
        return const PlaceholderExample();
      },
    );
  }
}

/// Include comments about each class, and make them dartdoc comments, so that
/// links (e.g. [Placeholder]) are active in IDEs.
///
/// Name the classes appropriately for the example (don't leave it as
/// "PlaceholderExample"!).
class PlaceholderExample extends StatelessWidget {
  const PlaceholderExample({super.key});

  @override
  Widget build(BuildContext context) {
    // Since this is an example, add plenty of comments, explaining things that
    // both a newcomer and an experienced user might want to know.
    //
    // TRY THIS: Prefix things with "TRY THIS" in places in the example that
    // might be interesting to modify when exploring what the code does.
    return const Placeholder();
  }
}
