Flutter弹幕显示插件flutter_barrage的使用

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

Flutter弹幕显示插件flutter_barrage的使用

flutter_barrage 是一个用于在Flutter应用中显示弹幕的插件。本文将介绍如何使用这个插件,并提供完整的示例代码。

Getting Started

BarrageWall 参数

  • List<Bullet> bullets: 初始化的弹幕列表。
  • BarrageWallController controller: 用于初始化后批量发送弹幕的控制器。
  • ValueNotifier<BarrageValue> timelineNotifier: 用于连接媒体的当前播放进度。
  • int speed: 弹幕从屏幕右侧移动到左侧的时间,默认值为5秒。
  • child: 用于填充的容器。
  • double width: 容器宽度。
  • double height: 容器高度。
  • bool massiveMode: 海量模式,默认关闭,当开启时会实时显示所有弹幕,即使通道被占用也会覆盖之前的弹幕。
  • double maxBulletHeight: 弹幕的最大高度,用于计算通道,默认值为16。
  • int speedCorrectionInMilliseconds: 默认值为3000,用于调整不同通道的速度,不同的通道会在这个值的范围内找到一个随机值并调整当前通道的速度。
  • bool debug: 调试模式,会显示一个数据面板。
  • int safeBottomHeight: 默认值为0,用于保证在最下方有一个不会显示弹幕的空间,避免挡住字幕。

示例代码

只显示弹幕

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_barrage/flutter_barrage.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Barrage Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(title: 'Flutter Barrage Demo Page'),
    );
  }
}

final barrageWallController = BarrageWallController();

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<StatefulWidget> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    Random random = new Random();
    List<Bullet> bullets = List<Bullet>.generate(100, (i) {
      final showTime = random.nextInt(60000); // in 60s
      return Bullet(child: Text('$i-$showTime'), showTime: showTime);
    });

    return Scaffold(
        appBar: AppBar(title: Text(widget.title)),
        body: SafeArea(
            child: Stack(children: <Widget>[
          Positioned(
              top: 200,
              width: MediaQuery.of(context).size.width,
              height: MediaQuery.of(context).size.width *
                      MediaQuery.of(context).size.aspectRatio +
                  200,
              child: BarrageWall(
                massiveMode: false, // disabled by default
                bullets: bullets,
                child: new Container(),
              )),
        ])));
  }
}

显示弹幕并实现发送功能

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_barrage/flutter_barrage.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Barrage Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHomePage(title: 'Flutter Barrage Demo Page'),
    );
  }
}

final barrageWallController = BarrageWallController();

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<StatefulWidget> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    Random random = new Random();
    List<Bullet> bullets = List<Bullet>.generate(1000, (i) {
      final showTime = random.nextInt(60000); // in 60s
      return Bullet(child: Text('$i-$showTime'), showTime: showTime);
    });

    final textEditingController = TextEditingController();
    return Scaffold(
        appBar: AppBar(title: Text(widget.title)),
        body: SafeArea(
            child: Column(children: <Widget>[
          Expanded(
              flex: 9,
              child: Stack(children: <Widget>[
                Positioned(
                    width: MediaQuery.of(context).size.width,
                    height: MediaQuery.of(context).size.width *
                            MediaQuery.of(context).size.aspectRatio +
                        100,
                    child: BarrageWall(
                        debug: true,
                        safeBottomHeight:
                            60, // do not send bullets to the safe area
                        bullets: bullets,
                        child: new Container(),
                        controller: barrageWallController)),
              ])),
          Expanded(
              child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: TextField(
                      controller: textEditingController,
                      textInputAction: TextInputAction.send,
                      maxLength: 20,
                      onSubmitted: (text) {
                        textEditingController.clear();
                        barrageWallController
                            .send([new Bullet(child: Text(text))]);
                      }))),
        ])));
  }
}

通过上述示例代码,你可以轻松地在你的Flutter应用中添加弹幕显示功能。更多详细用法请查看 examples


更多关于Flutter弹幕显示插件flutter_barrage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter弹幕显示插件flutter_barrage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个使用 flutter_barrage 插件在 Flutter 应用中实现弹幕显示的示例代码。这个插件允许你在屏幕上显示滚动的弹幕消息,非常适合直播应用或视频播放器等场景。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_barrage 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_barrage: ^最新版本号 # 请替换为实际最新版本号

然后,运行 flutter pub get 来安装依赖。

接下来是主要的 Flutter 代码实现:

import 'package:flutter/material.dart';
import 'package:flutter_barrage/flutter_barrage.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BarrageScreen(),
    );
  }
}

class BarrageScreen extends StatefulWidget {
  @override
  _BarrageScreenState createState() => _BarrageScreenState();
}

class _BarrageScreenState extends State<BarrageScreen> {
  late BarrageController barrageController;

  @override
  void initState() {
    super.initState();
    barrageController = BarrageController();
    startBarrage();
  }

  void startBarrage() {
    // 示例弹幕数据
    List<BarrageData> barrageDataList = [
      BarrageData(
        text: "Hello, Flutter!",
        color: Colors.red,
        size: 24,
        duration: Duration(seconds: 5),
      ),
      BarrageData(
        text: "This is a barrage message!",
        color: Colors.blue,
        size: 20,
        duration: Duration(seconds: 3),
      ),
      // 可以添加更多弹幕数据
    ];

    // 随机发送弹幕
    Future.delayed(Duration.zero, () {
      barrageDataList.forEach((data) {
        Future.delayed(Duration(milliseconds: Random().nextInt(5000)), () {
          barrageController.send(data);
        });
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Barrage Demo'),
      ),
      body: Stack(
        children: [
          // 弹幕层
          Positioned(
            top: 0,
            left: 0,
            right: 0,
            bottom: 0,
            child: Barrage(
              controller: barrageController,
              itemBuilder: (context, data, index) {
                return Text(
                  data.text,
                  style: TextStyle(
                    color: data.color,
                    fontSize: data.size,
                  ),
                );
              },
            ),
          ),
          // 其他内容层,例如视频播放器
          // Center(
          //   child: Text('Video Player Here'),
          // ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    barrageController.dispose();
    super.dispose();
  }
}

解释

  1. 依赖添加:在 pubspec.yaml 中添加 flutter_barrage 依赖。
  2. 初始化:在 initState 方法中初始化 BarrageController 并调用 startBarrage 方法。
  3. 弹幕数据:创建一个 List<BarrageData> 来存储弹幕消息,每个 BarrageData 对象包含文本、颜色、字体大小和持续时间等信息。
  4. 发送弹幕:使用 Future.delayed 随机发送弹幕消息。
  5. 构建 UI:使用 Stack 布局来叠加弹幕层和其他内容层(例如视频播放器)。Barrage 组件用于显示弹幕,并通过 itemBuilder 属性自定义每个弹幕项的显示方式。
  6. 资源释放:在 dispose 方法中释放 BarrageController 以避免内存泄漏。

这个示例代码展示了如何在 Flutter 应用中使用 flutter_barrage 插件来显示弹幕消息。你可以根据需要进一步自定义和扩展这个示例。

回到顶部