Music Creation Page: - Vinyl 3D flip to view lyrics, tonearm animation, glow rotation effect - Circular SVG progress ring, speech bubble feedback, confirm dialog - Playlist modal, free creation input, lyrics formatting optimization - MiniMax API real music generation with SSE streaming progress Backend: - FastAPI proxy server.py for MiniMax API calls - Music + lyrics file persistence to Capybara music/ directory - GET /api/playlist endpoint for auto-building playlist from files UI/UX Refinements: - frontend-design skill compliance across all pages - Glassmorphism effects, modal interactions, scroll tap prevention - iPhone 12 Pro responsive layout (390x844) Flutter Development Preparation: - Installed flutter-expert skill with 6 reference docs - Added 5 Cursor Rules: official Flutter, clean architecture, UI performance, testing, Dart standards Assets: - 9 Capybara music MP3 files + lyrics TXT files - MiniMax API documentation Co-authored-by: Cursor <cursoragent@cursor.com>
100 lines
2.0 KiB
Markdown
100 lines
2.0 KiB
Markdown
# Performance Optimization
|
|
|
|
## Profiling Commands
|
|
|
|
```bash
|
|
# Run in profile mode
|
|
flutter run --profile
|
|
|
|
# Analyze performance
|
|
flutter analyze
|
|
|
|
# DevTools
|
|
flutter pub global activate devtools
|
|
flutter pub global run devtools
|
|
```
|
|
|
|
## Common Optimizations
|
|
|
|
### Const Widgets
|
|
```dart
|
|
// ❌ Rebuilds every time
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
padding: EdgeInsets.all(16), // Creates new object
|
|
child: Text('Hello'),
|
|
);
|
|
}
|
|
|
|
// ✅ Const prevents rebuilds
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
padding: const EdgeInsets.all(16),
|
|
child: const Text('Hello'),
|
|
);
|
|
}
|
|
```
|
|
|
|
### Selective Provider Watching
|
|
```dart
|
|
// ❌ Rebuilds on any user change
|
|
final user = ref.watch(userProvider);
|
|
return Text(user.name);
|
|
|
|
// ✅ Only rebuilds when name changes
|
|
final name = ref.watch(userProvider.select((u) => u.name));
|
|
return Text(name);
|
|
```
|
|
|
|
### RepaintBoundary
|
|
```dart
|
|
// Isolate expensive widgets
|
|
RepaintBoundary(
|
|
child: ComplexAnimatedWidget(),
|
|
)
|
|
```
|
|
|
|
### Image Optimization
|
|
```dart
|
|
// Use cached_network_image
|
|
CachedNetworkImage(
|
|
imageUrl: url,
|
|
placeholder: (_, __) => const CircularProgressIndicator(),
|
|
errorWidget: (_, __, ___) => const Icon(Icons.error),
|
|
)
|
|
|
|
// Resize images
|
|
Image.network(
|
|
url,
|
|
cacheWidth: 200, // Resize in memory
|
|
cacheHeight: 200,
|
|
)
|
|
```
|
|
|
|
### Compute for Heavy Operations
|
|
```dart
|
|
// ❌ Blocks UI thread
|
|
final result = heavyComputation(data);
|
|
|
|
// ✅ Runs in isolate
|
|
final result = await compute(heavyComputation, data);
|
|
```
|
|
|
|
## Performance Checklist
|
|
|
|
| Check | Solution |
|
|
|-------|----------|
|
|
| Unnecessary rebuilds | Add `const`, use `select()` |
|
|
| Large lists | Use `ListView.builder` |
|
|
| Image loading | Use `cached_network_image` |
|
|
| Heavy computation | Use `compute()` |
|
|
| Jank in animations | Use `RepaintBoundary` |
|
|
| Memory leaks | Dispose controllers |
|
|
|
|
## DevTools Metrics
|
|
|
|
- **Frame rendering time**: < 16ms for 60fps
|
|
- **Widget rebuilds**: Minimize unnecessary rebuilds
|
|
- **Memory usage**: Watch for leaks
|
|
- **CPU profiler**: Identify bottlenecks
|