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.

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:
- Week 1: Test su dev branch
- Week 2: Update plugins e native code
- Week 3: Staging deployment
- Week 4: Production rollout
🔗 Risorse Utili
- Flutter 3.38 Announcement
- Dart 3.10 Release Notes
- Release Notes
- Breaking Changes
- UIScene Migration Guide
- Flutter GenUI
🎓 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