albums.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import 'dart:convert';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/widgets.dart';
  4. import 'package:http/http.dart' as http;
  5. import '../utils/url.dart';
  6. import './spinner.dart';
  7. class Albums extends StatefulWidget {
  8. final String apiUrl;
  9. final String artist;
  10. final void Function(String, String) onSelect;
  11. Albums({
  12. @required this.apiUrl,
  13. @required this.artist,
  14. @required this.onSelect,
  15. });
  16. @override
  17. _AlbumsWidgetState createState() => _AlbumsWidgetState(apiUrl: this.apiUrl, artist: this.artist, onSelect: this.onSelect);
  18. }
  19. Future<List<String>> fetchAlbums(String apiUrl, String artist) async {
  20. final response = await http.get(formattedUrl(apiUrl, '/albums', {
  21. 'artist': artist,
  22. }));
  23. if (response.statusCode == 200) {
  24. return List<String>.from(jsonDecode(response.body)['albums']);
  25. } else {
  26. throw Exception('Failed to load albums');
  27. }
  28. }
  29. const allAlbums = 'All albums';
  30. class _AlbumsWidgetState extends State<Albums> {
  31. final String apiUrl;
  32. final String artist;
  33. Future<List<String>> albums;
  34. final void Function(String, String) onSelect;
  35. _AlbumsWidgetState({
  36. @required this.apiUrl,
  37. @required this.artist,
  38. @required this.onSelect,
  39. });
  40. @override
  41. void initState() {
  42. super.initState();
  43. albums = fetchAlbums(this.apiUrl, this.artist);
  44. }
  45. @override
  46. Widget build(BuildContext context) {
  47. return FutureBuilder<List<String>>(
  48. future: albums,
  49. builder: (context, snapshot) {
  50. if (snapshot.hasData) {
  51. List<String> albumsWithAll = snapshot.data.sublist(0);
  52. albumsWithAll.insert(0, allAlbums);
  53. return ListView(
  54. padding: EdgeInsets.only(left: 8, right: 8),
  55. children: albumsWithAll.map((album) => Container(
  56. height: 40,
  57. color: Colors.white,
  58. child: Align(
  59. alignment: Alignment.centerLeft,
  60. child: TextButton(
  61. child: Text(album.length == 0 ? 'Unknown album' : album),
  62. onPressed: () {
  63. onSelect(artist, album == allAlbums ? null : album);
  64. },
  65. style: TextButton.styleFrom(
  66. textStyle: TextStyle(fontSize: 18, fontStyle: FontStyle.normal),
  67. primary: Colors.black,
  68. ),
  69. ),
  70. ),
  71. )).toList(),
  72. );
  73. }
  74. if (snapshot.hasError) {
  75. return Text("${snapshot.error}");
  76. }
  77. return CenterSpinner();
  78. },
  79. );
  80. }
  81. }