2026'da React Native 0.86: Android'de Edge-to-Edge, DevTools ve Mülakat Soruları
Android 15+ için edge-to-edge desteği, KeyboardAvoidingView düzeltmeleri, yeni DevTools özellikleri ve mülakat soruları ile React Native 0.86 rehberi.

React Native 0.86, Android 15+ için kapsamlı edge-to-edge desteği getirerek art arda ikinci sürüm olarak sıfır kırılma değişikliği sunmaktadır. Haziran 2026'da yayınlanan bu sürüm, Android'in zorunlu edge-to-edge uygulamasının sessizce bozduğu kritik düzen ve ölçüm API sorunlarını gidermektedir.
React Native 0.86, 0.85 sürümü ile tam geriye dönük uyumluluk sağlamaktadır. Güncelleme yolu çoğu uygulama için kod değişikliği gerektirmez ve bu da React Native tarihindeki en sorunsuz ana sürüm geçişlerinden biri olmasını sağlar.
Android 15'te Edge-to-Edge Kavramını Anlamak
Edge-to-edge düzenleri, içeriğin durum çubuğu ve gezinme çubuğu gibi sistem UI öğelerinin altına kadar uzanmasına olanak tanır. Android 15, uygulama yapılandırmasından bağımsız olarak bu davranışı varsayılan olarak zorunlu kılar. React Native 0.86, bu koşullarda tüm ölçüm ve düzen API'lerinin doğru şekilde çalışmasını sağlar.
measureInWindow fonksiyonu artık edge-to-edge modu etkinken doğru koordinatlar döndürür. Daha önce ölçümler, sistem UI öğelerinin yüksekliği kadar kaydırılabiliyordu ve bu durum overlay'lerde, tooltip'lerde ve kayan eylem düğmelerinde konumlandırma hatalarına neden oluyordu.
import React, { useRef, useCallback } from 'react';
import { View, TouchableOpacity, Text, StyleSheet } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
interface TooltipPosition {
x: number;
y: number;
}
export function SafeAreaHandler() {
const buttonRef = useRef<View>(null);
const insets = useSafeAreaInsets();
const showTooltip = useCallback(() => {
// measureInWindow artık Android 15+ üzerinde doğru koordinatları döndürür
buttonRef.current?.measureInWindow((x, y, width, height) => {
const position: TooltipPosition = {
x: x + width / 2,
// Edge-to-edge etkin olsa bile koordinatlar doğrudur
y: y + height + 8,
};
console.log('Tooltip konumu:', position);
});
}, []);
return (
<View style={[styles.container, { paddingTop: insets.top }]}>
<View ref={buttonRef} collapsable={false}>
<TouchableOpacity onPress={showTooltip} style={styles.button}>
<Text style={styles.buttonText}>Tooltip Göster</Text>
</TouchableOpacity>
</View>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, alignItems: 'center', justifyContent: 'center' },
button: { backgroundColor: '#007AFF', padding: 16, borderRadius: 8 },
buttonText: { color: '#FFFFFF', fontWeight: '600' },
});collapsable={false} prop'u, View'in ölçüm için yerel bir referans korumasını sağlar. Bu olmadan React Native, yerel view'i optimize edebilir ve measureInWindow'un başarısız olmasına neden olabilir.
Android 15 için KeyboardAvoidingView Düzeltmeleri
KeyboardAvoidingView bileşeni, edge-to-edge modu etkinken kullanılabilir alanı yanlış hesaplıyordu. Sürüm 0.86, klavye offset hesaplamalarında sistem UI inset'lerini dikkate alarak bu sorunu düzeltir.
import React, { useState } from 'react';
import {
KeyboardAvoidingView,
Platform,
TextInput,
View,
FlatList,
StyleSheet,
} from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
interface Message {
id: string;
text: string;
}
export function ChatInput() {
const [message, setMessage] = useState('');
const [messages] = useState<Message[]>([]);
const insets = useSafeAreaInsets();
return (
<KeyboardAvoidingView
style={styles.container}
// 0.86 düzeltmesi: behavior="padding" edge-to-edge ile doğru çalışır
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
// keyboardVerticalOffset artık sistem inset'lerini hesaba katar
keyboardVerticalOffset={Platform.OS === 'ios' ? 0 : insets.bottom}
>
<FlatList
data={messages}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<View style={styles.messageContainer}>
<Text>{item.text}</Text>
</View>
)}
contentContainerStyle={{ paddingBottom: 16 }}
/>
<View style={[styles.inputContainer, { paddingBottom: insets.bottom }]}>
<TextInput
style={styles.input}
value={message}
onChangeText={setMessage}
placeholder="Mesaj yazın..."
multiline
/>
</View>
</KeyboardAvoidingView>
);
}
const styles = StyleSheet.create({
container: { flex: 1 },
messageContainer: { padding: 12, marginVertical: 4 },
inputContainer: { borderTopWidth: 1, borderTopColor: '#E5E5E5', padding: 8 },
input: { minHeight: 40, maxHeight: 120, paddingHorizontal: 12 },
});keyboardVerticalOffset özelliği artık safe area inset'leri ile doğru şekilde entegre olur. Bu düzeltme, Android 15 cihazlarda metin alanlarının klavye tarafından kısmen örtüldüğü yaygın hatayı ortadan kaldırır.
Yeni React Native DevTools Özellikleri
React Native 0.86, React Native DevTools'a önemli geliştirmeler getirerek daha entegre bir hata ayıklama deneyimi sunar. Yeni DevTools mimarisi, performans ödünleri olmadan gerçek zamanlı bileşen ağacı incelemesi sağlayarak doğrudan uygulama çalışma zamanına bağlanır.
import React, { useEffect, useCallback } from 'react';
import { InteractionManager, PerformanceObserver } from 'react-native';
interface PerformanceEntry {
name: string;
duration: number;
startTime: number;
}
export function usePerformanceMonitoring() {
const logPerformance = useCallback((entries: PerformanceEntry[]) => {
entries.forEach((entry) => {
if (__DEV__) {
// DevTools entegrasyonu: metrikler Performance panelinde görünür
console.log(`[Perf] ${entry.name}: ${entry.duration.toFixed(2)}ms`);
}
});
}, []);
useEffect(() => {
const observer = new PerformanceObserver((list) => {
logPerformance(list.getEntries() as PerformanceEntry[]);
});
observer.observe({ entryTypes: ['measure'] });
return () => observer.disconnect();
}, [logPerformance]);
const measureInteraction = useCallback(
(name: string, callback: () => void) => {
const start = performance.now();
InteractionManager.runAfterInteractions(() => {
callback();
const duration = performance.now() - start;
performance.measure(name, { start, duration });
});
},
[]
);
return { measureInteraction };
}Network DevTools paneli artık DNS sorgusu, TLS el sıkışması ve yanıt transferi süreleri dahil olmak üzere tam zamanlama ayrıntılarıyla istekleri görüntüler. Bu görünürlük, harici proxy araçları olmadan ağ darboğazlarını tanımlamaya yardımcı olur.
React 19 Entegrasyon Optimizasyonları
React Native 0.86, sunucu mimarisini kullanan uygulamalar için Actions, use hook ve Server Components dahil olmak üzere React 19 özelliklerinden tam olarak yararlanır. Sunucu tarafı rendering entegrasyonu, ilk uygulama yüklemesi sırasında veri ön yüklemesine olanak tanır.
import React, { use, Suspense } from 'react';
import { View, Text, ActivityIndicator, StyleSheet } from 'react-native';
interface User {
id: string;
name: string;
email: string;
avatar: string;
}
async function fetchUser(userId: string): Promise<User> {
const response = await fetch(`/api/users/${userId}`);
if (!response.ok) throw new Error('Kullanıcı getirilemedi');
return response.json();
}
// Optimal önbellekleme için kaynağı bileşen dışında oluştur
const userResource = new Map<string, Promise<User>>();
function getUserResource(userId: string): Promise<User> {
if (!userResource.has(userId)) {
userResource.set(userId, fetchUser(userId));
}
return userResource.get(userId)!;
}
function UserProfileContent({ userId }: { userId: string }) {
// use() hook Promise'i bekler ve renderlamayı askıya alır
const user = use(getUserResource(userId));
return (
<View style={styles.profileContainer}>
<Text style={styles.name}>{user.name}</Text>
<Text style={styles.email}>{user.email}</Text>
</View>
);
}
export function UserProfile({ userId }: { userId: string }) {
return (
<Suspense
fallback={
<View style={styles.loadingContainer}>
<ActivityIndicator size="large" />
</View>
}
>
<UserProfileContent userId={userId} />
</Suspense>
);
}
const styles = StyleSheet.create({
profileContainer: { padding: 16 },
name: { fontSize: 24, fontWeight: 'bold' },
email: { fontSize: 16, color: '#666', marginTop: 4 },
loadingContainer: { flex: 1, justifyContent: 'center', alignItems: 'center' },
});React 19'un use() hook'u, Suspense ile entegre olarak asenkron veri getirmeyi basitleştirir. Bu kalıp, yükleme durumu şablonunu ortadan kaldırır ve uygulama genelinde tutarlı hata işleme sağlar.
Yeni Mimariye Geçiş
React Native 0.86, eski mimariyi kullanımdan kaldırma sürecini devam ettirmektedir. Bridge hala mevcut olsa da, geliştiriciler gelecek sürümlerde zorunlu hale gelmeden önce yeni mimariye geçişi planlamalıdır.
import { TurboModuleRegistry } from 'react-native';
// Tip güvenliği için modül arayüzü tanımı
interface DeviceInfoModule {
getDeviceName(): Promise<string>;
getBatteryLevel(): Promise<number>;
getSystemVersion(): string; // Senkron metot
}
// TurboModule'a erişim
const DeviceInfo = TurboModuleRegistry.getEnforcing<DeviceInfoModule>('DeviceInfo');
export async function getDeviceDetails() {
try {
const [name, battery] = await Promise.all([
DeviceInfo.getDeviceName(),
DeviceInfo.getBatteryLevel(),
]);
// Senkron metotlar await olmadan çalışır
const systemVersion = DeviceInfo.getSystemVersion();
return {
name,
battery: `${(battery * 100).toFixed(0)}%`,
systemVersion,
};
} catch (error) {
console.error('Cihaz bilgileri alınamadı:', error);
throw error;
}
}TurboModules, yerel metotlara senkron erişim ve Codegen spesifikasyonları aracılığıyla tip güvenliği sağlar. Bu mimari, eski bridge'in gerektirdiği JSON serileştirme yükünü ortadan kaldırır.
Jest İşleme Geliştirmeleri
Jest sistemi, kenar jest çakışmaları ve jest kütüphaneleri arasındaki koordinasyonla ilgili düzeltmeler almıştır. Sistem navigasyon jestleri artık özel jest işleyicileri ile sorunsuz bir şekilde entegre olur.
import React from 'react';
import { View, Text, StyleSheet, Dimensions } from 'react-native';
import {
Gesture,
GestureDetector,
GestureHandlerRootView,
} from 'react-native-gesture-handler';
import Animated, {
useSharedValue,
useAnimatedStyle,
withSpring,
runOnJS,
} from 'react-native-reanimated';
const { width: SCREEN_WIDTH } = Dimensions.get('window');
const SWIPE_THRESHOLD = SCREEN_WIDTH * 0.3;
interface CardProps {
title: string;
onDismiss: () => void;
}
export function SwipeableCard({ title, onDismiss }: CardProps) {
const translateX = useSharedValue(0);
const panGesture = Gesture.Pan()
// Kenar navigasyonu ile çakışmayı önle
.activeOffsetX([-10, 10])
.failOffsetY([-5, 5])
.onUpdate((event) => {
translateX.value = event.translationX;
})
.onEnd((event) => {
if (Math.abs(event.translationX) > SWIPE_THRESHOLD) {
translateX.value = withSpring(
Math.sign(event.translationX) * SCREEN_WIDTH,
{},
() => runOnJS(onDismiss)()
);
} else {
translateX.value = withSpring(0);
}
});
const animatedStyle = useAnimatedStyle(() => ({
transform: [{ translateX: translateX.value }],
}));
return (
<GestureHandlerRootView>
<GestureDetector gesture={panGesture}>
<Animated.View style={[styles.card, animatedStyle]}>
<Text style={styles.title}>{title}</Text>
</Animated.View>
</GestureDetector>
</GestureHandlerRootView>
);
}
const styles = StyleSheet.create({
card: {
backgroundColor: '#FFFFFF',
borderRadius: 12,
padding: 16,
marginVertical: 8,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
elevation: 3,
},
title: { fontSize: 18, fontWeight: '600' },
});activeOffsetX özelliği, kenar navigasyonu sırasında jestin yanlışlıkla etkinleştirilmesini önler. Bu yapılandırma, kart jestlerinin yalnızca kasıtlı kullanıcı etkileşimi ile etkinleşmesini sağlar.
React Native mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
React Native 0.86 Mülakat Soruları
Aşağıda 2026 yılında React Native mülakatlarında sıkça karşılaşılan teknik sorular sunulmaktadır.
Soru: React Native 0.86'nın Android 15'te edge-to-edge modunu nasıl ele aldığını açıklayın.
Cevap: React Native 0.86, içerik sistem çubukları altına uzandığında doğru değerler döndürmek için measureInWindow ve KeyboardAvoidingView API'lerini düzeltir. Uygulamalar inset değerlerini almak için react-native-safe-area-context kullanmalı ve bunları padding veya margin olarak uygulamalıdır. collapsable={false} prop'u, React Native'in optimize etmesini önlemek için ölçüm gerektiren View'larda zorunludur.
Soru: React Native'de eski mimari ile yeni mimari arasındaki fark nedir?
Cevap: Eski mimari, JavaScript ile yerel kod arasındaki iletişim için JSON serileştirmeli asenkron bridge kullanır. Yeni mimari, katmanlar arasında senkron çağrılara izin veren JavaScript Interface (JSI) kullanır. TurboModules, tembel yükleme ve tip güvenliği ile Native Modules'ın yerini alır. Fabric Renderer, eski renderer'ın yerini alarak yerel view ağacını doğrudan yönetir.
Soru: Bir sohbet görünümünde doğru klavye kaçınmayı nasıl uygularsınız?
Cevap: iOS'ta behavior="padding" ve Android'de behavior="height" ile KeyboardAvoidingView kullanılmalıdır. keyboardVerticalOffset değeri başlık öğelerinin yüksekliğini ve navigasyon inset'lerini hesaba katmalıdır. Android 15+'da edge-to-edge modunu hesaba katmak için offset'e insets.bottom eklenmeli ve giriş kapsayıcısı doğru konumlandırma için paddingBottom: insets.bottom içermelidir.
Soru: React Native 0.86 hangi hata ayıklama geliştirmelerini sunuyor?
Cevap: React Native DevTools artık performans etkisi olmadan gerçek zamanlı bileşen ağacı incelemesi sunar. Network paneli DNS, TLS ve transfer dahil zamanlama ayrıntılarını gösterir. Performance paneli InteractionManager ve özel ölçümlerden metrikleri entegre eder. Bu araçlar harici proxy'ler olmadan çalışır ve hata ayıklama kurulum karmaşıklığını azaltır.
Soru: React 19'un use hook'unun React Native bileşenleriyle nasıl çalıştığını açıklayın.
Cevap: use() hook'u, bileşenlerin Promise'leri doğrudan tüketmesine olanak tanır ve çözümlenene kadar renderlamayı askıya alır. Yükleme durumları için Suspense sınırları ve hata işleme için Error Boundaries ile entegre olur. Promise'ler sonsuz render döngülerinden kaçınmak için bileşenlerin dışında oluşturulmalı veya memoize edilmelidir. Bu kalıp manuel yükleme durumu yönetimini ortadan kaldırır ve tutarlı veri getirme kalıpları sağlar.
Soru: Özel bir kaydırma jesti ile sistem navigasyonu arasındaki çakışmaları nasıl önlersiniz?
Cevap: Jest tanıyıcıları uygun etkinleştirme eşikleri ile yapılandırılmalıdır. activeOffsetX ayarı etkinleşmeden önce minimum yatay hareket gerektirir. failOffsetY ayarı, dikey hareket eşiği önce aşılırsa jestin başarısız olmasına neden olur. Bu yapılandırmalar, görünüm içindeki kullanıcı etkileşimlerini etkinleştirirken sistem kenar jestlerinin müdahale olmadan çalışmasına olanak tanır.
Soru: TurboModules'a geçiş için hangi adımlar gereklidir?
Cevap: Önce Codegen spesifikasyonu ile TypeScript veya Flow'da modül arayüzü tanımlanmalıdır. Ardından oluşturulan arayüzlere uygun yerel modül uygulanmalıdır. NativeModules yerine TurboModuleRegistry.getEnforcing() kullanılmalıdır. Senkron metotlar async/await olmadan doğrudan değer döndürebilir. Zamanlama farklılıkları gizli yarış koşullarını ortaya çıkarabileceğinden kapsamlı test yapılmalıdır.
Güncelleme Yolu ve Uyumluluk
React Native 0.85'ten güncelleme çoğu uygulama için minimum değişiklik gerektirir. Aşağıdaki adımlar uygulanmalıdır:
# Paketleri güncelle
npm install react-native@0.86.0
npm install react@19.0.0
# Önbelleği temizle
npx react-native start --reset-cache
# Yerel bağımlılıkları yeniden derle
cd android && ./gradlew clean && cd ..
cd ios && pod install --repo-update && cd ..Yerel kod içeren kütüphaneler kullanan uygulamalar bu bağımlılıkları güncellemeyi gerektirebilir. Aşağıdaki kütüphanelerin 0.86 sürümü ile uyumlu olduğu doğrulanmıştır: react-navigation 7.x, react-native-reanimated 4.x, react-native-gesture-handler 2.x ve react-native-safe-area-context 5.x.
Sonuç
React Native 0.86, Android 15 uyumluluk sorunlarını düzeltmeye ve geliştirici deneyimini iyileştirmeye odaklanan kararlı bir sürümü temsil eder. Kırılma değişikliklerinin olmaması, çoğu proje için güncellemeyi basit hale getirir. Temel iyileştirmeler arasında edge-to-edge ölçüm düzeltmeleri, KeyboardAvoidingView geliştirmeleri, React 19 entegrasyonu ve geliştirilmiş DevTools bulunmaktadır. Geliştiriciler, gelecek gereksinimlerine hazırlanmak için yeni mimariye geçişe öncelik vermelidir. Android 15 cihazlarda düzenli test, uygulamaların zorunlu edge-to-edge yapılandırmasında düzgün çalışmasını sağlar.
Etiketler
Paylaş
İlgili makaleler

React Native ve TypeScript 2026: Tip Güvenli Mimari ve Mülakat Soruları
React Native'de TypeScript ile tip güvenli mimari oluşturma: Strict API, TurboModule Codegen, React Navigation 7 tiplendirmesi ve discriminated union'lar.

2026'da React Native 0.85: Yeni Animasyon Backend'i, Katı TypeScript API ve Mülakat Soruları
React Native 0.85, Shared Animation Backend, post-bridge mimari ve Metro TLS desteği sunuyor. Kod örnekleri ve mülakat sorularıyla derinlemesine inceleme.

React Native: 2026'da Eksiksiz Bir Mobil Uygulama Gelistirmek
React Native ile iOS ve Android icin mobil uygulama gelistirmenin kapsamli rehberi. Kurulumdan yayinlamaya kadar tum temel bilgiler.