Skip to main content
  1. Today I Learned/

Mobile development digest: Flutter 3.47 & Dart 3.13, 5 years of Compose & tools

·709 words·4 mins· loading · loading ·

In this edition of our mobile development digest, I cover major updates across the mobile engineering landscape: the releases of Flutter 3.47 and Dart 3.13, celebrating 5 years of Jetpack Compose, Apple App Store header guidelines, and useful open-source tools.

Releases & announcements: Flutter 3.47 & Dart 3.13
#

Flutter 3.47
#

Flutter 3.47 brings key architectural modularity and performance enhancements:

  • Decoupling Material & Cupertino into standalone packages: The Material and Cupertino widget libraries have been decoupled from the core framework into standalone packages on pub.dev: material_ui and cupertino_ui. This enables faster UI updates independent of SDK release cycles and reduces core engine footprint:
// ❌ Legacy monolithic SDK import
import 'package:flutter/material.dart';

// ✅ In Flutter 3.47: standalone packages from pub.dev
import 'package:material_ui/material_ui.dart';
import 'package:cupertino_ui/cupertino_ui.dart';

Step-by-step package migration:
#

  1. Automated import migration via Dart Fix:

    dart fix --apply --code=migrate_design_widgets

    This command automatically adds material_ui / cupertino_ui to pubspec.yaml and migrates legacy package:flutter/material.dart imports to package:material_ui/material_ui.dart.

  2. Compatibility Bridge for legacy dependencies: If third-party packages or subtrees still depend on package:flutter/material.dart, wrap your root app or subtree using MaterialUiCompatibilityBridge (or CupertinoUiCompatibilityBridge) so ThemeData and localizations resolve seamlessly:

    import 'package:material_ui/material_ui.dart';
    
    MaterialApp(
      builder: (context, child) {
        return MaterialUiCompatibilityBridge(child: child!);
      },
      home: const HomeScreen(),
    );
  • Impeller renderer enabled by default on Desktop: The next-generation Impeller rendering engine—designed to eliminate runtime shader compilation jank—is now officially enabled by default for Desktop platforms (macOS, Windows, and Linux).
  • Flavors & Multi-window support for Desktop: Desktop developers gain official Flutter Flavors support alongside an experimental multi-window API.
  • Apple Autumn Release Preparation: Pre-emptively updated for smooth compatibility with upcoming autumn iOS and macOS system updates.
  • 📌 Links: Official Flutter 3.47 Announcement | Package material_ui | Package cupertino_ui | Breaking Changes

Dart 3.13
#

Alongside Flutter, Dart 3.13 introduced significant language and runtime improvements:

  • Stable Primary Constructors: Primary Constructors syntax is officially stable (documentation). Class fields and parameter initialization can now be written concisely directly in the class header:
// ❌ Previously in Dart: explicit fields, constructor declaration, and initializer list
class Point {
  final int x;
  final int y;

  Point(this.x, this.y) : assert(x >= 0 && y >= 0);
}

// ✅ In Dart 3.13 (Primary Constructors): primary constructor directly in the class header
class Point(var int x, var int y) {
  this : assert(x >= 0 && y >= 0) {
    print('Point initialized at ($x, $y)');
  }
}

// Primary constructor with named parameters:
class User({required var String name});

// Constant primary constructor with initializer list (this : z = x + y):
class const ConstPoint(final int x, final int y) {
  final int z;
  this : z = x + y;
}
  • WASM Deferred Loading (Experimental in Dart 3.13): The Dart WebAssembly compiler introduced experimental support for deferred module loading. By default, compiled apps do not use deferred loading—it is enabled using the --enable-deferred-loading flag:
$ dart compile wasm --enable-deferred-loading bin/main.dart

Enabling deferred loading requires the JS app loader to supply a loadDeferredModules callback to fetch module bytes on demand:

const app = await compileStreaming(fetch('main.wasm'));
const instantiatedApp = await app.instantiate({}, {
  loadDeferredModules: (modules, handleModuleByteSource) => {
    return Promise.all(
      modules.map((m) => fetch(m).then((r) => handleModuleByteSource(m, r)))
    );
  },
});
instantiatedApp.invokeMain();

Android & Jetpack Compose
#


iOS & App Store
#

  • Apple guidelines for App Store promotional headers — Apple published official guidelines and best practices for creating promotional header assets for App Store features. The document provides visual examples and layout requirements to maximize impression-to-install conversion.

Bonus: Open-source discovery
#

  • open-video-editor — A handy open-source Android video editor licensed under GPL-3.0 that I recently stumbled upon. Built with Media3 and Jetpack Compose, it supports video trimming, resolution scaling, rotation, and Weblate localization.
Article read
Please rate how helpful and clear this article was to you