albums.dart 2.2 KB

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