56 lines
1.3 KiB
Dart
56 lines
1.3 KiB
Dart
|
import 'dart:math';
|
||
|
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:music_web_player/api.dart';
|
||
|
import 'package:music_web_player/ui/cover_image.dart';
|
||
|
|
||
|
class MusicPlayer extends StatefulWidget {
|
||
|
final MusicsList musicsList;
|
||
|
|
||
|
const MusicPlayer({Key? key, required this.musicsList}) : super(key: key);
|
||
|
|
||
|
@override
|
||
|
State<MusicPlayer> createState() => _MusicPlayerState();
|
||
|
}
|
||
|
|
||
|
class _MusicPlayerState extends State<MusicPlayer> {
|
||
|
final rng = Random();
|
||
|
|
||
|
final List<MusicEntry> stack = [];
|
||
|
int currMusicPos = 0;
|
||
|
|
||
|
MusicEntry get currMusic {
|
||
|
if (currMusicPos < 0) currMusicPos = 0;
|
||
|
|
||
|
// Automatically choose next music if required
|
||
|
if (currMusicPos >= stack.length) {
|
||
|
var nextId = rng.nextInt(widget.musicsList.length);
|
||
|
stack.add(widget.musicsList[nextId]);
|
||
|
}
|
||
|
|
||
|
return stack[currMusicPos];
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return LayoutBuilder(
|
||
|
builder: (context, constraints) => Stack(
|
||
|
children: [
|
||
|
// Background image
|
||
|
CoverImage(
|
||
|
music: currMusic,
|
||
|
width: constraints.maxWidth,
|
||
|
height: constraints.maxHeight,
|
||
|
fit: BoxFit.cover,
|
||
|
),
|
||
|
_buildFront(),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
Widget _buildFront() {
|
||
|
return Text(currMusic.artist + " - " + currMusic.title);
|
||
|
}
|
||
|
}
|