artists.dart 2.0 KB

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