Sign in

Andrea Bizzotto 🇺🇦

@codewithandrea.com
920 followers 210 following 494 posts

Flutter GDE ❖ I share tips about Dart & Flutter app development. Wanna learn Flutter? 👉 codewithandrea.com

PostsRepliesMedia
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 22/11/2025
Kinda wanted to have a play with Antigravity today, but...
120
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 21/11/2025
Just managed to one-shot a video transcription CLI tool (3000+ LOC including tests). How I did it: - Written a detailed spec (with some help from AI) - Used my own custom /plan and /work sub-agents Claude code did all the work -> AI Agents are getting better! Quick demo 👇
131
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 14/11/2025
Been doing some tweaks and polish on my currency converter app. I built >90% of it with agentic AI and I'm improving my workflows as I go along. Check it out here: currency-converter-ab.web.app
Preview of the charts screen on my currency converter app
130
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 06/11/2025
When coding with AI, I follow a fairly simple principle: If prompting effort > coding effort, code it. 😅 Would it be useful if I made a video with examples, etc?
Effort to code vs Effort to Prompt: my 2x2 matrix

1. Low prompt, Low code
  - Small UI/animation tweaks
  - Pull to refresh
  - Codegen
  - Simple refactors
2. High prompt, Low code
  - Line-level instructions
  - Dense business logic
  - One-line bug fixes
  - Layout errors (overflows, unbounded heights, etc)
3. Low prompt, High code
  - Boilerplate (crash reporting, analytics setup)
  - Writing tests
  - Localization
  - Theming system
  - Big refactors (AI usually does this in multiple steps + run analyzer ... can be slow)
4. High prompt, High code
  - Offline caching + syncing
  - Full-stack features
  - Background tasks + iOS/Android specific
  - Complex charting solutions
  - IAP + entitlements

For 1 and 2, use Autocomplete and IDE assists.
For 3 and 4, use AI agents for planning, implement in stages, consider verification effort.
140
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 22/10/2025
Here's a fun game! 🎲 Fully implement a feature, getting as close as possible to 0% context before auto-compacting.
The PR description includes the complete status, implementation details, testing checklist, and next steps. Ready for review!

  ⏵⏵ accept edits  on (shift+tab to cycle)                                                  Context left until auto-compact: 0%
020
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 16/10/2025
I'm working on a new video about essential folders I use for agentic AI coding. I'll cover my workflow for: 1️⃣ staying organized 2️⃣ getting consistently good results 3️⃣ reducing friction when coding with AI Should be out next week! 🗓️
Top 3 Folders for Agentic AI coding in Flutter

ai_???

ai_specs

ai_docs
020
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 13/10/2025
This is kinda how I build with AI these days. Same for you?
think-plan-build-verify-deliver
020
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 03/10/2025
Today I built the currency conversion charts for my new app. Or rather, I wrote the spec, and CC Sonnet 4.5 did all the planning and implementation. 🚀 Got it all done in ~4 hours, even though I wasn't at all familiar with the fl_charts library. Very impressed!
230
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 23/09/2025
Did you know? You can use absolute imports for reusable Dart files that are copy-pasted across projects. This way, they are always imported correctly (as long as they live in the same location relative to the project root).
If you copy-paste Dart files to a new project, your imports will fail:
import 'package:old_app/src/constants/layout_breakpoints.dart';

You can Find & Replace package:old_app with package:new_app to fix them (annoying and not very scalable)

Alternatives

Relative imports:

import '../../constants/layout_breakpoints.dart';

Absolute imports:

import '/src/constants/layout_breakpoints.dart';

Absolute imports are handy for files that always live in the same location across multiple projects (e.g. /src/constants)

Consider this as a temporary solution. Reusable files should be moved into a common package (works best with monorepo setups).
030
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 03/09/2025
Did you know? Some Matrix4 APIs such as `translate` and `scale` have been deprecated in the latest Flutter 3.35 release. To update them: - Import vector_math explicitly - Use the new APIs which take a Vector3 argument
// Before Flutter 3.35
Matrix4 deprecated(double x, double y, double scale) {
  return Matrix4.identity()
    ..translate(x, y)
    ..scale(scale, scale, 1.0);
}


// Since Flutter 3.35
// ignore: depend_on_referenced_packages
import 'package:vector_math/vector_math_64.dart';

Matrix4 updated(double x, double y, double scale) {
  return Matrix4.identity()
    ..translateByVector3(Vector3(x, y, 0))
    ..scaleByVector3(Vector3(scale, scale, 1.0));
}
030
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 03/07/2025
CachedNetworkImage wasn't behaving as I wanted in my app, so I just implemented a custom solution with Drift & Riverpod. Best thing of all: Claude Code wrote all the code! All I did was write a detailed spec and make some minor tweaks at the end. Should I make a video about this?
Goal
Replace the current image caching implementation with a built-in solution that is based on SQLite/Drift.

Context
Currently, the app caches images using the CustomCachedNetworkImage widget which is based on CachedNetworkImage from the cached_network_image package.

With CachedNetworkImage, images are automatically cached for 7 days and always deleted afterwards, requiring a new fetch. This can lead to a poor UX because if the app is offline after a cached image has been deleted, the fetch will fail.

Since images very rarely change, they should never be deleted.

Proposed solution
Update the implementation of CustomCachedNetworkImage so it no longer uses CachedNetworkImage. Instead, it should do the following:

if the imageUrl is not already cached
  show a placeholder UI (same as currently implemented)
  fetch the imageUrl and store it in the database
  if fetch is successful
    replace the placeholder UI with the rendered image
  else
    show the error UI (same as currently implemented)
else
  retrieve the image from the DB and show it in the UI
Database implementation details
Update app_database.dart by adding a new ImagesCache table that will be used to store all the fetched images
The table should have the following fields:
imageUrl (String)
imageData (blob representing the fetched image)
checksum (useful for updates)
updatedAt (when the data was written)
Run build_runner after defining the table, so it can be imported and it compiles successfully.
140
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 01/07/2025
I spent the last few days solving one problem: How to generate ACCURATE documentation for existing Flutter codebases using AI. This proved harder than expected, but I now have a reliable pipeline that can run on any project. Should I make a video about it?
1. **Find Project Root and Setup Working Directory**
2. **Extract Complete Project Structure**
3. **Extract Core Code Elements**
4. **Discover Project Patterns**
5. **Analyze Architecture Patterns**
6. **Create Intelligent Groupings**
7. **Generate Fact Sheet**
8. **Generate Documentation Prompt**
9. **Generate Final Documentation**
10. **Cleanup**
281
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 01/07/2025
Taking a new shiny tool for a ride 👇 Will report back 🙂
Gemini CLI prompt
030
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 01/07/2025
Some people asked me if Claude Max is worth it. To find out, you can check your usage data with: npx ccusage@latest Here are my stats for last month 👇
➜  ~ npx ccusage@latest monthly

 WARN  Fetching latest model pricing from LiteLLM...                                                        ccusage 08:35:02

ℹ Loaded pricing for 1140 models                                                                           ccusage 08:35:02

 ╭────────────────────────────────────────────╮
 │                                            │
 │  Claude Code Token Usage Report - Monthly  │
 │                                            │
 ╰────────────────────────────────────────────╯

┌──────────┬──────────────────┬──────────┬──────────┬──────────────┬────────────┬──────────────┬────────────┐
│ Month    │ Models           │    Input │   Output │ Cache Create │ Cache Read │ Total Tokens │ Cost (USD) │
├──────────┼──────────────────┼──────────┼──────────┼──────────────┼────────────┼──────────────┼────────────┤
│ 2025-06  │ - opus-4         │   45,657 │  166,255 │    6,333,383 │ 68,195,460 │   74,740,755 │    $118.82 │
│          │ - sonnet-4       │          │          │              │            │              │            │
├──────────┼──────────────────┼──────────┼──────────┼──────────────┼────────────┼──────────────┼────────────┤
│ Total    │                  │   45,657 │  166,255 │    6,333,383 │ 68,195,460 │   74,740,755 │    $118.82 │
└──────────┴──────────────────┴──────────┴──────────┴──────────────┴────────────┴──────────────┴────────────┘
130
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 28/06/2025
I asked Claude to generate documentation for one of my projects. First, it estimated 8-10 days based on human work. Then it proceeded to do it all in 20 minutes! There were some minor inaccuracies, but that's still a ~200x time saving...
070
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 26/06/2025
Did I get it right? 😅
A simple illustration of who’s who in AI

AI-Hype Bros

- VCs
- Big CEOs
- Leading AI Startups
- Influencers (who don’t know how to code)

“AI will replace all developers”

“AI will benefit all of humankind... proceeds to layoff 10K employees”

Realists

- Pragmatists
- Andrej Karpathy
- Gary Marcus
- Me

“AI is a powerful assistant, requires human verification”

“Partial autonomy, keep AI on the leash”

Contrarians

- People with strong ego
- Fossilized developers

“AI is useless, makes too many mistakes”

“I’m better than that, I’d rather do all the work myself”

Different groups of people → different motives and narratives

Be mindful of who you listen to
231
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 25/06/2025
Lol I started getting creative with my TikTok marketing 😅
090
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 24/06/2025
My latest video is nearly ready, and it's a long one! Inside, I'll show you how Claude Code has changed my workflow, and how to make the most of it.
Preview thumbnail of my latest YouTube video about building Flutter apps faster with Claude Code.
160
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 23/06/2025
‪P.S: the TikTok channel is live.‬ ‪If you want to checkout my calisthenics progression, my username is: califitness2‬
000
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 20/06/2025
My mini-course about Claude Code is already over 1h long (and growing). 💪 It will show you how to do real-world AI-assisted coding like a Senior Developer. I can't remember the last time I was this excited about a YouTube video!
Video editor showing the status of my upcoming video about Claude Code.
130
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 19/06/2025
Submitted a new app to the store! 🚀 Looking forward to see how it goes! 🤞
Preview of my Voice Timer app in App Store Connect
093
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 16/06/2025
My upcoming video will be all about how I use Claude Code: - My Flutter app development workflow - Tips for using it effectively - Common tasks where it really shines - Other tasks where it fails (no matter how hard I try)
Claude code prompt
3110
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 12/06/2025
I've been building a voice-activated timer app to help me with my calisthenics (look, no hands! 🙅‍♂️) The best part? It's mostly vibe-coded with Claude Code. Should I do a YouTube video about the process?
051
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 10/06/2025
Sooo I started doing calisthenics. Here's my first take at the frog stand. Should I start a TikTok channel? 😅
020
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 09/06/2025
Did you know? Puro is a powerful tool that lets you install multiple versions of Flutter and easily switch between them in your projects. It's very fast and can automatically configure your IDE to use your desired Flutter version.
- Install multiple Flutter versions
- Easily switch between them
- Automatically configure your IDE

Example commands:

- `puro ls`: lists environments
- `puro use <version>`: switch to environment
- `puro flutter <args>`: run flutter CLI from active environment
240
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 05/06/2025
Just shipped a "Copy" action to all code snippets in my course platform! That's a nice quality-of-life improvement. 🙂
110
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 04/06/2025
Lol the comments on the latest Fireship video
040
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 04/06/2025
I recently announced I'll be reviewing popular OSS Flutter apps, to see how they are architected. Here's a teaser of the first episode (🔉 audio on). Got feedback? Let me know in the comments. 💬
190
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 04/06/2025
Vimeo is overpriced and randomly breaks without warning! Context: just found out that my video embeds stopped working and just rendered a blurry image on my course pages (not sure when it started, no notifications from them either). Moving over to Cloudflare Stream.
020
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 21/05/2025
Android Emulator is always the culprit isn't it?
140
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 21/05/2025
Did you know? Dart 3.8 introduces a new formatting option to preserve trailing commas. Enable this to override the default formatter behaviour (introduced in Dart 3.7), which is to remove trailing commas when parameter lists fit within the max page width.
# New formatting option
# analysis_options.yaml
formatter:
  trailing_commas: preserve

# Available in Dart 3.8
# pubspec.yaml
environment:
  sdk: ^3.8.0

Enable this to override the default formatter behaviour, which removes trailing commas when parameter lists fit within the max page width.

Example: adding trailing comma + dart format

Default behavior: remove trailing comma, inline if it fits within page width

const WelcomeAppIntro({super.key, this.onNewApp});

New option: preserve trailing comma and format over multiple lines

const WelcomeAppIntro({
  super.key,
  this.onNewApp,
});
130
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 21/05/2025
The new Flutter property editor is really cool! To use it, upgrade to Flutter 3.32 and open it in your VSCode/Cursor sidebar. 👍
041
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 21/05/2025
Here are some more examples (from the docs) showing how you might use this:
// Example 1
String? lunch = isTuesday ? 'tacos!' : null;

// before
var withoutNullAwareElements = [
  if (lunch != null) lunch,
  if (lunch?.length != null) lunch!.length,
  if (lunch?.length case var length?) length,
];

// after
var withNullAwareElements = [
  ?lunch,
  ?lunch.length,
  ?lunch.length,
];

// Example 2
Stack(
  fit: StackFit.expand,
  children: [
    const AbsorbPointer(),
    // before
    if (widget.child != null) widget.child!,
    // after
    ?widget.child,
  ],
)
120
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 21/05/2025
Did you know? Dart 3.8 introduces null-aware elements! This allows you to add *nullable* elements to a collection with a single character (?). Much shorter than using the collection-if syntax. 👍
void logName(String? first, String? middle, String? last) {
  // Before Dart 3.8
  final fullName = [
    if (first != null) first,
    if (middle != null) middle,
    if (last != null) last,
  ];

  // Since Dart 3.8
  final fullName = [
    ?first,
    ?middle,
    ?last,
  ];
  log(fullName.join(' '));
}

logName('Andrea', null, 'Bizzotto');
// [log] Andrea Bizzotto
3124
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 20/05/2025
It looks like Material 3 Expressive is coming to Android 16 later this year. As a developer, I'm kinda getting tired of all these design changes (and the migration effort they entail). What do you make of it?
530
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 16/05/2025
I’ve been digging into popular open-source Flutter apps to see how they’re really built. Thinking of turning it into a video series, where each video is a breakdown of an app’s architecture, patterns, code style, and so on. Would you watch that? Likes/reposts will help me decide if I should do it
Screenshot of a 3000-line Dart file from a popular open-source app (won't tell you which one 😅).
2121
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 15/05/2025
Many people don’t know that my Flutter Tips app is also available on the web. Just added a button to make it more obvious. 😅
Landing page for the Flutter Tips app (now with Flutter web button)
140
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 14/05/2025
For a long time, I wanted to enable URL navigation on my Flutter tips app! And now, it's here: ✅ URL updates when the app state changes ✅ Navigate by URL (with validation) ✅ Browser history (back/forward) Built with the Flutter Router API (Navigator 2.0). Here's a demo 👇
130
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 08/05/2025
Did you know? If your app uses GoRouter with shell routes, tracking screen views *reliably* requires some workarounds. Here's how I do it (using Riverpod): 1. Create a stateful GoRouter listener to track screen views 2. Return it inside MaterialApp.builder Full code below 🧵
/// Helper variable for retrieving the GoRouter delegate
late final routerDelegate = ref.read(goRouterProvider).routerDelegate;

@override
void initState() {
  super.initState();
  routerDelegate.addListener(_listener);
}

@override
void dispose() {
  routerDelegate.removeListener(_listener);
  super.dispose();
}

void _listener() {
  final config = routerDelegate.currentConfiguration;
  final screenName = config.last.route.name;
  if (screenName != null) {
    final pathParams = config.pathParameters;
    // TODO: Add your own logging or analytics screen tracking code
    log('screenName: $screenName, pathParams: $pathParams');
  }
}
140
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 08/05/2025
Some stats about the course: ✅ 1,269 enrolled students ⭐️ 4.84 stars from 820 reviews (highest amongst all my courses) 💳 1.5% refund date (lowest amongst all my courses)
SQL query showing average rating: 4.84 from 820 reviews
110
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 07/05/2025
Did you know? Material 3 supports 5 types of buttons: ✅ Elevated ✅ Filled ✅ Filled tonal ✅ Outlined ✅ Text Here's how to use them in Flutter 👇
Material 3 supports 5 types of buttons.

Here are the corresponding widgets in Flutter:

Column(
  spacing: 8,
  children: <Widget>[
    ElevatedButton(onPressed: () {}, child: Text('Elevated')),
    FilledButton(onPressed: () {}, child: Text('Filled')),
    FilledButton.tonal(onPressed: () {}, child: Text('Filled Tonal')),
    OutlinedButton(onPressed: () {}, child: Text('Outlined')),
    TextButton(onPressed: () {}, child: Text('Text')),
  ],
)
221
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 07/05/2025
Planning to release a Flutter app soon? Use this free checklist to ensure you’ve ticked all the boxes: ✅ App icons & splash screens ✅ Error monitoring ✅ Analytics ✅ Force updates ✅ Store submissions ...and more! 👇 Grab the checklist below
141
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 06/05/2025
Did you know? By overriding ThemeData.platform inside MaterialApp, you can quickly test all your adaptive UI code, such as: - all adaptive widgets - any conditional code that checks the platform Much faster than choosing a different emulator/device and running from scratch 👍
// If your app has platform-specific UI code like this
final platform = Theme.of(context).platform;
if (platform != TargetPlatform.iOS && platform != TargetPlatform.macOS) {
  // Use Material
  return TextButton(onPressed: onPressed, child: child);
} else {
  // Use Cupertino
  return CupertinoDialogAction(onPressed: onPressed, child: child);
}

// Then you can update the ThemeData.platform inside MaterialApp and hot reload to quickly test the UI

MaterialApp(
  // Set to TargetPlatform.android to see the difference
  theme: ThemeData(platform: TargetPlatform.iOS),
  home: ...
)

// Much faster than choosing a different emulator/device and running again 👍
020
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 06/05/2025
Want to make sure users are always on a supported version of your app? You need a force-update strategy. And with Firebase Remote Config, you can handle it remotely. 👍 Here’s how I do it in my Flutter Tips app 👇
220
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 02/05/2025
Automating app store screenshots in Flutter? It takes a bit of setup, but it’s worth it. Here’s a workflow showing I do it for my Flutter Tips app using Maestro (note the video is 2x speed) 👇
121
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 01/05/2025
In many of my projects, I use a simple alert dialog that supports: ✅ Adaptive mode (Material / Cupertino) ✅ Default and cancel actions ✅ Destructive UI style ✅ Dismissible mode Super useful for Yes/No, Cancel/Delete scenarios. 👍 See below for the source code.
/// Helper function for showing an adaptive alert dialog
/// Returns:
/// - true if the default action was selected
/// - false if the cancel action was selected
/// - null if the dialog was dismissed
Future<bool?> showAlertDialog({
  required BuildContext context,
  required String title,
  required String content,
  String? cancelActionText,
  required String defaultActionText,
  bool isDestructive = false,
  bool barrierDismissible = true,
}) { ... }

// Example usage
final success = await showAlertDialog(
  context: context,
  title: "Are you sure?",
  content: "This action cannot be undone.",
  defaultActionText: "Yes",
  cancelActionText: "No",
);
if (success == true) { ... }
130
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 30/04/2025
To help reinforce what you’ve learned, the course includes 130+ quizzes. Great for testing your knowledge and staying sharp as you go.
100
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 30/04/2025
You’ll also get **production-ready checklists** to help you ship faster and avoid common mistakes. Here’s an example ⬇️
100
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 30/04/2025
The course includes 16 in-depth modules, covering everything from release prep to CI/CD and app monitoring. That’s more than two books worth of technical content—except built for action, not theory.
100
Andrea Bizzotto 🇺🇦 @codewithandrea.com · 30/04/2025
After a *full year* of work, my Flutter in Production course is now complete! 🚀 To celebrate, I’ve launched a Spring Sale and slashed the price to $99! Details below 👇
Flutter in Production is 50% off during my spring sale.
140