Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
What Is Flutter? One Codebase, Its Own Rendering Engine and Where It Stands Against .NET MAUI, React Native and Native
Flutter is a UI toolkit that draws every pixel with its own engine (Impeller) instead of using the platform's native controls, and builds Android and iOS apps from one Dart codebase. We walk through its layers, show with real measurements how Dart is JIT-compiled in development and AOT-compiled for release, compare it with .NET MAUI, React Native and native development, and explain when not to choose Flutter.
Installing Flutter and Your First Project: the SDK, Android Studio, Xcode, Emulators, flutter doctor and Hot Reload
This post covers installing Flutter on Windows for Android and on macOS for Android and iOS, reading the output of flutter doctor and creating bookstore_app with material_ui. We show with a real run that hot reload keeps state while hot restart resets it, map pubspec.yaml to csproj and package.json, and verify the app without an emulator using a widget test and a web build.
Dart for C# Developers, Part 1: Types, Null Safety, Collections, Functions and Records
Dart's null safety, unlike C#'s, is sound: using a nullable value without a check is a compile error rather than a warning, and a non-nullable variable can never be null at run time. For readers who know C#, we explain var/final/const, how const produces canonical instances, collection if/for and null-aware elements, named parameters and records with real output, and write Bookstore's Book and Author models.
Dart for C# Developers, Part 2: Classes, Primary Constructors, Mixins, Sealed Classes and Pattern Matching
In Dart, a switch over a sealed hierarchy stops compiling when a new subtype is added and names the missing case, while value equality does not come without writing == and hashCode. We cover the kinds of constructors, how Dart 3.13 primary constructors differ from C# 12, class modifiers, mixins and extension types with real output, and write Bookstore's OrderStatus and Money types.
Asynchronous Programming in Dart: Futures, async/await, Streams and Isolates
Dart runs on a single-threaded event loop: async/await does not move work to the background, heavy work freezes the UI, and real parallelism needs isolates with separate memory. We compare Future with C#'s Task and Stream with IAsyncEnumerable, measure that parsing a 20 MB JSON on the main isolate stops frames while Isolate.run does not, and show how the error of an un-awaited Future gets lost.
Everything Is a Widget in Flutter: StatelessWidget, StatefulWidget, BuildContext and the Three Trees
In Flutter a widget is not the thing on the screen but an immutable configuration: on a rebuild widgets are replaced while elements and render objects stay, and State lives in the element. Using BookCard and FavoriteButton, we show with real test output the State lifecycle with its Angular counterparts, how const cuts off rebuilds, the mounted check after an await, and how state slides to the wrong row without keys.
Flutter Layout: Constraints Go Down, Sizes Go Up — Row, Column, Expanded, Stack and Overflow Errors
In Flutter a parent gives its child a constraint, the child picks its own size within it, and the parent sets the position; a Text in a Row overflows because it gets an unbounded width. We print constraints in a test and show with real output tight versus loose constraints, Expanded and Flexible, the three classic layout errors, and a book details screen with phone and tablet layouts built on LayoutBuilder.
Lists and Grids in Flutter: ListView.builder, Slivers, Lazy Rendering and the Bookstore Catalog Screen
The default ListView constructor also builds only the visible rows, but it creates every row widget up front; data-driven lists are built with ListView.builder or slivers, while shrinkWrap makes all thousand rows build. We build Bookstore's catalog screen with CustomScrollView, SliverAppBar and a list/grid switch, and show with real test output paged loading, pull-to-refresh, empty and error states, and cacheWidth cutting a cover's memory from 8 MB to 122 KB.
Theming and Material 3 in Flutter: ThemeData, ColorScheme, Dark Mode, the material_ui Package and Cupertino
ColorScheme.fromSeed does not use the seed color as is; it generates separate light and dark palettes with readable contrast, and values with no slot in ColorScheme are added to the theme with ThemeExtension. With real test output we cover Bookstore's brown theme, dark mode, our own color tokens, the move to material_ui/cupertino_ui as the SDK's Material is deprecated in 3.50, adaptive widgets, and the Turkish locale with intl formatting.
Forms and User Input in Flutter: Form, TextFormField, Validation, Focus and the Keyboard
In Flutter a form is held together by Form and a GlobalKey<FormState>; a field is valid when its validator returns null, and the server's ProblemDetails errors are written to the matching field with forceErrorText. Using the sign-in and delivery address forms, we show with real test output how to choose an AutovalidateMode, focus the first invalid field with FocusNode, where input formatters stop, how the body shrinks when the keyboard opens, and the Angular Reactive Forms counterparts.
State Management in Flutter: From setState to ChangeNotifier, DI with provider and the Official Architecture Guide
Flutter's official architecture guide recommends View, ViewModel, Repository and Service layers for app state, unidirectional data flow, and dependency injection with provider. We build Bookstore's cart with a ChangeNotifier-based CartViewModel, Commands and a sealed Result, show with real test output how Selector cuts an unneeded rebuild on a price change, and compare the approach with Riverpod, Bloc and signals.
Navigation in Flutter: Navigator, Declarative Routing with go_router, Deep Links and Auth Guards with redirect
In go_router, context.go goes to a URL and rebuilds the stack from the URL's hierarchy, while context.push adds to the current stack and can return a result. With real test and Chromium output we add to Bookstore a bottom navigation where each tab keeps its own stack with StatefulShellRoute, the /catalog/books/:isbn deep link, a redirect auth guard that reruns by itself through refreshListenable, and PopScope to keep a form from being lost.