Flutter plugins with Apple TV (tvOS) support, maintained by the fluttertv.dev organization.
These are companions to flutter-tvos
— the Flutter tvOS custom embedder. Most are federated *_tvos
implementations of popular pub.dev plugins, produced with the
flutter-tvos plugin port tool and finished/verified by hand.
Published on pub.dev under the
fluttertv.devverified publisher. Add them like any other plugin (<name>_tvos: ^0.0.1).
Every plugin below has a tvOS implementation; full details (API
coverage, disabled regions, and porting notes) are available in each
package's README.md and PORTING_REPORT.md.
These were assessed and deliberately not shipped — their core capability does not exist on tvOS, so a published package would be misleading:
| Plugin | Why not on tvOS |
|---|---|
url_launcher |
No Safari / arbitrary URL or app launching on tvOS |
google_sign_in |
No GoogleSignIn tvOS SDK; tvOS uses a different device-pairing flow |
geolocator |
No location services on Apple TV |
permission_handler |
tvOS lacks the permission surfaces (location, camera, photos, …) |
firebase_core |
No tvOS slice of the Firebase Apple SDK |
in_app_purchase |
StoreKit2 port has an unresolved protocol-conformance cascade |
network_info_plus |
Wi‑Fi SSID/BSSID APIs do not exist on tvOS |
webview_flutter |
No WebKit on tvOS — there is no web view, in-app browser, or HTML rendering |
The upstream plugins do not endorse a tvOS implementation, so add
the *_tvos package to your app explicitly, alongside the upstream
plugin:
dependencies:
shared_preferences: ^2.2.0
shared_preferences_tvos:
git:
url: https://github.com/fluttertv/plugins.git
path: packages/shared_preferences_tvosThen use the upstream plugin's API exactly as on iOS — the tvOS
implementation registers automatically. Once published these become
plain ^version dependencies.
A few packages need a writable directory and therefore also
path_provider_tvos: e.g. video_player_tvos (for
VideoPlayerController.file) and sqflite_tvos (for the database
path). Their READMEs note this.
These packages were not hand-written from scratch. They were produced
with the flutter-tvos plugin port tool (part of
flutter-tvos) and then
verified — and where needed finished — by hand. This is the exact,
reproducible workflow.
For the full porter reference — every flag, what the transformer does and doesn't do, and how to read the generated
PORTING_REPORT.md— see Porting an existing plugin in the flutter-tvos docs. The summary below is the recipe we used to produce this repo.
# the flutter-tvos CLI (custom embedder + tooling)
git clone https://github.com/fluttertv/flutter-tvos.git
export TVOS=$PWD/flutter-tvos/bin/flutter-tvosflutter-tvos plugin port takes an existing Apple plugin (the iOS or
macOS implementation package) and emits a federated *_tvos package.
# from a published pub.dev package (what we used):
$TVOS plugin port --from-pub video_player_avfoundation \
--output plugins/packages/video_player_tvos --include-example
# or from git, or from a local path:
$TVOS plugin port --from-git https://github.com/foo/bar.git --ref main --output ...
$TVOS plugin port ../some_plugin_ios --output ...The exact upstream source for each package is recorded at the top of
its PORTING_REPORT.md (e.g. video_player_tvos ←
video_player_avfoundation, shared_preferences_tvos ←
shared_preferences_foundation, audioplayers_tvos ←
audioplayers_darwin).
What the porter does automatically:
- Copies the upstream Dart
lib/(rewritingpackage:self-imports) and federates through the upstream*_platform_interface. - Copies the native Swift/Objective-C into
tvos/Classes/and generates a tvOS*.podspec(no dependency on the Flutter CocoaPod — tvOS resolvesFlutter.frameworkvia search paths). - Makes tvOS follow the iOS code paths: widens
#if os(iOS)→(os(iOS) || os(tvOS)), ObjC#if TARGET_OS_IOS→(TARGET_OS_IOS || TARGET_OS_TV), and@available/#available/API_AVAILABLEiOS <v>→ alsotvOS <v>. - Collapses modern multi-target /
include/-modular SwiftPM packages into one CocoaPods module (drops the macOS-only target). - Sets
FLTAssetsPathso plugin asset lookup resolves on a real Apple TV; sanitizes example pub-workspace /dependency_overrideswiring. - Graceful partial port: an API that genuinely doesn't exist on
tvOS, used at type/top-level scope, is wrapped in
#if !os(tvOS)/#if !TARGET_OS_TVso the package still compiles with that feature disabled, and every such region is listed inPORTING_REPORT.mdunder "Disabled on tvOS". A compatibility database (WebKit, SafariServices, CoreLocation, CoreTelephony,AVAudioSessionrouting options, …) drives this.
Every package gets a PORTING_REPORT.md: the source + version, the
tvOS build outlook, methods ported/stubbed, every disabled region with
the reason, and a checklist. Read it before trusting a port.
cd plugins/packages/<pkg>/example
flutter pub get
$TVOS build tvos --simulator --debug # must be green
$TVOS test integration_test/<plugin>_test.dart -d <sim-udid>
# on a physical Apple TV (set your signing team):
DEVELOPMENT_TEAM=XXXXXXXXXX $TVOS run -d <device-udid>Only a green simulator build (and, ideally, passing integration tests on a real Apple TV) qualifies a package for this list.
The porter is honest about its limits; some packages needed manual
work, all of it documented in their PORTING_REPORT.md:
path_provider_tvos—path_provider_foundationis a dart:ffi/native-assets plugin the tvOS toolchain can't build, so the porter only emits a skeleton. A real native implementation (NSSearchPathForDirectoriesInDomains/NSTemporaryDirectory) was written by hand.flutter_secure_storage_tvos— Keychain works on tvOS; the optionalLAContext/.biometryAny/ Secure-Enclave biometric path (which tvOS lacks) was guarded out by hand.audioplayers_tvos,flutter_tts_tvos—AVAudioSessioncategory options that don't exist on tvOS (allowBluetooth,defaultToSpeaker, …) were mapped to no-ops.sqflite_tvos— re-ported once the porter learned to collapse single-targetinclude/-modular SwiftPM packages.
Packages whose primary purpose can't work on tvOS, or that don't build after best-effort, are removed rather than published broken (see Evaluated but not provided).
See AUTHORING.md for the deeper per-plugin recipe.
plugins/
├── packages/<plugin>_tvos/ # one directory per plugin
│ ├── lib/ # Dart (federated impl)
│ ├── tvos/Classes/ # native Swift/ObjC
│ ├── tvos/<plugin>.podspec # CocoaPods spec, tvOS 13+
│ ├── example/ # runnable tvOS example
│ ├── PORTING_REPORT.md # port detail + checklist
│ ├── README.md CHANGELOG.md LICENSE
└── AUTHORING.md # how to add a new one
- Federate via the upstream
*_platform_interface; suffix_tvos. - Target tvOS 13.0+; guard shared iOS code with
#if os(tvOS). - Document API support and any disabled regions in the package
README.mdandPORTING_REPORT.mdso users can assess compatibility. - A package only ships if it builds green on tvOS.
BSD-3-Clause (see LICENSE). Ported packages retain their upstream
copyright; tvOS additions are © The FlutterTV Authors.