Native vs Cross-Platform Mobil Geliştirme
Platform özelinde native geliştirme mi yoksa Flutter/React Native gibi cross-platform çerçeveler mi? Mimari kararın tüm boyutlarıyla değerlendirmesi.
Skia/Impeller tabanlı, pixel-perfect cross-platform UI
JavaScript/TypeScript ile native bileşenler, web developer'lar için tanıdık
// Flutter - Animasyonlu ürün kartı
import 'package:flutter/material.dart';
class ProductCard extends StatefulWidget {
final String productName;
final double price;
final String imageUrl;
const ProductCard({
super.key,
required this.productName,
required this.price,
required this.imageUrl,
});
@override
State<ProductCard> createState() => _ProductCardState();
}
class _ProductCardState extends State<ProductCard>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _scaleAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 200),
vsync: this,
);
_scaleAnimation = Tween<double>(begin: 1.0, end: 0.95).animate(
CurvedAnimation(parent: _controller, curve: Curves.easeInOut),
);
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTapDown: (_) => _controller.forward(),
onTapUp: (_) => _controller.reverse(),
child: AnimatedBuilder(
animation: _scaleAnimation,
builder: (context, child) => Transform.scale(
scale: _scaleAnimation.value,
child: Card(
child: Column(
children: [
Image.network(widget.imageUrl, height: 200, fit: BoxFit.cover),
Padding(
padding: const EdgeInsets.all(16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(widget.productName, style: Theme.of(context).textTheme.titleMedium),
Text('₺${widget.price.toStringAsFixed(2)}',
style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.green)),
],
),
),
],
),
),
),
),
);
}
}// React Native - Animasyonlu ürün kartı
import React, { useRef } from 'react';
import {
Animated,
TouchableWithoutFeedback,
Image,
Text,
View,
StyleSheet,
} from 'react-native';
interface ProductCardProps {
productName: string;
price: number;
imageUrl: string;
}
export function ProductCard({ productName, price, imageUrl }: ProductCardProps) {
const scaleAnim = useRef(new Animated.Value(1)).current;
const handlePressIn = () => {
Animated.spring(scaleAnim, {
toValue: 0.95,
useNativeDriver: true,
}).start();
};
const handlePressOut = () => {
Animated.spring(scaleAnim, {
toValue: 1,
friction: 3,
useNativeDriver: true,
}).start();
};
return (
<TouchableWithoutFeedback onPressIn={handlePressIn} onPressOut={handlePressOut}>
<Animated.View style={[styles.card, { transform: [{ scale: scaleAnim }] }]}>
<Image source={{ uri: imageUrl }} style={styles.image} resizeMode="cover" />
<View style={styles.info}>
<Text style={styles.name}>{productName}</Text>
<Text style={styles.price}>₺{price.toFixed(2)}</Text>
</View>
</Animated.View>
</TouchableWithoutFeedback>
);
}
const styles = StyleSheet.create({
card: { borderRadius: 12, overflow: 'hidden', backgroundColor: 'white', elevation: 4 },
image: { width: '100%', height: 200 },
info: { flexDirection: 'row', justifyContent: 'space-between', padding: 16 },
name: { fontSize: 16, fontWeight: '600' },
price: { fontSize: 16, fontWeight: '700', color: '#22c55e' },
});2025'te Flutter, performans ve tutarlı UI açısından öne geçiyor — özellikle özel tasarımlı, animasyon ağırlıklı uygulamalar için. React Native ise JavaScript/TypeScript ekibiniz varsa ve hızla iterasyon yapmanız gerekiyorsa daha pratik. İkisi de üretim kalitesinde; karar ekip yetkinliğine göre verilmeli.
Flutter, Skia/Impeller ile native bridge olmadan render ettiği için genellikle daha tutarlı 60fps sağlıyor. React Native New Architecture ile bu farkı önemli ölçüde kapattı.