pip_plugin 0.0.1+2 copy "pip_plugin: ^0.0.1+2" to clipboard
pip_plugin: ^0.0.1+2 copied to clipboard

Flutter plugin for displaying customizable text overlays in Picture-in-Picture mode across all platforms.

example/lib/main.dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:pip_plugin/pip_plugin.dart';
import 'package:pip_plugin/text_pip_widget.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'PiP Timer Example',
      home: PipTimerPage(),
    );
  }
}

class PipTimerPage extends StatefulWidget {
  const PipTimerPage({super.key});
  @override
  State<PipTimerPage> createState() => _PipTimerPageState();
}

class _PipTimerPageState extends State<PipTimerPage> {
  final PipPlugin _plugin = PipPlugin();
  final Stopwatch _stopwatch = Stopwatch();
  Timer? _timer;
  String _time = '00:00';
  bool _pipStarted = false;
  bool _isSupported = false;
  late final StreamSubscription<bool> _pipStatusSub;

  @override
  void initState() {
    super.initState();
    _initPlugin().then((_) {
      _pipStatusSub = _plugin.pipActiveStream.listen((isActive) {
        if (!isActive && _pipStarted) {
          _stopTimer();
          setState(() {
            _pipStarted = false;
          });
          _showSnackBar('PiP closed — timer stopped.');
        }
      });
    });
  }

  Future<void> _initPlugin() async {
    final supported = await _plugin.isPipSupported();
    setState(() => _isSupported = supported);
    if (supported) {
      await _plugin.setupPip();
    }
  }

  void _startTimer() {
    _stopwatch.start();
    _timer = Timer.periodic(const Duration(seconds: 1), (_) {
      final elapsed = _stopwatch.elapsed;
      setState(() {
        _time = '${elapsed.inMinutes.toString().padLeft(2, '0')}:'
            '${(elapsed.inSeconds % 60).toString().padLeft(2, '0')}';
      });
      if (_pipStarted) {
        _plugin.updateText(_time);
      }
    });
  }

  void _stopTimer() {
    _stopwatch.stop();
    _timer?.cancel();
    _timer = null;
  }

  Future<void> _startPip() async {
    await _plugin.updateText(_time);
    final started = await _plugin.startPip();
    if (started) {
      setState(() => _pipStarted = true);
      _startTimer();
    } else {
      _showSnackBar('Failed to start PiP');
    }
  }

  Future<void> _stopPip() async {
    await _plugin.stopPip();
    _stopTimer();
    setState(() => _pipStarted = false);
  }

  void _showSnackBar(String message) {
    if (!mounted) return;
    ScaffoldMessenger.of(context).clearSnackBars();
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text(message)),
    );
  }

  @override
  void dispose() {
    _timer?.cancel();
    _pipStatusSub.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return TextPipWidget(
      child: Scaffold(
        appBar: AppBar(title: const Text('PiP Timer')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(_time, style: const TextStyle(fontSize: 48)),
              const SizedBox(height: 32),
              if (_isSupported)
                ElevatedButton(
                  onPressed: _pipStarted ? _stopPip : _startPip,
                  child: Text(_pipStarted ? 'Stop PiP' : 'Start PiP'),
                )
              else
                const Text('PiP not supported on this platform',
                    style: TextStyle(color: Colors.red)),
            ],
          ),
        ),
      ),
    );
  }
}
18
likes
150
points
21
downloads

Publisher

unverified uploader

Weekly Downloads

Flutter plugin for displaying customizable text overlays in Picture-in-Picture mode across all platforms.

Repository (GitHub)
View/report issues

Topics

#flutter #picture-in-picture #pip

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

flutter, flutter_web_plugins, plugin_platform_interface, simple_pip_mode, web

More

Packages that depend on pip_plugin