Most Flutter tutorials stop at a counter app or a Firebase login screen. That's fine for learning widgets, but it doesn't teach you how to ship something with a real player, real network edge cases, and data that survives when the user kills the app from recents.

I've been doing Android professionally for a while. On the side I built TubeNative — a native Flutter media client for Android (sideload only, not Play Store). This post is about the parts that actually took time: navigation shell, stream extraction, playback, and offline downloads with resume.

I'm not going to pretend this is a generic tutorial you can copy in an afternoon. Some of this took weeks. But if you're thinking about building a media app in Flutter, maybe you'll avoid a few of the traps I walked into.

Note: TubeNative isn't affiliated with YouTube or Google. This is an engineering write-up about Flutter architecture — not a guide to breaking platform rules. If you ship something derived from this kind of app, compliance is on you.

Why I didn't use a WebView