jiosaavn_wrapper 0.0.1+1 copy "jiosaavn_wrapper: ^0.0.1+1" to clipboard
jiosaavn_wrapper: ^0.0.1+1 copied to clipboard

outdated

A wrapper for unofficial jio_saavn api

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:jiosaavn_wrapper/jiosaavn_wrapper.dart';
import 'package:jiosaavn_wrapper/modals/index.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'JioSaavnWrapper Example App',
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  bool searching = false;
  String searchQuery = '';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: searching ? Colors.white : null,
        title: !searching
            ? Text('Awesome Music')
            : CupertinoSearchTextField(
                onChanged: (searchQuery) {
                  setState(() => this.searchQuery = searchQuery.toLowerCase());
                },
              ),
        actions: [
          IconButton(
              onPressed: () {
                setState(() => searching = !searching);
              },
              icon: Icon(
                searching ? Icons.cancel_outlined : Icons.search,
                color: searching ? Colors.black : null,
              ))
        ],
      ),
      body: Container(
        margin: EdgeInsets.symmetric(horizontal: 8, vertical: 4),
        child: searching
            ? searchQuery.isEmpty
                ? Center(
                    child: Text(
                      'Search Something e.g. song name or artist name...',
                    ),
                  )
                : _buildSearchList()
            : _buildTopSongs(),
      ),
    );
  }

  FutureBuilder<SearchResults> _buildSearchList() {
    return FutureBuilder<SearchResults>(
      future: JioSaavnWrapper.fetchSearchResults(searchQuery: searchQuery),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return ListView.builder(
            itemCount: snapshot.data!.songs.data.length,
            itemBuilder: (context, index) => ListTile(
              leading: SizedBox(
                height: 48,
                width: 48,
                child: CachedNetworkImage(
                  imageUrl: snapshot.data!.songs.data[index].image,
                ),
              ),
              title: Text(snapshot.data!.songs.data[index].title),
              subtitle: Text(
                snapshot.data!.songs.data[index].description,
                maxLines: 2,
              ),
            ),
          );
        } else {
          if (snapshot.hasError) {
            return Center(
              child: Text('No results Found....'),
            );
          } else {
            return Center(
              child: Text('Search Something Like song name or artist name...'),
            );
          }
        }
      },
    );
  }

  FutureBuilder<TopSongs?> _buildTopSongs() {
    return FutureBuilder<TopSongs?>(
        future: JioSaavnWrapper.fetchTopSongs(),
        builder: (context, snapshot) => snapshot.hasData
            ? ListView.builder(
                itemCount: snapshot.data?.list?.length ?? 0,
                itemBuilder: (context, index) => Card(
                  elevation: 10,
                  child: ListTile(
                    title: Text(
                      snapshot.data!.list![index].title!.sanitize,
                      maxLines: 1,
                      overflow: TextOverflow.ellipsis,
                    ),
                    subtitle: Text(
                      snapshot.data!.list![index].subtitle?.sanitize ?? '',
                      maxLines: 2,
                    ),
                    leading: SizedBox(
                      height: 48,
                      width: 48,
                      child: ClipRRect(
                        borderRadius: BorderRadius.circular(5),
                        child: CachedNetworkImage(
                          imageUrl: snapshot.data!.list![index].image!,
                        ),
                      ),
                    ),
                    trailing: Icon(Icons.play_arrow_outlined),
                  ),
                ),
              )
            : Center(
                child: CircularProgressIndicator(),
              ));
  }
}