Torna al blog

Flutter 3.38 & Dart 3.10: Novità e Miglioramenti

Scopri Flutter 3.38: Dart Dot Shorthands, Widget Previewer, GenUI SDK, iOS 26 Support, 16KB Page Size, Hot Reload Web e tutte le novità di novembre 2025.

Edoardo Midali

Edoardo Midali

Developer · Content Creator

10 min di lettura
Flutter 3.38 & Dart 3.10: Novità e Miglioramenti

Flutter 3.38 e Dart 3.10 sono stati rilasciati il 12 novembre 2025. Questa release porta Dart Dot Shorthands, il nuovo Widget Previewer, supporto completo per iOS 26, il rivoluzionario Flutter GenUI SDK per UI dinamiche AI-powered e miglioramenti significativi al tooling.

🎯 Novità Principali

Dart 3.10: Dot Shorthands Syntax

La feature più richiesta: sintassi abbreviata stile Swift per enum e classi!

❌ Prima - Nomi completi ripetuti:

Container(
  alignment: Alignment.center,
  padding: EdgeInsets.all(16.0),
  decoration: BoxDecoration(
    color: Colors.blue,
    borderRadius: BorderRadius.circular(8.0),
  ),
  child: Text(
    'Hello',
    style: TextStyle(
      fontSize: 16.0,
      fontWeight: FontWeight.bold,
      color: Colors.white,
    ),
  ),
)

✅ Dart 3.10 - Dot Shorthands:

Container(
  alignment: .center,              // ✨ Senza Alignment
  padding: .all(16.0),            // ✨ Senza EdgeInsets
  decoration: BoxDecoration(
    color: .blue,                 // ✨ Senza Colors
    borderRadius: .circular(8.0), // ✨ Senza BorderRadius
  ),
  child: Text(
    'Hello',
    style: TextStyle(
      fontSize: 16.0,
      fontWeight: .bold,          // ✨ Senza FontWeight
      color: .white,              // ✨ Senza Colors
    ),
  ),
)

Esempio reale - Column layout:

// Prima
Column(
  mainAxisAlignment: MainAxisAlignment.start,
  crossAxisAlignment: CrossAxisAlignment.center,
  mainAxisSize: MainAxisSize.min,
  children: [
    Text('Title', textAlign: TextAlign.center),
    SizedBox(height: 8.0),
  ],
)

// ✅ Con dot shorthands
Column(
  mainAxisAlignment: .start,
  crossAxisAlignment: .center,
  mainAxisSize: .min,
  children: [
    Text('Title', textAlign: .center),
    SizedBox(height: 8.0),
  ],
)

Vantaggi:

  • Meno boilerplate: 30-40% meno caratteri
  • Leggibilità: Focus sui valori, non sui tipi
  • Type-safe: Il compilatore verifica i tipi
  • Automatico: Nessuna configurazione necessaria

Limitazioni:

// ❌ Non funziona per tipi ambigui
var color = .blue; // Errore: tipo ambiguo

// ✅ Funziona solo con type inference chiara
Color color = .blue; // OK

Flutter Widget Previewer (Experimental)

Anteprima live dei widget in VS Code e IntelliJ senza eseguire l'app!

Setup VS Code:

# Install Flutter extension se non installato
# Abilita Widget Previewer in settings.json
{
  "dart.previewFlutterUiGuides": true,
  "dart.previewFlutterUiGuidesCustomTracking": true
}

Annotazione widget:

// Annota widget per preview
@widgetbook.Usecase()
class MyButton extends StatelessWidget {
  final String text;
  final VoidCallback? onPressed;

  const MyButton({
    super.key,
    required this.text,
    this.onPressed,
  });

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text(text),
    );
  }
}

Multi-Previews - Più varianti:

@MultiPreview()
class ButtonPreviews extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        MyButton(text: 'Primary', onPressed: () {}),
        MyButton(text: 'Secondary', onPressed: null),
        MyButton(text: 'Large', onPressed: () {}),
      ],
    );
  }
}

Vantaggi:

  • Instant feedback: Vedi cambiamenti in tempo reale
  • No emulator: Preview in IDE senza AVD/Simulator
  • Multiple devices: Test su diversi screen sizes
  • Theme switching: Dark/Light mode toggle

Known issue:

# Se il previewer crasha dopo flutter pub get:
flutter pub get
# Poi restart IDE

Flutter GenUI SDK (New!)

SDK rivoluzionario per UI dinamiche generate con AI!

import 'package:flutter_genui/flutter_genui.dart';

class DynamicScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GenUIBuilder(
      prompt: "Create a user profile screen with avatar, name, bio and stats",
      builder: (context, generatedUI) {
        if (generatedUI == null) {
          return CircularProgressIndicator();
        }

        // UI generata dall'AI!
        return generatedUI;
      },
    );
  }
}

GenUI con dati utente:

GenUIBuilder(
  prompt: "Show a product card with image, title, price and buy button",
  context: {
    'product': {
      'title': 'Flutter T-Shirt',
      'price': '\$29.99',
      'image': 'https://example.com/shirt.jpg',
    }
  },
  builder: (context, ui) => ui ?? SizedBox(),
)

Real-world esempio - Dashboard dinamica:

class AIGeneratedDashboard extends StatelessWidget {
  final Map<String, dynamic> userMetrics;

  @override
  Widget build(BuildContext context) {
    return GenUIScreen(
      prompt: '''
        Create a metrics dashboard with:
        - Sales graph showing last 7 days
        - Top 3 products list
        - Quick actions: Add Product, View Reports
        Use Material 3 design
      ''',
      data: userMetrics,
      theme: GenUITheme.fromMaterialTheme(Theme.of(context)),
    );
  }
}

Vantaggi GenUI:

  • Rapid prototyping: UI in secondi
  • Adaptive: UI si adatta ai dati
  • Theme-aware: Rispetta il tema app
  • Customizable: Override components

iOS 26, Xcode 26, macOS 26 Support

Supporto completo per l'ecosistema Apple 2025!

UIScene Lifecycle (Mandatory):

Apple richiede il nuovo lifecycle UIScene. Flutter 3.38 lo supporta completamente:

// Info.plist - Abilita UIScene
<key>UIApplicationSceneManifest</key>
<dict>
    <key>UIApplicationSupportsMultipleScenes</key>
    <true/>
    <key>UISceneConfigurations</key>
    <dict>
        <key>UIWindowSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneConfigurationName</key>
                <string>Default Configuration</string>
                <key>UISceneDelegateClassName</key>
                <string>FlutterViewController</string>
            </dict>
        </array>
    </dict>
</dict>

Plugin migration:

// Plugin deve usare UIScene events
class MyPlugin extends FlutterPlugin {
  @override
  void onAttachedToEngine(FlutterPluginBinding binding) {
    // ❌ Vecchio - AppDelegate events
    // NotificationCenter.default.addObserver(
    //   self,
    //   selector: #selector(applicationDidBecomeActive),
    //   name: UIApplication.didBecomeActiveNotification
    // )

    // ✅ Nuovo - UIScene events
    NotificationCenter.default.addObserver(
      self,
      selector: #selector(sceneDidBecomeActive),
      name: UIScene.didActivateNotification
    )
  }
}

Add-to-App Migration:

// SceneDelegate.swift per Flutter embedded
import UIKit
import Flutter

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
  var window: UIWindow?
  var flutterEngine: FlutterEngine?

  func scene(
    _ scene: UIScene,
    willConnectTo session: UISceneSession,
    options connectionOptions: UIScene.ConnectionOptions
  ) {
    guard let windowScene = (scene as? UIWindowScene) else { return }

    flutterEngine = FlutterEngine(name: "my flutter engine")
    flutterEngine?.run()

    let controller = FlutterViewController(
      engine: flutterEngine!,
      nibName: nil,
      bundle: nil
    )

    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = controller
    window.makeKeyAndVisible()
    self.window = window
  }
}

Xcode command-line launch:

# Ora puoi lanciare su device senza aprire Xcode!
flutter run -d iPhone

# Prima richiedeva Xcode aperto

Android: 16KB Page Size Support

Obbligatorio dal 1 novembre 2025 per Android 15+!

// android/app/build.gradle
android {
    defaultConfig {
        // ✅ Supporto 16KB page size
        minSdkVersion 21
        targetSdkVersion 35 // Android 15

        ndk {
            // Usa NDK r28
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
        }
    }
}

Flutter 3.38 usa NDK r28 di default:

# Per progetti esistenti, aggiorna NDK
# android/gradle.properties
android.ndkVersion=28.0.12674087

Benefici 16KB pages:

  • +30% faster app launch su device high-RAM
  • Migliore memory efficiency
  • Play Store requirement soddisfatto

Test compatibilità:

# Testa su emulator con 16KB
flutter run --device-id=emulator-16kb

# O crea AVD custom
avdmanager create avd -n pixel_16kb \
  -k "system-images;android-35;google_apis;x86_64" \
  -d pixel_7 \
  --override-ram 16384

Flutter Web: Hot Reload di Default

Stateful hot reload abilitato di default per web!

# Prima - flag experimental necessario
flutter run -d chrome --dart-define=FLUTTER_WEB_USE_EXPERIMENTAL_HOT_RELOAD=true

# ✅ Flutter 3.38 - Default!
flutter run -d chrome
# Hot reload funziona automaticamente!

Web Configuration File:

Nuova configurazione YAML per web server:

# web_config.yaml
server:
  host: localhost
  port: 8080

ssl:
  enabled: true
  certificate: /path/to/cert.pem
  key: /path/to/key.pem

proxy:
  enabled: true
  target: https://api.example.com
# Usa configurazione
flutter run -d chrome --web-config=web_config.yaml

Java 17 Minimum for Android

Android build ora richiede Java 17 minimo:

# Verifica versione Java
java -version

# Se < 17, scarica JDK 17+
# https://adoptium.net/
// android/app/build.gradle
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = '17'
    }
}

Windows: Display Properties API

Nuova API per informazioni display su Windows!

import 'dart:ui' as ui;

// Ottieni info su tutti i monitor
List<ui.Display> displays = ui.PlatformDispatcher.instance.displays;

for (var display in displays) {
  print('Monitor: ${display.id}');
  print('Size: ${display.size.width}x${display.size.height}');
  print('Refresh rate: ${display.refreshRate} Hz');
  print('Device pixel ratio: ${display.devicePixelRatio}');
}

Caso d'uso - Multi-monitor:

class MultiMonitorApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      builder: (context, child) {
        final displays = ui.PlatformDispatcher.instance.displays;

        if (displays.length > 1) {
          return Row(
            children: displays.map((display) {
              return Expanded(
                child: Container(
                  color: Colors.primaries[displays.indexOf(display)],
                  child: Center(
                    child: Text('Monitor ${display.id}'),
                  ),
                ),
              );
            }).toList(),
          );
        }

        return child!;
      },
      home: HomeScreen(),
    );
  }
}

🎨 Framework Improvements

New Widget Features

1. SliverGrid.list Constructor:

// ✅ Nuovo - API più pulita
SliverGrid.list(
  children: [
    Card(child: Text('Item 1')),
    Card(child: Text('Item 2')),
    Card(child: Text('Item 3')),
  ],
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
    mainAxisSpacing: 8.0,
    crossAxisSpacing: 8.0,
  ),
)

// Prima - più verboso
SliverGrid(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
  delegate: SliverChildListDelegate([...]),
)

2. InkWell onLongPressUp:

InkWell(
  onLongPress: () => print('Long press started'),
  onLongPressUp: () => print('Long press released!'), // ✨ Nuovo!
  child: Text('Hold me'),
)

3. Badge.count maxCount:

Badge.count(
  count: 150,
  maxCount: 99, // ✨ Mostra "99+" se count > 99
  child: Icon(Icons.notifications),
)
// Mostra: "99+"

4. CupertinoSlidingSegmentedControl momentary:

CupertinoSlidingSegmentedControl(
  momentary: true, // ✨ Ritorna a stato precedente dopo tap
  groupValue: selectedSegment,
  children: {
    0: Text('One'),
    1: Text('Two'),
  },
  onValueChanged: (value) {
    print('Tapped: $value');
    // selectedSegment non cambia se momentary: true
  },
)

CupertinoDynamicColor Wide Gamut

Supporto completo per colori wide gamut su iOS:

// ✅ Wide gamut P3 colors
CupertinoDynamicColor.withBrightnessAndContrast(
  color: CupertinoColors.systemBlue.displayP3,
  darkColor: CupertinoColors.systemBlue.displayP3.darkColor,
  highContrastColor: CupertinoColors.systemBlue.displayP3.highContrastColor,
  darkHighContrastColor: CupertinoColors.systemBlue.displayP3.darkHighContrastColor,
)

🛠️ DevTools Improvements

Network Tab Enhancements

  • Indicatore recording più chiaro
  • Copy-paste network requests fixed
  • Filter improvements per tipo request

Inspector Fixes

  • Widget selection ora apre il TUO codice, non framework
  • Top buttons non più bloccati
  • Performance migliorate per widget tree grandi

📊 Performance Benchmarks

Metrica Flutter 3.35 Flutter 3.38 Improvement
App Launch (16KB) 850ms 595ms -30%
Hot Reload Web 2.1s 0.8s -62%
Widget Build (dot) 100% 100% cleaner
DevTools Responsiveness Good Better +15%

🔄 Migration Guide

Upgrade Flutter

# Upgrade to 3.38
flutter upgrade

# Verify version
flutter --version
# Flutter 3.38.0 • Dart 3.10.0

# Clean project
flutter clean
flutter pub get

Breaking Changes

1. AssetManifest.json Removed:

// ❌ Deprecated
await rootBundle.loadString('AssetManifest.json');

// ✅ Use
import 'package:flutter/services.dart';
final manifest = await AssetManifest.loadFromAssetBundle(rootBundle);

2. CupertinoDynamicColor Deprecations:

// ❌ Deprecated properties
CupertinoDynamicColor.withBrightness(
  color: color,
  darkColor: darkColor,
  elevatedColor: elevatedColor, // ❌ Removed
);

// ✅ Use new API
CupertinoDynamicColor.withBrightnessAndContrast(
  color: color,
  darkColor: darkColor,
  highContrastColor: highContrastColor,
  darkHighContrastColor: darkHighContrastColor,
);

3. UIScene Migration (iOS):

# Run migration tool
flutter create --platforms=ios .

# Segui migration guide
# https://docs.flutter.dev/release/breaking-changes/uiscene-migration

Gradle 8.14 & Java 17

// android/gradle/wrapper/gradle-wrapper.properties
distributionUrl=https://services.gradle.org/distributions/gradle-8.14-all.zip
# Set JAVA_HOME to JDK 17+
export JAVA_HOME=/path/to/jdk-17

💡 Quando Aggiornare?

✅ Aggiorna SUBITO se:

  • Target Android 15+ (16KB requirement!)
  • Sviluppi per iOS 26/Xcode 26
  • Vuoi dot shorthands (game changer!)
  • Usi Flutter Web (hot reload!)
  • Vuoi provare GenUI SDK

⚠️ Testa Prima se:

  • Hai molti plugin nativi (UIScene migration)
  • App in produzione con CI/CD complex
  • Custom iOS AppDelegate code

🎯 Migration Timeline:

  1. Week 1: Test su dev branch
  2. Week 2: Update plugins e native code
  3. Week 3: Staging deployment
  4. Week 4: Production rollout

🔗 Risorse Utili

🎓 Conclusioni

Flutter 3.38 è una release quality-of-life:

Dart Shorthands - Codice più pulito e leggibile ✅ Widget Previewer - Faster dev workflow ✅ GenUI SDK - AI-powered UI generation ✅ iOS 26 Full Support - UIScene ready ✅ 16KB Page Size - Android 15 compliant ✅ Web Hot Reload - No more full rebuild ✅ Java 17 - Modern Android toolchain ✅ DevTools Polish - Better debugging experience