Premium, natively-rendered toasts — drawn on an overlay above your app in
SwiftUI, with a springy slide-in entrance, per-position vertical stacking,
and async loading toasts. No view controller, no BuildContext, no
environment plumbing.
This repo ships the same toaster in two flavors:
LiquidToasts— a standalone SwiftUI package for native iOS apps (LiquidToast.show("Saved")).liquid_toasts— a Flutter plugin (toast.success('Saved')) that renders through that same SwiftUI package on iOS, and through an equivalent Jetpack Compose implementation on Android.
Both packages ship from the same repo and the same vX.Y.Z tag.
File → Add Package Dependencies… →
https://github.com/SimplifyJobs/liquid-toasts.git, Up to Next Major. Add
the LiquidToasts library to your app target.
dependencies: [
.package(url: "https://github.com/SimplifyJobs/liquid-toasts.git", from: "0.8.0")
],
targets: [
.target(name: "App", dependencies: [
.product(name: "LiquidToasts", package: "liquid-toasts")
])
]import LiquidToasts
LiquidToast.success("Profile updated")Requires iOS 17+ (real Liquid Glass activates on iOS 26+; frosted below).
dependencies:
liquid_toasts:
git:
url: https://github.com/SimplifyJobs/liquid-toasts.git
ref: v0.8.0
path: liquid_toasts
⚠️ Swift Package Manager is required.The plugin's iOS side is SwiftPM-only — there is no podspec. Enable Flutter's SwiftPM mode once per machine:
flutter config --enable-swift-package-managerWithout it, an iOS build fails with a missing-podspec error. Android needs no extra setup.
import 'package:liquid_toasts/liquid_toasts.dart';
toast.success('Saved to favorites');Both packages ship from one vX.Y.Z git tag — notes live on the
Releases page, and
SwiftPM and pub resolve straight from the tag.
Package.swift # root manifest for the standalone SwiftUI package
liquid-toasts-swift/ # its sources (Sources/LiquidToasts) + native README
liquid_toasts/ # the Flutter plugin: lib/ test/ android/ example/
└── ios/liquid_toasts/ # the plugin's Swift package: the bridge, plus a
# symlink to the core sources above
tool/ docs/ assets/
The root Package.swift is thin — a manifest pointing at
liquid-toasts-swift/Sources/LiquidToasts — and lives at the repo root because
SwiftPM can only resolve a git URL whose repository root holds a manifest. The
plugin's package compiles that same folder through
ios/liquid_toasts/Sources/LiquidToasts, a symlink, so the SwiftUI core exists
exactly once with no vendored copy to drift.
Why a symlink and not a package dependency: Flutter resolves a plugin through a
symlink in the consuming app
(ios/Flutter/ephemeral/Packages/.packages/<plugin>), and SwiftPM resolves a
manifest's relative paths against that symlink rather than the checkout it
points into. A dependency reaching above the plugin's own folder therefore
lands in the app's ephemeral directory and fails resolution. The source symlink
has no such problem — the filesystem follows it from its real location.
- Flutter plugin README — full Dart API, migration notes, platform matrix
- Native SwiftUI README —
LiquidToastquick start - Monorepo plan — why the repo is shaped this way
- CHANGELOG
See LICENSE.
