Oluştur'da en sevdiğiniz kitaplıkları kullanabilirsiniz. Bu bölümde, en kullanışlı kitaplıklardan bazılarını nasıl dahil edeceğiniz açıklanmaktadır.
Etkinlik
Bir etkinlikte Compose'u kullanmak için ComponentActivity
kullanmanız gerekir. Bu, Activity
sınıfının bir alt sınıfıdır ve Compose için uygun LifecycleOwner
ve bileşenleri sağlar. Ayrıca, kodunuzu etkinlik sınıfınızdaki geçersiz kılma yöntemlerinden ayıran ek API'ler de sağlar.
Activity Compose, bu API'leri composable'lara sunar. Böylece, composable'larınızın dışındaki yöntemleri geçersiz kılmak veya açık bir Activity
örneği almak artık gerekmez.
Ayrıca bu API'ler, yalnızca bir kez başlatılmalarını, yeniden oluşturma işleminden sonra çalışmaya devam etmelerini ve composable, kompozisyondan kaldırılırsa düzgün bir şekilde temizlenmelerini sağlar.
Etkinlik Sonucu
rememberLauncherForActivityResult()
API, composable'ınızda
bir etkinlikten sonuç almanıza olanak tanır:
@Composable fun GetContentExample() { var imageUri by remember { mutableStateOf<Uri?>(null) } val launcher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> imageUri = uri } Column { Button(onClick = { launcher.launch("image/*") }) { Text(text = "Load Image") } Image( painter = rememberAsyncImagePainter(imageUri), contentDescription = "My Image" ) } }
Bu örnekte basit bir
GetContent()
sözleşmesi gösterilmektedir. Düğmeye dokunulduğunda istek başlatılır. rememberLauncherForActivityResult()
için sondaki lambda, kullanıcı bir resim seçip başlatma etkinliğine döndüğünde çağrılır.
Bu işlem, Coil'in rememberImagePainter()
işlevini kullanarak seçili resmi yükler.
ActivityResultContract
alt sınıflarının herhangi biri,
rememberLauncherForActivityResult()
için ilk bağımsız değişken olarak kullanılabilir.
Bu, bu tekniği kullanarak çerçeveden içerik isteyebileceğiniz ve diğer yaygın desenlerde kullanabileceğiniz anlamına gelir. Ayrıca kendi özel sözleşmelerinizi oluşturup bu teknikle kullanabilirsiniz.
Çalışma zamanı izinleri isteme
Yukarıda açıklanan aynı Activity Result API ve rememberLauncherForActivityResult()
, tek bir izin için RequestPermission
sözleşmesi veya birden fazla izin için RequestMultiplePermissions
sözleşmesi kullanılarak çalışma zamanı izinleri istemek için kullanılabilir.
Accompanist Permissions kitaplığı, izinler için mevcut verilen durumu Compose kullanıcı arayüzünüzün kullanabileceği bir duruma eşlemek üzere bu API'lerin üzerinde bir katman olarak da kullanılabilir.
Sistem geri düğmesini işleme
Özel geri gezinme sağlamak ve sistemin geri düğmesinin varsayılan davranışını composable'ınızdan geçersiz kılmak için composable'ınız bu etkinliği yakalamak üzere BackHandler
kullanabilir:
var backHandlingEnabled by remember { mutableStateOf(true) } BackHandler(backHandlingEnabled) { // Handle back press }
İlk bağımsız değişken, BackHandler
öğesinin şu anda etkin olup olmadığını kontrol eder. Bu bağımsız değişkeni, bileşeninizin durumuna göre işleyicinizi geçici olarak devre dışı bırakmak için kullanabilirsiniz. Kullanıcı bir sistem geri etkinliğini tetiklerse ve BackHandler
şu anda etkinse sondaki lambda çağrılır.
ViewModel
Architecture Components ViewModel kitaplığını kullanıyorsanız viewModel()
işlevini çağırarak herhangi bir composable'dan ViewModel
öğesine erişebilirsiniz. Gradle dosyanıza aşağıdaki bağımlılığı ekleyin:
Groovy
dependencies { implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5' }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5") }
Ardından kodunuzda viewModel()
işlevini kullanabilirsiniz.
class MyViewModel : ViewModel() { /*...*/ } // import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun MyScreen( viewModel: MyViewModel = viewModel() ) { // use viewModel here }
viewModel()
, mevcut bir ViewModel
değerini döndürür veya yeni bir değer oluşturur. Varsayılan olarak, döndürülen ViewModel
, kapsayan etkinlik, parça veya gezinme hedefiyle sınırlıdır ve kapsam etkin olduğu sürece korunur.
Örneğin, composable bir etkinlikte kullanılıyorsa viewModel()
, etkinlik tamamlanana veya işlem sonlandırılana kadar aynı örneği döndürür.
class MyViewModel : ViewModel() { /*...*/ } // import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun MyScreen( // Returns the same instance as long as the activity is alive, // just as if you grabbed the instance from an Activity or Fragment viewModel: MyViewModel = viewModel() ) { /* ... */ } @Composable fun MyScreen2( viewModel: MyViewModel = viewModel() // Same instance as in MyScreen ) { /* ... */ }
Kullanım kuralları
ViewModel
örneklerine genellikle ekran düzeyindeki composable'larda erişirsiniz. Bu, bir etkinlikten, parçadan veya gezinme grafiğinin hedefinden çağrılan kök composable'a yakın olduğu anlamına gelir. Bunun nedeni, ViewModel
s'nin varsayılan olarak bu ekran düzeyindeki nesnelerle sınırlı olmasıdır. ViewModel
'nın yaşam döngüsü ve kapsamı hakkında daha fazla bilgiyi burada bulabilirsiniz.
Bu, söz konusu composable'ların test edilmesini zorlaştırabileceğinden ve önizlemeleri bozabileceğinden ViewModel
örneklerini diğer composable'lara aktarmaktan kaçınmaya çalışın. Bunun yerine, yalnızca ihtiyaç duydukları verileri ve işlevleri parametre olarak iletin.
Alt ekran düzeyindeki composable'ların durumunu yönetmek için ViewModel
örneklerini kullanabilirsiniz. Ancak ViewModel
'nin yaşam döngüsü ve kapsamı hakkında bilgi sahibi olmanız gerekir. Birleştirilebilir öğe bağımsızsa üst birleştirilebilir öğelerden bağımlılıkları aktarmak zorunda kalmamak için ViewModel
öğesini yerleştirmek üzere Hilt'i kullanmayı düşünebilirsiniz.
ViewModel
öğenizin bağımlılıkları varsa viewModel()
, isteğe bağlı bir ViewModelProvider.Factory
öğesini parametre olarak alır.
Oluşturma'daki ViewModel
ve örneklerin Navigation Compose kitaplığı, etkinlikler ve parçalarla nasıl kullanıldığı hakkında daha fazla bilgi için Birlikte çalışabilirlik belgelerine bakın.
Veri akışları
Compose, Android'in en popüler akış tabanlı çözümleri için uzantılarla birlikte gelir. Bu uzantıların her biri farklı bir yapıt tarafından sağlanır:
LiveData.observeAsState()
,androidx.compose.runtime:runtime-livedata:$composeVersion
yapısına dahil edildi.Flow.collectAsState()
için ek bağımlılık gerekmez.Observable.subscribeAsState()
,androidx.compose.runtime:runtime-rxjava2:$composeVersion
veyaandroidx.compose.runtime:runtime-rxjava3:$composeVersion
yapısına dahil edilmelidir.
Bu yapılar dinleyici olarak kaydedilir ve değerleri State
olarak gösterir. Yeni bir değer yayınlandığında Compose, kullanıcı arayüzünün söz konusu state.value
değerinin kullanıldığı bölümlerini yeniden oluşturur. Örneğin, bu kodda ShowData
, her yeni değer yayınlandığında yeniden oluşturulur.exampleLiveData
// import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun MyScreen( viewModel: MyViewModel = viewModel() ) { val dataExample = viewModel.exampleLiveData.observeAsState() // Because the state is read here, // MyScreen recomposes whenever dataExample changes. dataExample.value?.let { ShowData(dataExample) } }
Compose'da eşzamansız işlemler
Jetpack Compose, composable'larınızda coroutine'leri kullanarak eşzamansız işlemler yürütmenize olanak tanır.
Daha fazla bilgi için yan etkilerle ilgili dokümanlardaki LaunchedEffect
, produceState
ve rememberCoroutineScope
API'lerine bakın.
Navigasyon
Navigation bileşeni, Jetpack Compose uygulamaları için destek sağlar. Daha fazla bilgi için Compose ile gezinme ve Jetpack Navigation'ı Navigation Compose'a taşıma başlıklı makaleleri inceleyin.
Hilt
Hilt, Android uygulamalarında bağımlılık ekleme için önerilen çözümdür ve Compose ile sorunsuz şekilde çalışır.
ViewModel bölümünde bahsedilen viewModel()
işlevi, Hilt'in @HiltViewModel
ek açıklamasıyla oluşturduğu ViewModel'i otomatik olarak kullanır. Hilt'in ViewModel entegrasyonu hakkında bilgi içeren dokümanlar hazırladık.
@HiltViewModel class MyViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { /* ... */ } // import androidx.lifecycle.viewmodel.compose.viewModel @Composable fun MyScreen( viewModel: MyViewModel = viewModel() ) { /* ... */ }
Hilt ve Navigation
Hilt, Navigation Compose kitaplığıyla da entegre olur. Gradle dosyanıza aşağıdaki ek bağımlılıkları ekleyin:
Groovy
dependencies { implementation 'androidx.hilt:hilt-navigation-compose:1.2.0' }
Kotlin
dependencies { implementation("androidx.hilt:hilt-navigation-compose:1.2.0") }
Navigation Compose'u kullanırken hiltViewModel
composable
işlevini kullanarak her zaman @HiltViewModel
ek açıklamalı ViewModel
öğenizin bir örneğini alın.
Bu özellik, @AndroidEntryPoint
ile açıklama eklenmiş parçalar veya etkinliklerle çalışır.
Örneğin, ExampleScreen
bir gezinme grafiğindeki hedefse aşağıdaki kod snippet'inde gösterildiği gibi, hedefe kapsamlı bir ExampleViewModel
örneği almak için hiltViewModel()
işlevini çağırın:
// import androidx.hilt.navigation.compose.hiltViewModel @Composable fun MyApp() { val navController = rememberNavController() val startRoute = "example" NavHost(navController, startDestination = startRoute) { composable("example") { backStackEntry -> // Creates a ViewModel from the current BackStackEntry // Available in the androidx.hilt:hilt-navigation-compose artifact val viewModel = hiltViewModel<MyViewModel>() MyScreen(viewModel) } /* ... */ } }
Bunun yerine ViewModel
kapsamlı bir gezinme rotası veya gezinme grafiği örneğini almanız gerekiyorsa hiltViewModel
composable işlevini kullanın ve ilgili backStackEntry
öğesini parametre olarak iletin:
// import androidx.hilt.navigation.compose.hiltViewModel // import androidx.navigation.compose.getBackStackEntry @Composable fun MyApp() { val navController = rememberNavController() val startRoute = "example" val innerStartRoute = "exampleWithRoute" NavHost(navController, startDestination = startRoute) { navigation(startDestination = innerStartRoute, route = "Parent") { // ... composable("exampleWithRoute") { backStackEntry -> val parentEntry = remember(backStackEntry) { navController.getBackStackEntry("Parent") } val parentViewModel = hiltViewModel<ParentViewModel>(parentEntry) ExampleWithRouteScreen(parentViewModel) } } } }
Sayfalama
Paging kitaplığı, verileri kademeli olarak yüklemenizi kolaylaştırır ve Compose'da desteklenir.
Paging sürüm sayfasında, projeye eklenmesi gereken paging-compose
bağımlılığı ve sürümü hakkında bilgiler yer alır.
Paging kitaplığının Compose API'leri örneğini aşağıda bulabilirsiniz:
@Composable fun MyScreen(flow: Flow<PagingData<String>>) { val lazyPagingItems = flow.collectAsLazyPagingItems() LazyColumn { items( lazyPagingItems.itemCount, key = lazyPagingItems.itemKey { it } ) { index -> val item = lazyPagingItems[index] Text("Item is $item") } } }
Compose'da sayfalama özelliğini kullanma hakkında daha fazla bilgi için Listeler ve ızgaralar dokümanlarına göz atın.
Haritalar
Uygulamanızda Google Haritalar'ı sağlamak için Maps Compose kitaplığını kullanabilirsiniz. Kullanım örneğini aşağıda bulabilirsiniz:
@Composable fun MapsExample() { val singapore = LatLng(1.35, 103.87) val cameraPositionState = rememberCameraPositionState { position = CameraPosition.fromLatLngZoom(singapore, 10f) } GoogleMap( modifier = Modifier.fillMaxSize(), cameraPositionState = cameraPositionState ) { Marker( state = remember { MarkerState(position = singapore) }, title = "Singapore", snippet = "Marker in Singapore" ) } }
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- Oluşturma'daki yan etkiler
- State ve Jetpack Compose
- Compose'da kullanıcı arayüzü durumunu kaydetme