flutter_miniplayer/README.md

122 lines
3.6 KiB
Markdown
Raw Normal View History

2020-07-30 16:01:58 +02:00
[![Pub](https://img.shields.io/pub/v/miniplayer?color=2196F3)](https://pub.dev/packages/miniplayer)
2020-07-30 15:58:35 +02:00
2020-09-23 10:22:29 +02:00
A lightweight flutter package to simplify the creation of a miniplayer by providing a builder function with the current height and percentage progress. The widget responds to tap and drag gestures and is highly customizable.
**What is a miniplayer?**
2020-09-23 10:26:59 +02:00
Miniplayers are commonly used in media applications like Spotify and Youtube. A miniplayer can be expanded and minified and remains on the screen when minified until dismissed by the user.
2020-09-23 10:22:29 +02:00
See the demo below for an example.
2020-07-29 22:13:39 +02:00
2020-08-03 15:03:54 +02:00
## Demo
2020-08-26 14:47:39 +02:00
![demo](./example/demo_gif/demo.gif "demo")
2020-08-03 15:03:54 +02:00
2020-07-30 21:38:41 +02:00
## Usage
2020-07-29 22:13:39 +02:00
2020-07-30 17:02:14 +02:00
```dart
2020-09-26 16:19:58 +02:00
Stack(
children: <Widget>[
YourApp(),
Miniplayer(
minHeight: 70,
maxHeight: 370,
builder: (height, percentage) {
return Center(
child: Text('$height, $percentage'),
);
},
),
],
2020-07-30 17:02:14 +02:00
),
```
2020-09-23 10:22:29 +02:00
2020-09-23 10:26:59 +02:00
## Options
2020-09-23 10:22:29 +02:00
<table>
2020-09-23 15:21:26 +02:00
<tr></tr>
<tr>
<th>Parameter</th>
<th>Implementation</th>
2020-09-24 20:16:03 +02:00
<th>Explanation</th>
2020-09-23 15:21:26 +02:00
</tr>
2020-09-23 10:22:29 +02:00
<tr>
<td>onDismiss</td>
2020-09-23 10:26:59 +02:00
<td>
2020-09-23 10:22:29 +02:00
<pre lang="dart">
Miniplayer(
onDismiss: () {
2020-09-23 10:30:13 +02:00
//Handle onDismissed here
2020-09-23 10:22:29 +02:00
},
),
</pre>
</td>
2020-09-23 10:58:01 +02:00
<td>
2020-09-23 11:44:09 +02:00
<img src="https://raw.githubusercontent.com/peterscodee/miniplayer/master/example/demo_gif/demo_dismiss.gif"/>
2020-09-24 20:16:03 +02:00
<p>If onDismiss is set, the miniplayer can be dismissed</p>
2020-09-23 10:22:29 +02:00
</td>
</tr>
2020-09-23 11:05:30 +02:00
<tr></tr>
2020-09-23 10:58:01 +02:00
<tr>
<td>valueNotifier</td>
<td>
<pre lang="dart">
2020-09-24 20:16:03 +02:00
final ValueNotifier&lt;double&gt; playerExpandProgress =
2020-09-23 10:58:01 +02:00
ValueNotifier(playerMinHeight);
2020-09-24 20:16:03 +02:00
</br>
2020-09-23 10:58:01 +02:00
Miniplayer(
valueNotifier: playerExpandProgress,
),
</pre>
</td>
<td>
2020-09-23 11:44:09 +02:00
<img src="https://raw.githubusercontent.com/peterscodee/miniplayer/master/example/demo_gif/demo_valueNotifier.gif"/>
2020-09-24 20:16:03 +02:00
<p>Allows you to use a global ValueNotifier with the current progress. This can be used to hide the BottomNavigationBar.</p>
2020-09-23 10:58:01 +02:00
</td>
</tr>
2020-09-23 10:22:29 +02:00
</table>
2020-09-26 16:19:58 +02:00
## Persistence
Implementing the miniplayer as described under [usage](https://pub.dev/packages/miniplayer#usage) - for instance by wrapping it in a stack alongside the `Scaffold` body - would work out of the box but has some disadvantages. If you push a new screen via `Navigator.push` the miniplayer would disappear. What we want is a persistent miniplayer which stays on every screen.
You have the option of two methods when it comes to archiving the miniplayer's persistent state, which depends on the use case. The first method is only recommended for simple apps and use cases. If you want to use dialogs or persistent widgets such as a BottomNavigationBar, use the second (slightly more advanced) method
2020-07-30 21:38:41 +02:00
2020-09-26 16:19:58 +02:00
## First method (Simple)
2020-07-31 08:45:33 +02:00
```dart
2020-07-30 21:38:41 +02:00
import 'package:flutter/material.dart';
import 'package:miniplayer/miniplayer.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Miniplayer Demo',
theme: ThemeData(
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
builder: (context, child) { // <--- Important part
return Stack(
children: [
child,
Miniplayer(
minHeight: 70,
maxHeight: 370,
builder: (height, percentage) {
if(percentage > 0.2)
//return Text('!mini');
else
//return Text('mini');
},
),
],
);
},
);
}
}
```
2020-09-26 16:19:58 +02:00
## Second method (Advanced)
2020-07-30 21:38:41 +02:00
2020-08-27 12:20:36 +02:00
[See example](https://pub.dev/packages/miniplayer/example)