Oluştur'da favori kitaplıklarınızı kullanabilirsiniz. Bu bölümde, en kullanışlı kitaplıklardan birkaçını nasıl dahil edebileceğiniz açıklanmaktadır.
Etkinlik
Bir etkinlikte Oluştur'u kullanmak için Activity
alt sınıfı olan ComponentActivity
'u kullanmanız gerekir. Bu sınıf, Oluştur 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 sağlar.
Activity Compose, bu API'leri composable'lara maruz bırakır. Böylece, composable'larınızın dışındaki yöntemleri geçersiz kılmanıza veya açık bir Activity
örneği almanıza gerek kalmaz.
Ayrıca bu API'ler, yalnızca bir kez başlatılmalarını, yeniden derlemeden sağ çıkmalarını ve bileşen kompozisyondan kaldırılırsa düzgün şekilde temizlenmelerini sağlar.
Etkinlik Sonucu
rememberLauncherForActivityResult()
API, aşağıdakiler gibi bir bileşeninizde 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 dokunduğunuzda istek başlatılır. Kullanıcı bir resim seçip başlatma etkinliğine geri döndüğünde, rememberLauncherForActivityResult()
için sondaki lambda çağrılır.
Bu işlem, Coil'in rememberImagePainter()
işlevi kullanılarak seçili resmi yükler.
ActivityResultContract
sınıfının herhangi bir alt sınıfı, rememberLauncherForActivityResult()
işlevinin ilk bağımsız değişkeni olarak kullanılabilir.
Bu, bu tekniği çerçeveden ve diğer yaygın kalıplardan içerik istemek için kullanabileceğiniz anlamına gelir. Kendi özel sözleşmelerinizi oluşturabilir ve bu teknikle kullanabilirsiniz.
Çalışma zamanı izinleri isteme
Yukarıda açıklanan Activity Result API'si ve rememberLauncherForActivityResult()
, tek bir izin için RequestPermission
sözleşmesini veya birden fazla izin için RequestMultiplePermissions
sözleşmeyi kullanarak çalışma zamanında istenen izinleri istemek amacıyla kullanılabilir.
Eşlik Eden İzinleri kitaplığı, izinlerin mevcut izin verilen durumunu, Oluşturma kullanıcı arayüzünüzün kullanabileceği durumla eşlemek için bu API'lerin bir katmanı olarak da kullanılabilir.
Sistem geri düğmesini kullanma
Özel geri gezinme sağlamak ve sistem geri düğmesinin varsayılan davranışını composable'ınızdan geçersiz kılmak için composable'ınız bu etkinliğe müdahale etmek üzere bir BackHandler
kullanabilir:
var backHandlingEnabled by remember { mutableStateOf(true) } BackHandler(backHandlingEnabled) { // Handle back press }
İlk bağımsız değişken, BackHandler
değerinin şu anda etkin olup olmadığını kontrol eder. Bu bağımsız değişkeni, bileşeninizin durumuna bağlı olarak işleyicinizi geçici olarak devre dışı bırakmak için kullanabilirsiniz. Kullanıcı bir sistem geri etkinliği tetiklerse ve BackHandler
şu anda etkinse son lambda çağrılır.
ViewModel
Architecture Components ViewModel kitaplığını kullanıyorsanız viewModel()
işlevini çağırarak herhangi bir bileşenden ViewModel
'a 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
döndürür veya yeni bir tane oluşturur. Varsayılan olarak, döndürülen ViewModel
, kapsayıcı etkinlik, parça veya gezinme hedefi kapsamına alınır ve kapsam etkin olduğu sürece saklanır.
Örneğin, composable bir etkinlikte kullanılırsa viewModel()
, etkinlik bitene 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üzeyinde bileşenlerde, yani bir etkinlikten, parçadan veya gezinme grafiğinin hedefinden çağrılan bir kök bileşene yakın bir yerde erişirsiniz. Bunun nedeni, ViewModel
'lerin varsayılan olarak bu ekran düzeyindeki nesnelerle kapsamlı olmasıdır. ViewModel
'nin yaşam döngüsü ve kapsamı hakkında daha fazla bilgiyi burada bulabilirsiniz.
ViewModel
örneklerini diğer bileşenlere aktarmaktan kaçının. Aksi takdirde, bu bileşenlerin test edilmesi daha zor hale gelebilir ve önizlemeler bozulabilir. Bunun yerine, yalnızca ihtiyaç duydukları verileri
ve işlevleri parametre olarak iletin.
Alt ekran düzeyindeki bileşenlerin durumunu yönetmek için ViewModel
örneklerini kullanabilir ancak ViewModel
'nin yaşam döngüsü ve kapsamına dikkat edin. Kompozit bağımsızsa üst kompozitlerden bağımlılık aktarmak zorunda kalmamak için ViewModel
'yi eklemek üzere Hilt'i kullanmayı düşünebilirsiniz.
ViewModel
öğenizde bağımlılıklar varsa viewModel()
parametre olarak isteğe bağlı bir ViewModelProvider.Factory
alır.
Compose'da ViewModel
ve örneklerin Gezinme Oluşturma kitaplığı veya etkinlikler ve parçalarla nasıl kullanıldığı hakkında daha fazla bilgi için Birlikte çalışabilirlik belgelerine bakın.
Veri akışları
Oluştur, Android'in en popüler akış tabanlı çözümleri için uzantılarla birlikte gelir. Bu uzantıların her biri farklı bir yapı tarafından sağlanır:
LiveData.observeAsState()
,androidx.compose.runtime:runtime-livedata:$composeVersion
yapısını içerir.Flow.collectAsState()
için ek bağımlılık gerekmez.androidx.compose.runtime:runtime-rxjava2:$composeVersion
veyaandroidx.compose.runtime:runtime-rxjava3:$composeVersion
yapılarına dahil edilenObservable.subscribeAsState()
.
Bu yapı taşları bir dinleyici olarak kaydedilir ve değerleri State
olarak temsil eder. Yeni bir değer her oluşturulduğunda, Compose, kullanıcı arayüzünün state.value
değerinin kullanıldığı bölümlerini yeniden oluşturur. Örneğin, bu kodda ShowData
, exampleLiveData
her yeni değer gönderdiğinde yeniden oluşturulur.
// 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) } }
Oluşturma'daki eşzamansız işlemler
Jetpack Compose, composable'larınızdaki eş yordamlar kullanarak eşzamansız işlemler gerçekleştirmenizi sağlar.
Daha fazla bilgi için yan etki dokümanlarındaki LaunchedEffect
, produceState
ve rememberCoroutineScope
API'lerine bakın.
Navigasyon
Gezinme 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 bir ş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 sağladı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() ) { /* ... */ }
Çıkıntı ve Gezinme
Hilt, Gezinme Oluşturma Kitaplığı 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") }
Gezinme Oluşturma'yı kullanırken, @HiltViewModel
ek açıklamalı ViewModel
öğenizin bir örneğini almak için daima hiltViewModel
composable işlevini kullanın.
Bu, @AndroidEntryPoint
ile ek açıklama eklenmiş parçalar veya etkinliklerde çalışır.
Örneğin, ExampleScreen
bir gezinme grafiğindeki bir hedefse aşağıdaki kod snippet'inde gösterildiği gibi hedefe özel bir ExampleViewModel
örneği almak için hiltViewModel()
'i ç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 gezinme rotalarına veya gezinme grafiğine odaklanan bir ViewModel
örneğini almanız gerekiyorsa hiltViewModel
composable işlevini kullanın ve karşılık gelen 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) } } } }
Sayfa ayırma
Çağrı kitaplığı, verileri kademeli olarak yüklemenizi kolaylaştırır ve Compose'da desteklenir.
Sayfa yayınlama sayfası, projeye eklenmesi gereken paging-compose
bağımlılığı ve sürümü hakkında bilgi içerir.
Sayfalama kitaplığının Oluşturma 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") } } }
Oluşturma'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'ı sunmak için Haritalar Oluşturma kitaplığını kullanabilirsiniz. Aşağıda bir kullanım örneği verilmiştir:
@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 bölümündeki yan etkiler
- State ve Jetpack Compose
- Oluştur'da kullanıcı arayüzü durumunu kaydetme