| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import 'dart:convert';
- import 'package:flutter/material.dart';
- import 'package:flutter/widgets.dart';
- import 'package:http/http.dart' as http;
- import '../types/song.dart';
- import '../utils/url.dart';
- import './spinner.dart';
- class Songs extends StatefulWidget {
- final String apiUrl;
- final String artist;
- final String album;
- final void Function(int) onSelect;
- Songs({
- @required this.apiUrl,
- @required this.artist, // can be an empty string
- @required this.album, // can be an empty string
- @required this.onSelect,
- });
- @override
- _SongsWidgetState createState() => _SongsWidgetState(
- apiUrl: this.apiUrl,
- artist: this.artist,
- album: this.album,
- onSelect: this.onSelect,
- );
- }
- Future<List<Song>> fetchSongs(String apiUrl, String artist) async {
- final response = await http.get(formattedUrl(apiUrl, '/songs', {
- 'artist': artist,
- }));
- if (response.statusCode != 200) {
- throw Exception('Failed to load songs');
- }
- List<Song> songs = [];
- var responseJson = jsonDecode(response.body)['songs'];
- for (var i = 0; i < responseJson.length; i++) {
- songs.add(Song.fromJson(responseJson[i]));
- }
- return songs;
- }
- class _SongsWidgetState extends State<Songs> {
- final String apiUrl;
- final String artist;
- final String album;
- Future<List<Song>> songs;
- final void Function(int) onSelect;
- _SongsWidgetState({
- @required this.apiUrl,
- @required this.artist,
- @required this.album,
- @required this.onSelect,
- });
- @override
- void initState() {
- super.initState();
- songs = fetchSongs(this.apiUrl, this.artist);
- }
- @override
- Widget build(BuildContext context) {
- return FutureBuilder<List<Song>>(
- future: songs,
- builder: (context, snapshot) {
- if (snapshot.hasData) {
- var filteredAlbums = this.album == null
- ? snapshot.data
- : snapshot.data.where((song) => song.album == this.album);
- return ListView(
- padding: EdgeInsets.only(left: 8, right: 8),
- children: filteredAlbums.map<Widget>((song) => Container(
- height: 40,
- color: Colors.white,
- child: Align(
- alignment: Alignment.centerLeft,
- child: TextButton(
- child: Text("${song.track} - ${song.title.length == 0 ? 'Untitled Track' : song.title}"),
- onPressed: () {
- onSelect(song.id);
- },
- style: TextButton.styleFrom(
- textStyle: TextStyle(fontSize: 18, fontStyle: FontStyle.normal),
- primary: Colors.black,
- ),
- ),
- ),
- )).toList(),
- );
- }
- if (snapshot.hasError) {
- return Text("${snapshot.error}");
- }
- return CenterSpinner();
- },
- );
- }
- }
|