Flutter迷你播放器插件flutter_miniplayer的使用

发布于 1周前 作者 itying888 来自 Flutter

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切换到新屏幕,迷你播放器将会消失。 我们想要的是一个持久的迷你播放器,它会一直停留在屏幕上。

如果您希望实现持久性,您可以选择两种嵌入选项,这取决于您的应用场景。第一种方法仅推荐给简单的应用程序。如果您想使用对话框或其他持久性控件,如底部导航栏,第二种(稍微更高级)的方法是合适的。

第一种方法(简单)

使用StackMaterialApp.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

1 回复

更多关于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),
      ),
    );
  }
}

注意事项:

  1. 资源文件:确保你在assets文件夹中有一个名为sample_audio.mp3的音频文件,或者根据需要修改资源路径。
  2. 权限:如果播放的是本地视频或音频文件,确保在AndroidManifest.xmlInfo.plist文件中配置了相应的权限。
  3. iOS配置:对于iOS平台,需要在Info.plist中添加NSAppTransportSecurity配置以允许网络请求(如果需要的话)。

这个示例代码展示了如何初始化flutter_miniplayer插件,加载音频资源,并控制播放、暂停和停止操作。同时,它还展示了如何显示或隐藏迷你播放器。你可以根据实际需求进一步定制和扩展此示例。

回到顶部