Audio manager - A flutter plugin for music playback, including notification handling.

Overview

audio_manager

pub package

A flutter plugin for music playback, including notification handling.

This plugin is developed for iOS based on AVPlayer, while android is based on mediaplayer

The example app running in AndroidThe example app running in AndroidThe example app running in iOSThe example app running in iOS

iOS

Add the following permissions in the info.plist file

	<key>UIBackgroundModes</key>
	<array>
		<string>audio</string>
	</array>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
  • ⚠️ Some methods are invalid in the simulator, please use the real machine

Android

Since Android9.0 (API 28), the application disables HTTP plaintext requests by default. To allow requests, add android:usesCleartextTraffic="true" in AndroidManifest.xml

<application
	...
	android:usesCleartextTraffic="true"
	...
>
  • ⚠️ Android minimum supported version 23 (app/build.gradle -> minSdkVersion: 23)
  • ⚠️ Android minimum supported Gradle version is 5.4.1 (gradle-wrapper.properties -> gradle-5.4.1-all.zip)

How to use?

The audio_manager plugin is developed in singleton mode. You only need to getAudioManager.instance in the method to quickly start using it.

Quick start

you can use local assets, directory file or network resources

// Initial playback. Preloaded playback information
AudioManager.instance
	.start(
		"assets/audio.mp3",
		// "network format resource"
		// "local resource (file://${file.path})"
		"title",
		desc: "desc",
		// cover: "network cover image resource"
		cover: "assets/ic_launcher.png")
	.then((err) {
	print(err);
});

// Play or pause; that is, pause if currently playing, otherwise play
AudioManager.instance.playOrPause()

// events callback
AudioManager.instance.onEvents((events, args) {
	print("$events, $args");
}
Comments
  • Can't cancel or skip AudioManager.instance functions or remove background activity

    Can't cancel or skip AudioManager.instance functions or remove background activity

    Hey Jerome,

    Im facing an issue for both android and ios where Im not able to move to the next item in my pageview as long as the AudioManager.instance.next function is part of the function tree. None of the AudioManager functions are skipable. They basically block the Pageview controlls.

    As you will see in my demo, if I slide to the next element, its getting stuck completely, it doesnt let me override the previous action. Also If I press the close button with AudioManager.instance.stop function. It will either get stuck or it wont stop and song will be played on different screen.

    This is another or combining issue. If you call the AudioManager.instance.stop(); function and move to a different screen, the song doesnt stop, it continues playing on a different screen. On iOS you can clearly see that this behaviour happens if you slide threw the items and close the screen. It doesnt get recognized anymore. If I put a print in a dispose tree, it will get printed but it doesnt dispose the Audio if you move to a different screen.

    In the following im providing you a fully working demo with audio sources from my firebase project. You can test and reproduce the error there. Im also providing 2 videos, one with android from stackoverflow user, where it just looks fine and one from me with iOS, where you can clearly see that it starts playing audio even if we call AudioManager.instance.stop();

    Videos: Android: https://streamable.com/sepgb1 iOS: https://streamable.com/e/ycxwob

    import 'package:audio_manager/audio_manager.dart';
    import 'package:flutter/gestures.dart';
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int currentIndex = 0;
    
      @override
      Widget build(BuildContext context) {
        // Page selector for tab list
        void _selectPage(int index) {
          print('page index: $index');
          setState(() {
            currentIndex = index;
          });
        }
    
        // Routes list for tab navigation Android
        final List<Widget> _pages = [
          ScreenA(),
          ScreenB(func: _selectPage),
        ];
    
        return Scaffold(
          appBar: AppBar(),
          body: _pages[currentIndex],
          bottomNavigationBar: SafeArea(
            child: BottomNavigationBar(
              onTap: _selectPage,
              iconSize: 22,
              currentIndex: currentIndex,
              type: BottomNavigationBarType.fixed,
              items: [
                BottomNavigationBarItem(
                  backgroundColor: Theme.of(context).primaryColor,
                  icon: Icon(Icons.description),
                  label: 'ScreenA',
                ),
                BottomNavigationBarItem(
                    backgroundColor: Theme.of(context).primaryColor,
                    icon: Icon(Icons.ac_unit_outlined),
                    label: 'ScreenB'),
              ],
            ),
          ),
        );
      }
    }
    
    class ScreenA extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Text('HOME'),
        );
      }
    }
    
    class ScreenB extends StatefulWidget {
      Function func;
      ScreenB({Key key, @required this.func}) : super(key: key);
      @override
      _ScreenBState createState() => _ScreenBState();
    }
    
    var audioFiles = [
        "https://docs.google.com/uc?export=open&id=1SaJWqfQuHnFtL7uqrzfYG31hzOnqDM3r",
        "https://docs.google.com/uc?export=open&id=1FZkFMjQyWguAl0RMAsYDEZ07c_Qf7gjz",
        "https://docs.google.com/uc?export=open&id=1GqrwQ3eRuiil0p-Na_R1tMAvggp9YrbH",
      ];
    var audioIndex = 0;
    
    class _ScreenBState extends State<ScreenB> {
    
      var _controller = PageController();
      PlayMode playMode = AudioManager.instance.playMode;
    
      var globalIndex =0;
    
      @override
      void initState() {
        // TODO: implement initState
        
        List<AudioInfo> _list = [];
        for (var i = 0; i < audioFiles.length; i++) {
          _list.add(AudioInfo(audioFiles[i], coverUrl: '', desc: '', title: ''));
        }
    
        print(_list);
    
        AudioManager.instance.audioList = _list;
        AudioManager.instance.intercepter = true;
        AudioManager.instance.play(auto: true);
    
        super.initState();
      }
    
    
    @override
    void dispose() {
        // TODO: implement dispose
        AudioManager.instance.release();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            actions: [
              IconButton(
                icon: Icon(Icons.close),
                onPressed: () {
                  AudioManager.instance.stop();
                  widget.func(0);
                },
              ),
            ],
          ),
          body: PageView.custom(
              dragStartBehavior: DragStartBehavior.start,
              controller: _controller,
              physics: NeverScrollableScrollPhysics(),
              scrollDirection: Axis.horizontal,
              childrenDelegate: SliverChildBuilderDelegate((ctx, pageIndex) =>
                  GestureDetector(
                      onPanUpdate: (details) {
                        if (details.delta.dx < 0) {
                          _controller.nextPage(
                              duration: Duration(milliseconds: 200),
                              curve: Curves.easeInOut);
    
                          setState(() {
                            //audioIndex = pageIndex;
                            AudioManager.instance.next();
                          });
                          
                        }
                      },
                      child: Center(
                          child: Container(
                              width: 200,
                              height: 200,
                              color: Colors.red,
                              child: Text(audioFiles[audioIndex])))))),
        );
      }
    }
    
    
    opened by md186 11
  • AudioManager plugin can't handle links without file endings / streams

    AudioManager plugin can't handle links without file endings / streams

    Hey Jerome,

    I cant reopen the issue you closed.. The following streaming links from database project doesnt work well with the AudioManager.

    • The functions AudioManager.instance.stop() doesnt recognize stopping
    • Previous and next aswell as PlayPause does only work with delay.
    var audioFiles = [
        "https://docs.google.com/uc?export=open&id=1SaJWqfQuHnFtL7uqrzfYG31hzOnqDM3r",
        "https://docs.google.com/uc?export=open&id=1FZkFMjQyWguAl0RMAsYDEZ07c_Qf7gjz",
        "https://docs.google.com/uc?export=open&id=1GqrwQ3eRuiil0p-Na_R1tMAvggp9YrbH",
      ];
    

    If youre using links with file type endings like the following example everything works fine and without delay:

    var audioFiles = [
        "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3",
        "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-2.mp3",
        "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-3.mp3"
      ];
    

    The files without mp3 ending are from my firebase project, this is handled in a different way in your Plugin. It’s not able to execute any AudioManager function in a correct way with this url type as you can see in the Demo. Please try to fix the plugin to get Streams working answell,

    Code to reproduce:

    import 'package:audio_manager/audio_manager.dart';
    import 'package:flutter/gestures.dart';
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int currentIndex = 0;
    
      @override
      Widget build(BuildContext context) {
        // Page selector for tab list
        void _selectPage(int index) {
          print('page index: $index');
          setState(() {
            currentIndex = index;
          });
        }
    
        // Routes list for tab navigation Android
        final List<Widget> _pages = [
          ScreenA(),
          ScreenB(func: _selectPage),
        ];
    
        return Scaffold(
          appBar: AppBar(),
          body: _pages[currentIndex],
          bottomNavigationBar: SafeArea(
            child: BottomNavigationBar(
              onTap: _selectPage,
              iconSize: 22,
              currentIndex: currentIndex,
              type: BottomNavigationBarType.fixed,
              items: [
                BottomNavigationBarItem(
                  backgroundColor: Theme.of(context).primaryColor,
                  icon: Icon(Icons.description),
                  label: 'ScreenA',
                ),
                BottomNavigationBarItem(
                    backgroundColor: Theme.of(context).primaryColor,
                    icon: Icon(Icons.ac_unit_outlined),
                    label: 'ScreenB'),
              ],
            ),
          ),
        );
      }
    }
    
    class ScreenA extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container(
          child: Text('HOME'),
        );
      }
    }
    
    class ScreenB extends StatefulWidget {
      Function func;
      ScreenB({Key key, @required this.func}) : super(key: key);
      @override
      _ScreenBState createState() => _ScreenBState();
    }
    
    var audioFiles = [
        "https://docs.google.com/uc?export=open&id=1SaJWqfQuHnFtL7uqrzfYG31hzOnqDM3r",
        "https://docs.google.com/uc?export=open&id=1FZkFMjQyWguAl0RMAsYDEZ07c_Qf7gjz",
        "https://docs.google.com/uc?export=open&id=1GqrwQ3eRuiil0p-Na_R1tMAvggp9YrbH",
      ];
    var audioIndex = 0;
    
    class _ScreenBState extends State<ScreenB> {
    
      //var _controller = PageController();
      PlayMode playMode = AudioManager.instance.playMode;
    
      var globalIndex =0;
    
      @override
      void initState() {
        // TODO: implement initState
        
        List<AudioInfo> _list = [];
        for (var i = 0; i < audioFiles.length; i++) {
          _list.add(AudioInfo(audioFiles[i], coverUrl: '', desc: '', title: ''));
        }
    
        print(_list);
    
        AudioManager.instance.audioList = _list;
        //AudioManager.instance.intercepter = true;
        AudioManager.instance.play(auto: true);
    
        super.initState();
      }
    
    
    @override
    void dispose() {
        // TODO: implement dispose
       // AudioManager.instance.release();
        super.dispose();
      }
    
      var lastPage =0;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            actions: [
              IconButton(
                icon: Icon(Icons.close),
                onPressed: () {
                  AudioManager.instance.stop();
                  widget.func(0);
                },
              ),
            ],
          ),
          body: PageView.custom(
              onPageChanged: (page){
                if(page != lastPage){
                  if(lastPage < page){
                    print('swipe right');
                    lastPage = page;
                    setState(() {
                    //audioIndex = page;
                    AudioManager.instance.next();
                    });
                  } else{
                    print('swipe left');
                    lastPage = page;
                  }
                }
              },
              //controller: _controller,
              physics: PageScrollPhysics(),
              scrollDirection: Axis.horizontal,
              childrenDelegate: SliverChildBuilderDelegate((ctx, pageIndex) =>
                  // GestureDetector(
                  //     onPanUpdate: (details) {
                  //       if (details.delta.dx < 0) {
                  //         _controller.nextPage(
                  //             duration: Duration(milliseconds: 200),
                  //             curve: Curves.easeInOut);
    
                  //         setState(() {
                  //           //audioIndex = pageIndex;
                  //           AudioManager.instance.next();
                  //         });
                          
                  //       }
                  //     },
                      //child: 
                      Center(
                          child: Container(
                              width: 200,
                              height: 200,
                              color: Colors.red,
                              child: Text(audioFiles[audioIndex]))))),
        );
      }
    }
    
    opened by md186 6
  • Song takes really long starting with bluetooth device e.g. Air Pods Pro on network

    Song takes really long starting with bluetooth device e.g. Air Pods Pro on network

    When app is connected to car via Bluetooth or I have my AirPods Pro connected to my iPhone, it takes double of time until song is starting.

    It has a similar behaviour to #29 Like I describe there, the following code should make everything on iOS start faster on network:

    AVPlayer *player = playerInfo[@"player"];
    
    float playbackRate = [playerInfo[@"rate"] floatValue];
    
    if (@available(iOS 10.0, *)) {
        [player playImmediatelyAtRate:playbackRate];
    } else {
        [player play];
    }
    Apple dev
    

    documentation: https://developer.apple.com/documentation/avfoundation/avplayer/1643480-playimmediatelyatrate?language=objc

    opened by md186 5
  • Buffering Songs on iOS not working immediately

    Buffering Songs on iOS not working immediately

    Hello, buffering on iOS with WLAN off is not working as expected. (Please check it on android too) I tested it on several real iPhones, if WLAN is off and I use LTE or other mobile network, song starts playing first, when complete song is initialized, and then it starts buffering at very last. This causes waiting for song start playing very long time. It is wrong order. If wlan is on, song directly starts playing and buffering like it should

    Please fix this on WLAN off mode, this is really annoying. Thank you!

    opened by md186 5
  • Local file coverUrl not working on Android

    Local file coverUrl not working on Android

    Hi On Android coverUrl not working. I got exception V/AudioManagerPlugin(17668): 播放错误:java.io.FileNotFoundException: file:///data/user/0/com.blizejprzedszkola.app.mojaplytoteka/app_flutter/covers/17_cover.jpg and I/flutter (17668): AudioManagerEvents.error, java.io.FileNotFoundException: file:///data/user/0/com.blizejprzedszkola.app.mojaplytoteka/app_flutter/covers/17_cover.jpg On iOS everything works fine.

    opened by maciogg 4
  • How to call the setupAudio() on a button press rather than in initState() ?

    How to call the setupAudio() on a button press rather than in initState() ?

    I tried calling the setupAudio function from the example on button press but then it gives two types of errors, first: --stop and the second, await -false. Can you please show me what's the proper way of doing this?

    opened by Maadhav 4
  • Audio automatically plays when the app is opened from background

    Audio automatically plays when the app is opened from background

    If a current audio file is paused and the app is in background, The audio automatically start upon opening the app to the foreground. And it doesn't continue where the audio was left off, it plays from the beginning.

    Apparently it's only happening in release version? i'm not too sure, as it doesn't happen when I'm on debug mode

    • audio-manager 0.8.1
    • flutter 2.2.3
    opened by StarBattle08 3
  • Notification Panel still exits even after clearing the playlist

    Notification Panel still exits even after clearing the playlist

    Hi,

    I'm using version - 0.5.7+1

    While trying to support a 'clear playlist' functionality, I do the following steps

    await AudioManager.instance.stop(); await AudioManager.instance.release(); AudioManager.instance.audioList.clear();

    But I still see the notification panel open with the last song, while the actual playlist is empty. Also, click on the notification panel doesn't execute any operation.

    Can you please let me know, if I'm missing any step or is it a bug to be handled?

    Poongs

    investigating 
    opened by poonkuzhalik 3
  • Pause to enter the background, but when it comes back to the foreground, it starts playing automatically

    Pause to enter the background, but when it comes back to the foreground, it starts playing automatically

    Pause to enter the background, but when it comes back to the foreground, it starts playing automatically

    There are solutions: https://www.jianshu.com/p/0eb4f84ef55b

    But i can't understand it, it's up to you

    opened by hrongyong 3
  • 'void android.media.MediaPlayer.start()' on a null object reference when trying to play local files

    'void android.media.MediaPlayer.start()' on a null object reference when trying to play local files

    I/flutter ( 7308): status false I/flutter ( 7308): AudioManagerEvents.start, AudioInfo{url: file:///storage/emulated/0/Android/data/com.mouridepro.android/files/mesaudios/Ahaazanil Baaqii.aac, title: Ahaazanil Baaqii, desc: enregistrement} I/flutter ( 7308): start load data callback, curIndex is 0 V/AudioManagerPlugin( 7308): --stop I/flutter ( 7308): Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference

    opened by papaibsow 3
  • Change android notification icons

    Change android notification icons

    Thank you for this lib, it's really helped me!

    I was wondering if it's possible to change the icons on the notification? And how can I remove the 'next' button if there's only one item in the queue? Thanks again!

    opened by michaelspeedcode 3
  • The error of

    The error of "Unable to create service cc.dync.audio_manager.MediaPlayerService"

    Hi... I'd got the error below which lead to crash the application

    E/AndroidRuntime( 2016): java.lang.RuntimeException: Unable to create service cc.dync.audio_manager.MediaPlayerService: java.lang.IllegalArgumentException: com.ali.kamil_kashash: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

    I tried to add implementation 'androidx.work:work-runtime-ktx:2.7.1'

    but the error still and the application crash

    opened by Ali8484 0
  • Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent

    Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent

    Hello. Thanks for wonderful plugin. Recently I am facing fatal crash when tring to play audio with following logs. java.lang.RuntimeException: Unable to create service cc.dync.audio_manager.MediaPlayerService: java.lang.IllegalArgumentException: com.abc.opu: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. E/AndroidRuntime( 6635): Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles. E/AndroidRuntime( 6635): at android.app.ActivityThread.handleCreateService(ActivityThread.java:4669) E/AndroidRuntime( 6635): at android.app.ActivityThread.access$100(ActivityThread.java:253) E/AndroidRuntime( 6635): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2206) E/AndroidRuntime( 6635): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime( 6635): at android.os.Looper.loopOnce(Looper.java:233) E/AndroidRuntime( 6635): at android.os.Looper.loop(Looper.java:344) E/AndroidRuntime( 6635): at android.app.ActivityThread.main(ActivityThread.java:8191) E/AndroidRuntime( 6635): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 6635): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584) E/AndroidRuntime( 6635): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034) I tried different solutions like placing implementation 'androidx.work:work-runtime-ktx:2.8.0-alpha01' But still app is crashing on playing audio. please help. @PatriceVignola @jeromexiong @JoelFickson

    opened by nicks258 4
  • Can't play mp4 media file from youtube

    Can't play mp4 media file from youtube

    Thanks for this package which makes the audio play much simpler!

    I'm using this package on iOS, trying to play audio files extracted from youtube (by the youtube explode package), but is seems it always fail.

    Observations:

    • Playing mp4 from youtube fail, example
    • Playing mp3 from other website works, example
    • Playing mp4 from local file works

    So I guess the mp4 format is actually supported by audio manager, but somehow it's not working correctly with the URL from youtube.

    opened by yhcharles 0
  • Cannot listen to audio events with FirebaseMessaging listening to remote notification (Not compatible)

    Cannot listen to audio events with FirebaseMessaging listening to remote notification (Not compatible)

    Hi, I have in my project Firebase messaging and I listen to remote notification

    When I use: FirebaseMessaging.onBackgroundMessage(onBackgroundMessage);

    I cannot listen to Audio event.

    opened by masterfego 0
  • How to show title in 2 line ?

    How to show title in 2 line ?

    opened by phamthanhluan 0
Releases(v0.8.1)
Owner
Jerome Xiong
The sky is boundless, wisdom is infinite.
Jerome Xiong
Flutter Music Player - First Open Source Flutter based material design music player with audio plugin to play local music files.

Flutter Music Player First Open Source Flutter based Beautiful Material Design Music Player(Online Radio will be added soon.) Demo App Play Store BETA

Pawan Kumar 1.5k Jan 8, 2023
Flutter apple music preview - A Music App that leverages the iTunes Rest API to get music data and playable music trailers

Apple Music Preview App Description This project is a Music App that leverages t

Willy Adinata Saragih 2 May 23, 2022
🎵 Elegant music app to play local music & YouTube music. Distributes music into albums & artists. Has playlists & lyrics.

Harmonoid Elegant music app to play local music & YouTube music. Download Now ?? Feel free to report bugs & issues. We'll be there to fix. Loving the

Harmonoid 2.5k Dec 30, 2022
🎵 Elegant music app to play local music & YouTube music. Distributes music into albums & artists. Has playlists & lyrics. Windows + Linux + Android.

Harmonoid Elegant music app to play local music & YouTube music. Download Now ?? Windows, Linux & Android. Feel free to report bugs & issues. Loving t

Harmonoid 1.9k Aug 10, 2022
🎞 Flutter media playback, broadcast & recording library for Windows, Linux & macOS. Written in C++ using libVLC & libVLC++. (Both audio & video)

dart_vlc Flutter media playback, broadcast, recording & chromecast library for Windows, Linux & macOS. Written in C++ using libVLC & libVLC++. Install

Hitesh Kumar Saini 417 Dec 29, 2022
A clean front-end to Volumio, the Linux distribution for music playback. DigiPlayer is written in Flutter.

EN | 中文 DigiPlayer - A Clean Touch UI for Volumio 3 DigiPlayer is a clean touch UI for Volumio 3, written in Flutter for the Raspberry Pi Touch Displa

Feng Zhou 5 Jul 26, 2022
Flutter push notification app - Flutter-Firebase Push Notification App with FCM

A simple Flutter-Firebase "Push_Notification" application.

Ahmer Iqbal 9 Nov 4, 2022
Playify is a Flutter plugin for play/pause/seek songs, fetching music metadata, and browsing music library.

Playify Playify is a Flutter plugin for play/pause/seek songs, fetching music metadata, and browsing music library. Playify was built using iOS's Medi

Ibrahim Berat Kaya 32 Dec 14, 2022
Midi Playback in Flutter

flutter_midi A FLutter Plugin to Play midi on iOS and Android. This uses SoundFont (.sf2) Files. Online Demo: https://rodydavis.github.io/flutter_midi

Rody Davis 50 Nov 5, 2022
A Flutter plugin for handling Connectivity and REAL Connection state in the mobile, web and desktop platforms. Supports iOS, Android, Web, Windows, Linux and macOS.

cross_connectivity A Flutter plugin for handling Connectivity and REAL Connection state in the mobile, web and desktop platforms. Supports iOS, Androi

MarchDev Toolkit 29 Nov 15, 2022
Munem Sarker 1 Jan 25, 2022
Flutter plugin for notification read & reply

Reflex Flutter plugin for notification read & reply. Compatibility ✅ Android ❌ i

Devs On Flutter 14 Dec 20, 2022
Example repository of handling permissions in Flutter using BLoC and Clean Architecture.

flutter_permission_handling A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get

Jop Middelkamp 0 Dec 28, 2021
Advanced exception handling and logging for dart/flutter applications

Talker Advanced exception handling and logging for dart/flutter applications ?? Log your app actions, catch and handle your app exceptions and errors

Stanislav Ilin 103 Dec 27, 2022
The FlexGrid control provides a powerful and quickly way to display data in a tabular format. It is including that frozened column/row,loading more, high performance and better experience in TabBarView/PageView.

flex_grid Language: English| 中文简体 The FlexGrid control provides a powerful and quickly way to display data in a tabular format. It is including that f

FlutterCandies 39 Nov 8, 2022
An app to show everything bus related in Singapore, including arrival times and a directory

NextBus SG An app to show everything bus related in Singapore, including bus arrival times and a directory, with extra features. ?? Gallery Click here

null 103 Sep 13, 2022
The Dart SDK, including the VM, dart2js, core libraries, and more.

Dart A client-optimized language for fast apps on any platform Dart is: Optimized for UI: Develop with a programming language specialized around the n

Dart 8.7k Jan 2, 2023
A Flutter Plugin to visualize audio in android

flutter_visualizers (Depreciated & Not maintaining) A Flutter plugin to Visualize the audio being played (only android). Usage Add this to your pubspe

Sahdeep Singh 96 Nov 14, 2022
Flutter Radio Player, A Plugin to handle streaming audio without a hassle

Flutter radio plugin handles a single streaming media preciously. This plugin was developed with maximum usage in mind. Flutter Radio player enables S

Sithira Munasinghe 104 Dec 27, 2022