Flutter迷你播放器插件flutter_miniplayer的使用
Flutter迷你播放器插件flutter_miniplayer的使用
什么是迷你播放器?
迷你播放器通常用于媒体应用,如Spotify和YouTube。迷你播放器可以被扩展和缩小,并且在缩小时会留在屏幕上,直到用户将其关闭。
示例演示
查看下面的示例演示:
使用说明
Stack(
children: [
YourApp(),
Miniplayer(
minHeight: 70,
maxHeight: 370,
builder: (height, percentage) {
return Center(
child: Text('$height, $percentage'),
);
},
),
],
),
可选参数
参数 | 实现方式 | 示例 |
---|---|---|
onDismiss | onDismiss: () { //Handle onDismissed here } |
如果设置了 onDismiss ,迷你播放器可以被关闭。 |
valueNotifier | final ValueNotifier<double> playerExpandProgress = ValueNotifier(playerMinHeight); Miniplayer(valueNotifier: playerExpandProgress, ...) |
允许您使用全局 ValueNotifier 来获取当前进度。这可以用来隐藏BottomNavigationBar 。 |
controller | final MiniplayerController controller = MiniplayerController(); Miniplayer(controller: controller, ...) |
持久性
将迷你播放器像上面“使用”部分中描述的那样实现(例如,将其包裹在Stack
中)可以在一定程度上工作,但有一些缺点。 如果您通过Navigator.push
切换到新屏幕,迷你播放器将会消失。 我们想要的是一个持久的迷你播放器,它会一直停留在屏幕上。
如果您希望实现持久性,您可以选择两种嵌入选项,这取决于您的应用场景。第一种方法仅推荐给简单的应用程序。如果您想使用对话框或其他持久性控件,如底部导航栏,第二种(稍微更高级)的方法是合适的。
第一种方法(简单)
使用Stack
在MaterialApp.builder
方法中
import 'package:flutter/material.dart';
import 'package:flutter_miniplayer/flutter_miniplayer.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Miniplayer example',
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');
},
),
],
);
},
);
}
}
第二种方法(高级)
使用Stack
结合自定义Navigator
import 'package:flutter/material.dart';
import 'package:flutter_miniplayer/flutter_miniplayer.dart';
void main() => runApp(MyApp());
final _navigatorKey = GlobalKey();
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Miniplayer example',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primaryColor: Color(0xFFFAFAFA),
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MiniplayerWillPopScope(
onWillPop: () async {
final NavigatorState navigator = _navigatorKey.currentState;
if (!navigator.canPop()) return true;
navigator.pop();
return false;
},
child: Scaffold(
body: Stack(
children: [
Navigator(
key: _navigatorKey,
onGenerateRoute: (RouteSettings settings) => MaterialPageRoute(
settings: settings,
builder: (BuildContext context) => FirstScreen(),
),
),
Miniplayer(
minHeight: 70,
maxHeight: 370,
builder: (height, percentage) => Center(
child: Text('$height, $percentage'),
),
),
],
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: 0,
fixedColor: Colors.blue,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.mail),
label: 'Messages',
),
BottomNavigationBarItem(
icon: Icon(Icons.person),
label: 'Profile',
)
],
),
),
);
}
}
class FirstScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Demo: FirstScreen')),
body: Container(
constraints: BoxConstraints.expand(),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondScreen()),
),
child: const Text('Open SecondScreen'),
),
ElevatedButton(
onPressed: () => Navigator.of(context, rootNavigator: true).push(
MaterialPageRoute(builder: (context) => ThirdScreen()),
),
child: const Text('Open ThirdScreen with root Navigator'),
),
],
),
),
);
}
}
class SecondScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Demo: SecondScreen')),
body: Center(child: Text('SecondScreen')),
);
}
}
class ThirdScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Demo: ThirdScreen')),
body: Center(child: Text('ThirdScreen')),
);
}
}
更多关于Flutter迷你播放器插件flutter_miniplayer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter迷你播放器插件flutter_miniplayer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用flutter_miniplayer
插件的示例代码。这个插件允许你创建一个迷你播放器,适用于音频或视频播放。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_miniplayer
依赖:
dependencies:
flutter:
sdk: flutter
flutter_miniplayer: ^最新版本号 # 替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
接下来,是一个简单的示例代码,展示如何在Flutter应用中使用flutter_miniplayer
插件。
import 'package:flutter/material.dart';
import 'package:flutter_miniplayer/flutter_miniplayer.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Mini Player Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late FlutterMiniPlayerController _miniPlayerController;
@override
void initState() {
super.initState();
// 初始化MiniPlayer控制器
_miniPlayerController = FlutterMiniPlayerController(
// 配置MiniPlayer的属性
miniPlayerConfig: MiniPlayerConfig(
title: 'Mini Player Demo',
isLooping: false,
showControlBar: true,
autoPlay: false,
),
);
// 设置音频或视频资源(这里以音频为例)
_miniPlayerController.loadAsset('assets/sample_audio.mp3');
// 监听播放状态变化
_miniPlayerController.addListener(() {
setState(() {}); // 更新UI以反映播放状态变化
});
}
@override
void dispose() {
// 释放资源
_miniPlayerController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Mini Player Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () {
if (_miniPlayerController.value.isPlaying) {
_miniPlayerController.pause();
} else {
_miniPlayerController.play();
}
},
child: Text(_miniPlayerController.value.isPlaying ? 'Pause' : 'Play'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
_miniPlayerController.stop();
},
child: Text('Stop'),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 显示或隐藏MiniPlayer
_miniPlayerController.toggleVisibility();
},
tooltip: 'Toggle MiniPlayer',
child: Icon(Icons.minimize),
),
);
}
}
注意事项:
- 资源文件:确保你在
assets
文件夹中有一个名为sample_audio.mp3
的音频文件,或者根据需要修改资源路径。 - 权限:如果播放的是本地视频或音频文件,确保在
AndroidManifest.xml
和Info.plist
文件中配置了相应的权限。 - iOS配置:对于iOS平台,需要在
Info.plist
中添加NSAppTransportSecurity
配置以允许网络请求(如果需要的话)。
这个示例代码展示了如何初始化flutter_miniplayer
插件,加载音频资源,并控制播放、暂停和停止操作。同时,它还展示了如何显示或隐藏迷你播放器。你可以根据实际需求进一步定制和扩展此示例。