Git Product home page Git Product logo

Comments (3)

ryanheise avatar ryanheise commented on May 20, 2024

This seems to be the type of error mentioned at the bottom of the audio_service README page, and the solution would be to submit a bug report for that other project. Before I explain the error, I want to suggest an alternative plugin called webview_flutter which is an official plugin from Google. If you want to use the pre-AndroidX version of this plugin, add the following to your pubspec.yaml:

  webview_flutter: 0.2.0 # Last release before AndroidX

If you prefer to use flutter_inappbrowser and are willing to submit a bug report to that project, here is a little bit of an explanation of what's going on.

When you use audio_service, your app is going to set up two Android contexts for running code: The "activity" context for running UI code, and the "service" context for running background audio code. The idea is that even if the activity context is destroyed, the service context will live on and audio playback will continue without the UI. Because we want to run Dart code in both contexts, we have to initialise a plugin registry for each context which allows dart code running in that context to make use of plugins. When the plugin registry is initialised, it basically calls registerWith on all of your plugins. The problem is that a lot of older plugins were unfortunately coded assuming that they can just call the Android Flutter method registrar.activity() to get the current activity and use it as a context to do various things (in Android, you basically need a reference to a context to be able to perform many API calls). But when registerWith is called from the background service context, registrar.activity() will return null, and attempting to use this context will result in a NullPointerException. If the plugin is not intended to be run in the background, the plugin should still check if registrar.activity() returns null and then do nothing. Remember that there are two plugin registries so each plugin is registered twice. It's fine for the one being registered in the background to simply do nothing, but it should at least guard against crashing with a NullPointerException.

When I look at the code for flutter_inappbrowser, I see that it's also storing the registrar in a static field which is problematic. Since there are two registries, registerWith will be called twice on the same plugin, one in each context, and you don't want the second one (probably the service) to override the first one (probably the activity). So that should be changed to an instance field also. There seem to be many other static fields too, so the plugin author may need to figure out which ones need to be distinct within each plugin registry and change them to instance fields.

Anyway, I recommend just using webview_flutter ;-)

It's still useful to know how this works, though, because that error message you posted over on the iOS issue, and the reason why you had to upgrade your Flutter to the latest version to get the newest APIs, has something to do with iOS's equivalent to what I described above. This new iOS API apparently brings the iOS implementation of Flutter background execution on par with the Android implementation so that it is possible for background dart code on iOS to load plugins via the registry.

from audio_service.

alexelisenko avatar alexelisenko commented on May 20, 2024

@ryanheise Thank you for the explanation, its very helpful.

I will take a look atwebview_flutter, but in my initial search for using webviews in flutter, every plugin had issues with brining up the keyboard in the webview, and/or missing some js injection methods I needed, but I'll take another look.

I have submitted a bug report to flutter_inappbrowser

As a last resort, I will fork flutter_inappbrowser and make the changes myself.

from audio_service.

github-actions avatar github-actions commented on May 20, 2024

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs, or use StackOverflow if you need help with audio_service.

from audio_service.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.