import 'dart:io'; import 'package:flutter/material.dart'; import 'package:audioplayers/audioplayers.dart'; class Level extends StatefulWidget { const Level({super.key, required this.stepmaniaFolderPath}); final String stepmaniaFolderPath; @override State createState() => _LevelState(); } class _LevelState extends State { final _player = AudioPlayer(); bool _isPlaying = true; @override Widget build(BuildContext context) { String audioPath = Directory(widget.stepmaniaFolderPath) .listSync() .firstWhere((entity) => entity.path.endsWith('.ogg'), orElse: () => File('')) .path; _player.play(DeviceFileSource(audioPath)); return Scaffold( appBar: AppBar( leading: IconButton( icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow), onPressed: () => { if (_isPlaying) { _player.pause(), setState(() { _isPlaying = false; }) } else { _player.resume(), setState(() { _isPlaying = true; }) }, }, ), title: Text('Level 1'), actions: [ IconButton( icon: Icon(Icons.close), onPressed: () => Navigator.pop(context)) ], ), body: Stack(children: [ Arrow( position: -100.0, ), Arrow( position: 00.0, ), Arrow( position: 100.0, ), Arrow( position: 200.0, ), Positioned( top: 50, width: MediaQuery.of(context).size.width, left: 0, child: Text( "Great!", textScaler: TextScaler.linear(4), textAlign: TextAlign.center, ), ), Positioned( left: MediaQuery.of(context).size.width / 2 - 50, bottom: 50, child: Container( width: 100, height: 100, decoration: BoxDecoration( shape: BoxShape.circle, // color: Colors.blue, border: Border.all(color: Colors.black, width: 10)), ), ), ])); } @override void dispose() { _player.dispose(); super.dispose(); } } class Arrow extends StatelessWidget { final double position; const Arrow({super.key, required this.position}); @override Widget build(BuildContext context) { return Positioned( left: MediaQuery.of(context).size.width / 2 - 25, // Center the arrow top: position, child: Icon(size: 100, Icons.arrow_forward), ); } }