browser.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import 'package:flutter/widgets.dart';
  2. import 'package:get/get.dart';
  3. import 'package:gmus/components/spinner.dart';
  4. import 'package:gmus/components/statefullist.dart';
  5. import 'package:gmus/types/song.dart';
  6. import '../controller.dart';
  7. import './albums.dart';
  8. import './artists.dart';
  9. import './songs.dart';
  10. class Browser extends StatefulWidget {
  11. @override
  12. _BrowserWidgetState createState() => _BrowserWidgetState();
  13. }
  14. class _BrowserWidgetState extends State<Browser> with SingleTickerProviderStateMixin {
  15. final Controller controller = Get.find();
  16. PageController _pageController;
  17. Widget _artistList;
  18. RxBool _artistsLoading = false.obs;
  19. RxList<String> _artists = <String>[].obs;
  20. Rx<Future<List<String>>> _albums = Future.value(<String>[]).obs;
  21. Rx<Future<List<Song>>> _songs = Future.value(<Song>[]).obs;
  22. void _jumpToPage(int page) {
  23. _pageController.animateToPage(page, duration: Duration(milliseconds: 500), curve: Curves.ease);
  24. }
  25. void _jumpToAlbums() {
  26. this._jumpToPage(1);
  27. }
  28. void _jumpToSongs() {
  29. this._jumpToPage(2);
  30. }
  31. RxString selectedArtist;
  32. RxString selectedAlbum;
  33. void _onSelectArtist(String artist) {
  34. this.selectedArtist = artist.obs;
  35. _albums.value = fetchAlbums(controller.apiUrl.value, this.selectedArtist.value);
  36. this._jumpToAlbums();
  37. }
  38. void _onSelectAlbum(String artist, String album) {
  39. this.selectedAlbum = album.obs;
  40. _songs.value = fetchSongs(controller.apiUrl.value, this.selectedArtist.value);
  41. this._jumpToSongs();
  42. }
  43. void _onSelectSong(int songId) {
  44. controller.playSong(songId);
  45. }
  46. Future<void> _loadArtists() async {
  47. _artistsLoading.value = true;
  48. _artists.assignAll(await fetchArtists(controller.apiUrl.value));
  49. _artistsLoading.value = false;
  50. }
  51. @override
  52. void initState() {
  53. super.initState();
  54. _pageController = new PageController();
  55. _loadArtists();
  56. }
  57. @override
  58. void dispose() {
  59. super.dispose();
  60. _pageController.dispose();
  61. }
  62. Widget _buildArtist(BuildContext context, int index) {
  63. return Artist(artist: _artists[index], onSelect: _onSelectArtist);
  64. }
  65. @override
  66. Widget build(BuildContext context) {
  67. return Obx(() {
  68. if (_artistsLoading.isTrue) {
  69. return CenterSpinner();
  70. }
  71. if (_artistList == null) {
  72. _artistList = new StatefulListView(_artists.length, _buildArtist);
  73. }
  74. return PageView(
  75. controller: _pageController,
  76. children: <Widget>[
  77. _artistList,
  78. Obx(() => Albums(
  79. artist: this.selectedArtist?.value,
  80. albums: this._albums.value,
  81. onSelect: this._onSelectAlbum,
  82. )),
  83. Obx(() => Songs(
  84. artist: this.selectedArtist?.value,
  85. album: this.selectedAlbum?.value,
  86. songs: this._songs.value,
  87. onSelect: this._onSelectSong,
  88. )),
  89. ],
  90. pageSnapping: true,
  91. );
  92. });
  93. }
  94. }