artists.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import 'dart:convert';
  2. import 'package:flutter/material.dart';
  3. import 'package:http/http.dart' as http;
  4. import '../utils/url.dart';
  5. import './spinner.dart';
  6. class Artists extends StatefulWidget {
  7. final String apiUrl;
  8. final void Function(String) onSelect;
  9. Artists({
  10. @required this.apiUrl,
  11. @required this.onSelect,
  12. });
  13. @override
  14. _ArtistsWidgetState createState() => _ArtistsWidgetState(apiUrl: this.apiUrl, onSelect: this.onSelect);
  15. }
  16. Future<List<String>> fetchArtists(String apiUrl) async {
  17. final response = await http.get(formattedUrl(apiUrl, '/artists'));
  18. if (response.statusCode == 200) {
  19. return List<String>.from(jsonDecode(response.body)['artists']);
  20. } else {
  21. throw Exception('Failed to load artists');
  22. }
  23. }
  24. class _ArtistsWidgetState extends State<Artists> {
  25. String apiUrl;
  26. Future<List<String>> artists;
  27. final void Function(String) onSelect;
  28. _ArtistsWidgetState({
  29. @required this.apiUrl,
  30. @required this.onSelect,
  31. });
  32. @override
  33. void initState() {
  34. super.initState();
  35. artists = fetchArtists(this.apiUrl);
  36. }
  37. @override
  38. Widget build(BuildContext context) {
  39. return FutureBuilder<List<String>>(
  40. future: artists,
  41. builder: (context, snapshot) {
  42. if (snapshot.hasData) {
  43. return ListView(
  44. padding: EdgeInsets.only(left: 8, right: 8),
  45. children: snapshot.data.map((artist) => InkWell(
  46. onTap: () {
  47. onSelect(artist);
  48. },
  49. child: SizedBox(
  50. height: 40,
  51. width: MediaQuery.of(context).size.width,
  52. child: Container(
  53. child: Align(
  54. alignment: Alignment.centerLeft,
  55. child: Text(
  56. artist.length == 0 ? 'Unknown artist' : artist,
  57. style: TextStyle(
  58. fontSize: 18,
  59. ),
  60. ),
  61. ),
  62. ),
  63. ),
  64. )).toList(),
  65. );
  66. }
  67. if (snapshot.hasError) {
  68. return Text("${snapshot.error}");
  69. }
  70. return CenterSpinner();
  71. },
  72. );
  73. }
  74. }