144 lines
4.5 KiB
Dart
144 lines
4.5 KiB
Dart
/*
|
|
=============
|
|
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<Songs> {
|
|
// 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<List<SongModel>>(
|
|
// 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<SongModel> 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"),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|