466 lines
14 KiB
Markdown
466 lines
14 KiB
Markdown
# Mobile Frameworks Reference
|
|
|
|
Comprehensive guide to mobile development frameworks: React Native, Flutter, and native development.
|
|
|
|
## Framework Overview (2024-2025)
|
|
|
|
### React Native
|
|
- **Language**: JavaScript/TypeScript
|
|
- **Stars**: 121,000+ on GitHub
|
|
- **Adoption**: 35% of mobile developers, 67% familiarity
|
|
- **Performance**: 80-90% native performance
|
|
- **Architecture**: Bridge-based (legacy) → New Architecture (JSI, Fabric, Codegen)
|
|
- **Rendering**: Native components
|
|
- **Hot Reload**: Yes
|
|
- **Community**: Huge (npm ecosystem, 3M+ downloads/week)
|
|
|
|
### Flutter
|
|
- **Language**: Dart
|
|
- **Stars**: 170,000+ on GitHub (fastest-growing)
|
|
- **Adoption**: 46% of mobile developers
|
|
- **Performance**: 85-95% native performance
|
|
- **Architecture**: "Everything is a widget"
|
|
- **Rendering**: Custom Impeller rendering engine (eliminates jank)
|
|
- **Hot Reload**: Yes (fastest in industry)
|
|
- **Community**: Growing rapidly (23,000+ packages on pub.dev)
|
|
|
|
### Native iOS (Swift/SwiftUI)
|
|
- **Language**: Swift
|
|
- **Performance**: 100% native
|
|
- **UI Framework**: SwiftUI (declarative) or UIKit (imperative)
|
|
- **Latest**: Swift 6 with compile-time data race detection
|
|
- **Tooling**: Xcode 16, Swift Package Manager
|
|
- **Concurrency**: async/await, actors, @MainActor
|
|
|
|
### Native Android (Kotlin/Jetpack Compose)
|
|
- **Language**: Kotlin
|
|
- **Performance**: 100% native
|
|
- **UI Framework**: Jetpack Compose (declarative) or Views (imperative)
|
|
- **Latest**: Kotlin 2.1, Compose 1.7
|
|
- **Tooling**: Android Studio Hedgehog+
|
|
- **Coroutines**: Kotlin coroutines for async
|
|
|
|
## React Native Deep Dive
|
|
|
|
### Core Concepts
|
|
|
|
**New Architecture (0.82+ Mandatory)**
|
|
- **JSI (JavaScript Interface)**: Direct JS-to-native communication, eliminating bridge
|
|
- **Fabric**: New rendering system with synchronous layout
|
|
- **Codegen**: Static type safety between JS and native code
|
|
- **Turbo Modules**: Lazy-loaded native modules
|
|
|
|
**Performance Optimizations**
|
|
- **Hermes Engine**: 30-40% faster startup, reduced memory
|
|
- **Native Driver Animations**: Offloaded to UI thread (60 FPS)
|
|
- **FlatList Virtualization**: Renders only visible items
|
|
- **Image Optimization**: FastImage library, progressive loading
|
|
|
|
### Best Practices
|
|
|
|
**Project Structure (Feature-Based)**
|
|
```
|
|
src/
|
|
├── features/
|
|
│ ├── auth/
|
|
│ ├── profile/
|
|
│ └── dashboard/
|
|
├── shared/
|
|
│ ├── components/
|
|
│ ├── hooks/
|
|
│ └── utils/
|
|
├── navigation/
|
|
├── services/
|
|
└── stores/
|
|
```
|
|
|
|
**State Management (2024-2025)**
|
|
1. **Zustand** (Rising Star): Minimal boilerplate, 3KB, excellent TypeScript
|
|
2. **Redux Toolkit**: Enterprise apps, time-travel debugging, DevTools
|
|
3. **Recoil**: Meta-built, atom-based, experimental
|
|
4. **Context API**: Simple apps, avoid prop drilling
|
|
|
|
**Navigation**
|
|
- **React Navigation**: Industry standard, 80%+ adoption
|
|
- Type-safe navigation with TypeScript
|
|
- Deep linking configuration
|
|
- Tab, stack, drawer navigators
|
|
|
|
**TypeScript Adoption**
|
|
- 85%+ of new React Native projects use TypeScript
|
|
- Type safety prevents 15% of runtime errors
|
|
- Better IDE support and autocomplete
|
|
|
|
### Testing Strategy
|
|
|
|
**Unit Testing**
|
|
- **Jest**: Default test runner
|
|
- **React Native Testing Library**: Component testing, best practices
|
|
- Target: 70-80%+ code coverage
|
|
|
|
**E2E Testing**
|
|
- **Detox**: Gray-box testing, fast, reliable (recommended)
|
|
- **Appium**: Cross-platform, WebDriver-based
|
|
- **Maestro**: New player, simple YAML-based tests
|
|
|
|
**Example (React Native Testing Library)**
|
|
```javascript
|
|
import { render, fireEvent, waitFor } from '@testing-library/react-native';
|
|
|
|
test('login button should be enabled when form is valid', async () => {
|
|
const { getByTestId } = render(<LoginScreen />);
|
|
const emailInput = getByTestId('email-input');
|
|
const passwordInput = getByTestId('password-input');
|
|
const loginButton = getByTestId('login-button');
|
|
|
|
fireEvent.changeText(emailInput, 'test@example.com');
|
|
fireEvent.changeText(passwordInput, 'password123');
|
|
|
|
await waitFor(() => {
|
|
expect(loginButton).not.toBeDisabled();
|
|
});
|
|
});
|
|
```
|
|
|
|
### When to Choose React Native
|
|
|
|
**✅ Best For:**
|
|
- JavaScript/TypeScript expertise in team
|
|
- Code sharing with web (React)
|
|
- Rapid prototyping and MVPs
|
|
- Strong community support needed
|
|
- npm ecosystem integration
|
|
- Commercial apps (12.57% market share)
|
|
|
|
**❌ Not Ideal For:**
|
|
- Heavy graphics/gaming (use native or Unity)
|
|
- Maximum performance critical
|
|
- Deep platform-specific integrations
|
|
- Team unfamiliar with JavaScript
|
|
|
|
## Flutter Deep Dive
|
|
|
|
### Core Concepts
|
|
|
|
**"Everything is a Widget"**
|
|
- UI built from composable widgets
|
|
- Immutable widget tree
|
|
- Reactive updates with setState/state management
|
|
|
|
**Rendering Engine**
|
|
- **Impeller**: New rendering engine (iOS stable, Android preview)
|
|
- Eliminates shader jank
|
|
- 120 FPS capable on capable devices
|
|
- Custom Skia-based rendering (full control)
|
|
|
|
**Performance Features**
|
|
- **Const widgets**: Compile-time optimization
|
|
- **RepaintBoundary**: Isolate expensive repaints
|
|
- **ListView.builder**: Lazy loading for long lists
|
|
- **Cached network images**: Image optimization
|
|
|
|
### Best Practices
|
|
|
|
**Project Structure (Feature-First)**
|
|
```
|
|
lib/
|
|
├── features/
|
|
│ ├── auth/
|
|
│ │ ├── data/
|
|
│ │ ├── domain/
|
|
│ │ └── presentation/
|
|
│ └── profile/
|
|
├── core/
|
|
│ ├── theme/
|
|
│ ├── utils/
|
|
│ └── widgets/
|
|
├── routing/
|
|
└── main.dart
|
|
```
|
|
|
|
**State Management (2024-2025)**
|
|
1. **Riverpod 3**: Modern, compile-safe, recommended by Flutter team
|
|
2. **Bloc**: Enterprise apps, event-driven, predictable state
|
|
3. **Provider**: Beginners, simple apps
|
|
4. **GetX**: All-in-one (state + routing + DI), opinionated
|
|
|
|
**Navigation**
|
|
- **GoRouter**: Official recommendation (2024+), declarative routing
|
|
- Type-safe routes with code generation
|
|
- Deep linking built-in
|
|
- Replaces Navigator 2.0 for most use cases
|
|
|
|
**Priority Levels (Official)**
|
|
1. **P0**: Fix immediately (crashes, data loss)
|
|
2. **P1**: Fix within days (major features broken)
|
|
3. **P2**: Fix within weeks (annoyances)
|
|
4. **P3**: Nice to have
|
|
|
|
### Testing Strategy
|
|
|
|
**Unit Testing**
|
|
- **flutter_test**: Built-in testing package
|
|
- **Mockito**: Mocking dependencies
|
|
- Target: 80%+ code coverage
|
|
|
|
**Widget Testing**
|
|
- **WidgetTester**: Test UI and interactions
|
|
- **Golden Tests**: Visual regression testing
|
|
|
|
**Integration Testing**
|
|
- **integration_test**: End-to-end testing
|
|
- Run on real devices or emulators
|
|
|
|
**Example (Widget Testing)**
|
|
```dart
|
|
testWidgets('Counter increments', (WidgetTester tester) async {
|
|
await tester.pumpWidget(MyApp());
|
|
|
|
expect(find.text('0'), findsOneWidget);
|
|
expect(find.text('1'), findsNothing);
|
|
|
|
await tester.tap(find.byIcon(Icons.add));
|
|
await tester.pump();
|
|
|
|
expect(find.text('0'), findsNothing);
|
|
expect(find.text('1'), findsOneWidget);
|
|
});
|
|
```
|
|
|
|
### When to Choose Flutter
|
|
|
|
**✅ Best For:**
|
|
- Performance-critical applications
|
|
- Complex animations and custom UI
|
|
- Multi-platform (mobile, web, desktop)
|
|
- Consistent UI across platforms
|
|
- Growing team/startup (fastest development)
|
|
- Apps with heavy visual requirements
|
|
|
|
**❌ Not Ideal For:**
|
|
- Team unfamiliar with Dart
|
|
- Heavy reliance on native platform features
|
|
- Existing large JavaScript/native codebase
|
|
- Small app size critical (<20MB)
|
|
|
|
## Native iOS (Swift/SwiftUI)
|
|
|
|
### Core Concepts
|
|
|
|
**Swift 6 (2024-2025)**
|
|
- Compile-time data race detection
|
|
- Enhanced concurrency: async/await, actors, @MainActor
|
|
- Powerful macro system
|
|
- Move semantics for performance
|
|
|
|
**SwiftUI vs UIKit**
|
|
- **SwiftUI**: Declarative, 40% less code, iOS 13+, modern approach
|
|
- **UIKit**: Imperative, fine-grained control, legacy support, complex customizations
|
|
- Both work together in same project
|
|
|
|
### Architecture Patterns
|
|
|
|
**MVVM (Most Popular)**
|
|
```swift
|
|
// ViewModel (ObservableObject)
|
|
class LoginViewModel: ObservableObject {
|
|
@Published var email = ""
|
|
@Published var password = ""
|
|
@Published var isLoading = false
|
|
|
|
func login() async {
|
|
isLoading = true
|
|
// Login logic
|
|
isLoading = false
|
|
}
|
|
}
|
|
|
|
// View
|
|
struct LoginView: View {
|
|
@StateObject private var viewModel = LoginViewModel()
|
|
|
|
var body: some View {
|
|
VStack {
|
|
TextField("Email", text: $viewModel.email)
|
|
SecureField("Password", text: $viewModel.password)
|
|
Button("Login") {
|
|
Task { await viewModel.login() }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**TCA (The Composable Architecture)**
|
|
- Growing adoption (v1.13+)
|
|
- Excellent for complex apps
|
|
- Steeper learning curve
|
|
- Predictable state management
|
|
|
|
### When to Choose Native iOS
|
|
|
|
**✅ Best For:**
|
|
- iOS-only applications
|
|
- Maximum performance required
|
|
- Latest Apple features (WidgetKit, Live Activities, App Clips)
|
|
- Deep iOS ecosystem integration
|
|
- Team with Swift/iOS expertise
|
|
|
|
## Native Android (Kotlin/Jetpack Compose)
|
|
|
|
### Core Concepts
|
|
|
|
**Kotlin 2.1 (2024-2025)**
|
|
- Null safety by design
|
|
- Coroutines for async
|
|
- Sealed classes for type-safe states
|
|
- Extension functions
|
|
|
|
**Jetpack Compose**
|
|
- Declarative UI (like SwiftUI/React)
|
|
- 60% adoption in top 1,000 apps
|
|
- Material Design 3 integration
|
|
- Compose compiler with Kotlin 2.0+
|
|
|
|
### Architecture Patterns
|
|
|
|
**MVVM + Clean Architecture**
|
|
```kotlin
|
|
// ViewModel
|
|
class LoginViewModel(
|
|
private val loginUseCase: LoginUseCase
|
|
) : ViewModel() {
|
|
private val _uiState = MutableStateFlow(LoginUiState())
|
|
val uiState: StateFlow<LoginUiState> = _uiState.asStateFlow()
|
|
|
|
fun login(email: String, password: String) {
|
|
viewModelScope.launch {
|
|
_uiState.update { it.copy(isLoading = true) }
|
|
loginUseCase(email, password)
|
|
.onSuccess { /* Navigate */ }
|
|
.onFailure { /* Show error */ }
|
|
_uiState.update { it.copy(isLoading = false) }
|
|
}
|
|
}
|
|
}
|
|
|
|
// Composable
|
|
@Composable
|
|
fun LoginScreen(viewModel: LoginViewModel = hiltViewModel()) {
|
|
val uiState by viewModel.uiState.collectAsState()
|
|
|
|
Column {
|
|
TextField(
|
|
value = uiState.email,
|
|
onValueChange = { /* update */ }
|
|
)
|
|
Button(onClick = { viewModel.login() }) {
|
|
Text("Login")
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### When to Choose Native Android
|
|
|
|
**✅ Best For:**
|
|
- Android-only applications
|
|
- Maximum performance required
|
|
- Material Design 3 implementation
|
|
- Deep Android ecosystem integration
|
|
- Team with Kotlin/Android expertise
|
|
|
|
## Framework Comparison Matrix
|
|
|
|
| Feature | React Native | Flutter | Native iOS | Native Android |
|
|
|---------|--------------|---------|------------|----------------|
|
|
| **Language** | JavaScript/TS | Dart | Swift | Kotlin |
|
|
| **Learning Curve** | Easy | Medium | Medium | Medium |
|
|
| **Performance** | 80-90% | 85-95% | 100% | 100% |
|
|
| **Hot Reload** | Yes | Yes (fastest) | Previews | Live Edit |
|
|
| **Code Sharing** | Web (React) | Web/Desktop | No | No |
|
|
| **Community Size** | Huge | Growing | iOS only | Android only |
|
|
| **UI Paradigm** | Components | Widgets | Declarative | Declarative |
|
|
| **Third-party** | npm (3M+) | pub.dev (23K+) | SPM | Maven |
|
|
| **App Size** | 40-50MB | 15-20MB | 10-15MB | 10-15MB |
|
|
| **Build Time** | Medium | Fast | Slow (Xcode) | Medium |
|
|
| **Debugging** | Chrome/Safari | DevTools | Xcode | Android Studio |
|
|
| **Platform Feel** | Needs work | Needs work | Native | Native |
|
|
| **Startup Time** | Medium | Fast | Fastest | Fastest |
|
|
| **Best For** | JS teams | Performance | iOS-only | Android-only |
|
|
|
|
## Migration Paths
|
|
|
|
### React Native → Flutter
|
|
- **Effort**: High (complete rewrite)
|
|
- **Timeline**: 3-6 months for medium app
|
|
- **Benefits**: Better performance, smaller app size
|
|
- **Challenges**: New language (Dart), different ecosystem
|
|
|
|
### Flutter → React Native
|
|
- **Effort**: High (complete rewrite)
|
|
- **Timeline**: 3-6 months for medium app
|
|
- **Benefits**: Larger community, web code sharing
|
|
- **Challenges**: Lower performance, larger app size
|
|
|
|
### Cross-Platform → Native
|
|
- **Effort**: Very High (separate iOS and Android apps)
|
|
- **Timeline**: 6-12 months for medium app
|
|
- **Benefits**: Maximum performance, platform features
|
|
- **Challenges**: Maintain two codebases, 2x team size
|
|
|
|
### Native → Cross-Platform
|
|
- **Effort**: High (consolidate to one codebase)
|
|
- **Timeline**: 4-8 months for medium app
|
|
- **Benefits**: Single codebase, faster development
|
|
- **Challenges**: Performance tradeoffs, platform differences
|
|
|
|
## Decision Framework
|
|
|
|
### Start Here: Do you need native performance?
|
|
- **No** → Cross-platform (React Native or Flutter)
|
|
- **Yes** → Native (Swift or Kotlin)
|
|
|
|
### If Cross-Platform: Does team know JavaScript?
|
|
- **Yes** → React Native
|
|
- **No** → Flutter
|
|
|
|
### If Native: iOS-only or Android-only?
|
|
- **iOS-only** → Swift/SwiftUI
|
|
- **Android-only** → Kotlin/Compose
|
|
- **Both** → Reconsider cross-platform
|
|
|
|
### Additional Factors:
|
|
- **Existing codebase**: Use same technology
|
|
- **Web app exists**: React Native (code sharing)
|
|
- **Desktop needed**: Flutter (multi-platform)
|
|
- **Budget constrained**: Cross-platform
|
|
- **Performance critical**: Native
|
|
- **Complex animations**: Flutter or Native
|
|
- **Commercial focus**: React Native (larger market share)
|
|
|
|
## Resources
|
|
|
|
**React Native:**
|
|
- Official Docs: https://reactnative.dev/
|
|
- New Architecture: https://reactnative.dev/docs/the-new-architecture/landing-page
|
|
- Expo: https://expo.dev/ (recommended framework)
|
|
- Directory: https://reactnative.directory/
|
|
|
|
**Flutter:**
|
|
- Official Docs: https://flutter.dev/
|
|
- Pub.dev: https://pub.dev/
|
|
- Codelabs: https://flutter.dev/codelabs
|
|
- Widget Catalog: https://flutter.dev/widgets
|
|
|
|
**Native iOS:**
|
|
- Swift Docs: https://swift.org/documentation/
|
|
- SwiftUI Tutorials: https://developer.apple.com/tutorials/swiftui
|
|
- iOS HIG: https://developer.apple.com/design/human-interface-guidelines/
|
|
|
|
**Native Android:**
|
|
- Kotlin Docs: https://kotlinlang.org/docs/home.html
|
|
- Compose Docs: https://developer.android.com/jetpack/compose
|
|
- Material 3: https://m3.material.io/
|
|
- Android Guides: https://developer.android.com/guide
|