/* ============= Author: Lucas Josino Github: https://github.com/LucJosin Website: https://www.lucasjosino.com/ ============= Plugin/Id: on_audio_query#0 Homepage: https://github.com/LucJosin/on_audio_query Pub: https://pub.dev/packages/on_audio_query License: https://github.com/LucJosin/on_audio_query/blob/main/on_audio_query/LICENSE Copyright: © 2021, Lucas Josino. All rights reserved. ============= */ import 'package:flutter/material.dart'; import 'package:on_audio_query/on_audio_query.dart'; void main() { runApp( const MaterialApp( home: Songs(), ), ); } class Songs extends StatefulWidget { const Songs({Key? key}) : super(key: key); @override _SongsState createState() => _SongsState(); } class _SongsState extends State { // Main method. final OnAudioQuery _audioQuery = OnAudioQuery(); // Indicate if application has permission to the library. bool _hasPermission = false; @override void initState() { super.initState(); // (Optinal) Set logging level. By default will be set to 'WARN'. // // Log will appear on: // * XCode: Debug Console // * VsCode: Debug Console // * Android Studio: Debug and Logcat Console LogConfig logConfig = LogConfig(logType: LogType.DEBUG); _audioQuery.setLogConfig(logConfig); // Check and request for permission. checkAndRequestPermissions(); } checkAndRequestPermissions({bool retry = false}) async { // The param 'retryRequest' is false, by default. _hasPermission = await _audioQuery.checkAndRequest( retryRequest: retry, ); // Only call update the UI if application has all required permissions. _hasPermission ? setState(() {}) : null; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("OnAudioQueryExample"), elevation: 2, ), body: Center( child: !_hasPermission ? noAccessToLibraryWidget() : FutureBuilder>( // Default values: future: _audioQuery.querySongs( sortType: null, orderType: OrderType.ASC_OR_SMALLER, uriType: UriType.EXTERNAL, ignoreCase: true, ), builder: (context, item) { // Display error, if any. if (item.hasError) { return Text(item.error.toString()); } // Waiting content. if (item.data == null) { return const CircularProgressIndicator(); } // 'Library' is empty. if (item.data!.isEmpty) return const Text("Nothing found!"); // You can use [item.data!] direct or you can create a: // List songs = item.data!; return ListView.builder( itemCount: item.data!.length, itemBuilder: (context, index) { return ListTile( title: Text(item.data![index].title), subtitle: Text(item.data![index].artist ?? "No Artist"), trailing: const Icon(Icons.arrow_forward_rounded), // This Widget will query/load image. // You can use/create your own widget/method using [queryArtwork]. leading: QueryArtworkWidget( controller: _audioQuery, id: item.data![index].id, type: ArtworkType.AUDIO, ), ); }, ); }, ), ), ); } Widget noAccessToLibraryWidget() { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.redAccent.withOpacity(0.5), ), padding: const EdgeInsets.all(20), child: Column( mainAxisSize: MainAxisSize.min, children: [ const Text("Application doesn't have access to the library"), const SizedBox(height: 10), ElevatedButton( onPressed: () => checkAndRequestPermissions(retry: true), child: const Text("Allow"), ), ], ), ); } }