diff --git a/images/xylophone.png b/images/xylophone.png new file mode 100644 index 0000000..4ae8c59 Binary files /dev/null and b/images/xylophone.png differ diff --git a/posts/05_xylophone.md b/posts/05_xylophone.md new file mode 100644 index 0000000..eb5fc7b --- /dev/null +++ b/posts/05_xylophone.md @@ -0,0 +1,174 @@ +--- +title: "Flutter Xylophone Project Study Guide" +tags: + - project-05 +--- + +# Xylophone Flutter Project Study Guide + +## 1. Project Overview + +The Xylophone project is a Flutter application that simulates a xylophone instrument. It features: + +- A colorful interface resembling xylophone keys +- Audio playback of xylophone notes when keys are tapped +- Utilization of the `audioplayers` package for sound management +- Implementation of repeated UI elements using Flutter's widget system + +## 2. Key Components Analysis + +### Breakdown of main.dart file + +The `main.dart` file is structured into two main parts: +1. The `main()` function, serving as the entry point +2. The `XylophoneApp` widget and its state class `_XylophoneAppState` + +### Entry point explanation + +```dart +void main() { + runApp(const XylophoneApp()); +} +``` + +This simple `main()` function calls `runApp()` with an instance of `XylophoneApp`, initiating the Flutter application. + +### Main widget structure + +The app uses a `StatefulWidget` called `XylophoneApp`: + +```dart +class XylophoneApp extends StatefulWidget { + const XylophoneApp({super.key}); + + @override + State createState() => _XylophoneAppState(); +} + +class _XylophoneAppState extends State { + // State management and build method +} +``` + +This structure allows the app to manage its state, particularly for audio playback. + +## 3. Widget Tree Visualization + +```mermaid +graph TD + A[MaterialApp] --> B[Scaffold] + B --> C[SafeArea] + C --> D[Column] + D --> E[Expanded TextButton 1] + D --> F[Expanded TextButton 2] + D --> G[Expanded TextButton 3] + D --> H[Expanded TextButton 4] + D --> I[Expanded TextButton 5] + D --> J[Expanded TextButton 6] + D --> K[Expanded TextButton 7] +``` + +## 4. Key Widgets and Their Purposes + +1. `MaterialApp`: Provides the overall structure and theme for the app. +2. `Scaffold`: Implements the basic material design layout structure. +3. `SafeArea`: Ensures the app's content is displayed within the safe area of the device. +4. `Column`: Arranges the xylophone keys vertically. +5. `Expanded`: Ensures each key takes up an equal amount of vertical space. +6. `TextButton`: Represents each xylophone key, handling tap events and visual appearance. + +## 5. State Management + +The app uses a `StatefulWidget` to manage its state, primarily for audio playback: + +```dart +class _XylophoneAppState extends State { + late final AudioPlayer _player; + + @override + void initState() { + super.initState(); + _player = AudioPlayer(); + } + + @override + void dispose() { + _player.dispose(); + super.dispose(); + } + + Future playAudio(int noteNumber) async { + await _player.play(AssetSource('note$noteNumber.wav')); + } + + // build method and other widget logic +} +``` + +- An `AudioPlayer` instance is created in `initState()` and disposed of in `dispose()`. +- The `playAudio()` method manages the state of audio playback. + +## 6. Styling and Customization + +The app uses a simple yet effective styling approach: +- Each xylophone key is represented by a `TextButton` with a distinct background color. +- Colors are defined in a static list: `_colors`. +- The `Scaffold` has a black background for contrast. +- `TextButton`s are styled with `TextButton.styleFrom()` to remove default padding and rounded corners. + +## 7. Layout Techniques + +The app employs a straightforward layout: +- A `Column` widget arranges the xylophone keys vertically. +- Each key is wrapped in an `Expanded` widget to ensure equal vertical distribution. +- `CrossAxisAlignment.stretch` is used to make each key span the full width of the screen. + +## 8. Asset Management + +Assets are declared in the `pubspec.yaml` file: + +```yaml +flutter: + uses-material-design: true + + assets: + - assets/ +``` + +This configuration includes all files in the `assets/` directory as app assets. + +Audio files are played using the `audioplayers` package: + +```dart +await _player.play(AssetSource('note$noteNumber.wav')); +``` + +## 9. Learning Outcomes + +Key Flutter/Dart concepts demonstrated in this project: +1. Stateful Widget implementation +2. Use of external packages (audioplayers) +3. Asset management for audio files +4. Creating reusable widget functions +5. List generation with `List.generate()` +6. Dart arrow syntax for concise function definitions +7. Basic Flutter app structure and layout techniques + +## Finished App + +![Finished App](../images/xylophone.png) + +## 10. Exercises to Reinforce Learning + +1. Add visual feedback when a key is pressed (e.g., a brief color change or animation). +2. Implement a feature to record and playback a sequence of notes. +3. Add a volume control slider that affects all note playbacks. +4. Create an alternate layout for landscape orientation. +5. Extend the app to include multiple instrument sounds, allowing the user to switch between them. + +## 11. Additional Resources + +- [Flutter audioplayers package documentation](https://pub.dev/packages/audioplayers) +- [Flutter layout tutorial](https://docs.flutter.dev/development/ui/layout/tutorial) +- [Dart language tour](https://dart.dev/guides/language/language-tour) +- [Flutter state management overview](https://docs.flutter.dev/development/data-and-backend/state-mgmt/options) \ No newline at end of file