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.
stacking.mp4Stacking — staggered in and out |
variable-color.mp4Animated icons — SF Symbol effects |
progress.mp4Progress — determinate upload |
action.mp4Action button — inline Undo |
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.