bb_player 8.53.0
bb_player: ^8.53.0 copied to clipboard
Flutter plugin for Blue Billywig's native video player SDK. Provides hardware-accelerated playback with VAST/VPAID ads, analytics, Chromecast, Picture-in-Picture, fullscreen, outstream, and Shorts (ve [...]
example/lib/main.dart
import 'dart:async';
import 'package:app_links/app_links.dart';
import 'package:flutter/material.dart';
import 'screens/api_screen.dart';
import 'screens/deep_link_player_screen.dart';
import 'screens/modal_player_screen.dart';
import 'screens/outstream_screen.dart';
import 'screens/shorts_screen.dart';
import 'screens/simple_player_screen.dart';
void main() {
runApp(const MyApp());
}
class _DemoItem {
final String title;
final String subtitle;
final IconData icon;
final WidgetBuilder builder;
const _DemoItem({
required this.title,
required this.subtitle,
required this.icon,
required this.builder,
});
}
const List<_DemoItem> _demoItems = [
_DemoItem(
title: 'Simple Player',
subtitle: 'Minimal embed — no event handlers',
icon: Icons.play_circle,
builder: _buildSimple,
),
_DemoItem(
title: 'API Reference',
subtitle: 'Every controller method + events',
icon: Icons.api,
builder: _buildApi,
),
_DemoItem(
title: 'Shorts',
subtitle: 'Vertical video + Full/Shelf display',
icon: Icons.view_carousel,
builder: _buildShorts,
),
_DemoItem(
title: 'Outstream Ads',
subtitle: 'Article with collapse/expand ad',
icon: Icons.ad_units,
builder: _buildOutstream,
),
_DemoItem(
title: 'Modal Player',
subtitle: 'BBModalPlayer.present() / dismiss()',
icon: Icons.fullscreen,
builder: _buildModal,
),
];
Widget _buildSimple(BuildContext c) => const SimplePlayerScreen();
Widget _buildApi(BuildContext c) => const ApiScreen();
Widget _buildShorts(BuildContext c) => const ShortsScreen();
Widget _buildOutstream(BuildContext c) => const OutstreamScreen();
Widget _buildModal(BuildContext c) => const ModalPlayerScreen();
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey<NavigatorState>();
late final AppLinks _appLinks;
StreamSubscription<Uri>? _linkSub;
@override
void initState() {
super.initState();
_appLinks = AppLinks();
// Cold launch.
_appLinks.getInitialLink().then(_handleLink);
// Warm hits.
_linkSub = _appLinks.uriLinkStream.listen(_handleLink);
}
@override
void dispose() {
_linkSub?.cancel();
super.dispose();
}
void _handleLink(Uri? uri) {
if (uri == null) return;
final clipId = parseDeepLink(uri);
if (clipId == null) return;
_navigatorKey.currentState?.push(
MaterialPageRoute(
builder: (_) => DeepLinkPlayerScreen(clipId: clipId),
),
);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'BB Player Example',
navigatorKey: _navigatorKey,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
),
home: const HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('BB Player Demo'),
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: ListView(
children: [
for (final item in _demoItems)
ListTile(
leading: Icon(item.icon),
title: Text(item.title),
subtitle: Text(item.subtitle),
onTap: () => Navigator.push(
context,
MaterialPageRoute(builder: item.builder),
),
),
],
),
);
}
}